<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    Scala中的IO操作及ArrayBuffer線程安全問題

    VSole2022-07-31 10:07:22

    通過Scala對文件進行讀寫操作在實際業務中應用也比較多,這里介紹幾種常用的方式,直接上代碼:

    1.從文件中讀取內容

    object Main {
      
      def loadData(): Array[String] = {
        var bs: BufferedSource = null
        var in: InputStream = null
        try {
          in = Main.getClass.getClassLoader.getResourceAsStream("data.txt")
          if (in == null) {
            in = new FileInputStream(new File("data.txt"))
          }
          bs = new BufferedSource(in)
          bs.getLines().toArray
        } finally {
          bs.close()
        }
      }
      
      //直接通過scala.io.Source進行讀取
      def testSource(): Unit = {
        Source.fromFile("data.txt").foreach(println)
      }
    }
    

    2.向文件中寫內容

    def write(): Unit ={
         //調用的就是java中的io類
        val writer = new PrintWriter(new File("write.txt" ))
        writer.write("scala write")
        writer.close()
    }
    

    除了讀寫方式,也可以從上面的“屏幕處理”上讀取用戶輸入的指令來程序:

    import scala.io. StdIn
    def printIn(): Unit = {
        print("please enter number :")
        val line = StdIn.readLine()
        println(s"number is : $line")
    }
    

    相信使用 Scala 進行應用開發時,ArrayBuffer 使用該問題。但是ArrayBuffer 進行添加元素時,使用方法:+=。方法是線程安全的,如果在多線程環境中使用該方法,例如,很容索引報越界異常。

    模擬多向異向定義的ArrayBuffer中插入100個元素:

    def arrBuffer(): Unit = {
       //默認初始容量為16
       val arrayBuffer = new ArrayBuffer[Int]()
       val executors = Executors.newFixedThreadPool(100)
       for (i <- 1 to 100) {
         executors.execute(new Runnable {
           override def run(): Unit = {
             arrayBuffer += i
           }
         })
       }
       executors.shutdown()
     }
    

    執行上述程序,報出類似以下的索引越界問題:

    java.lang.ArrayIndexOutOfBoundsException: 32
        at scala.collection.mutable.ArrayBuffer.$plus$eq(ArrayBuffer.scala:85)
        at Main$$anonfun$main$1$$anon$1.run(Main.scala:24)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
    

    再來看看ArrayBuffer的+=實現源碼:

    //初始容量
    protected def initialSize: Int = 16
    //array默認長度為16
    protected var array: Array[AnyRef] = new Array[AnyRef](math.max(initialSize, 1))
    //元素個數,默認0
    protected var size0: Int = 0
      
    def +=(elem: A): this.type = {
        ensureSize(size0 + 1)
        array(size0) = elem.asInstanceOf[AnyRef]
        size0 += 1
        this
    }
    

    val arrayBuffer = new ArrayBuffer[Int](初始容量為16),索引容量情況:下當array長度為1,但大小0已經大于16,并且array沒有及時擴展時,會報越界。

    所以,在方法環境下,要注意調用該線程時的安全問題,比如利用同步做鎖處理。

    這里只是以 ArrayBuffer 為例,對于 Scala 中其他的集合使用時也要注意,類似的防止出現的問題會影響程序的正常運行。

    arraybufferscala
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    通過Scala對文件進行讀寫操作在實際業務中應用也比較多,這里介紹幾種常用的方式,直接上代碼:1.從文件中讀取內容object Main {. 但是ArrayBuffer 進行添加元素時,使用方法:+=。= new ArrayBuffer[Int],索引容量情況:下當array長度為1,但大小0已經大于16,并且array沒有及時擴展時,會報越界。
    前言Scala是以JVM為運行環境的面向對象的函數式編程語言,它可以直接訪問Java類庫并且與Java框架進行交互操作。正如之前所介紹,Spark是用Scala語言編寫的,Kafka server端也是,那么深入學習Scala對掌握Spark、Kafka是必備掌握技能。
    Headless Chrome是谷歌Chrome瀏覽器的無界面模式,通過命令行方式打開網頁并渲染,常用于自動化測試、網站爬蟲、網站截圖、XSS檢測等場景。
    漏洞信息CVE-2021-26411 該漏洞存在于iexplore.exe mshtml.dll模塊,在JS9引擎處理dom對象時,由于未對nodevalue對象的有效性做判斷,所導致的UAF漏洞,該漏洞可實現RCE。
    Internet Explorer 11遠程執行代碼漏洞 在野外發現的Internet Explorer的最新零日攻擊利用了舊版JavaScript引擎中的漏洞CVE-2020-0674,CVE-2019-1429,CVE-2019-0676和CVE-2018-8653。相比之下,CVE-2020-1380是中...
    CVE-2021-38001漏洞利用
    2022-09-18 17:13:26
    漏洞利用運行后可以看出,evil 變量被當作一個整數直接打印了,這意味著 evil 似乎變成了一個指針,能夠指向任意一個對象了:DebugPrint: Smi: 0x20202021 . 但目前我們還需要有辦法泄露地址,從可能讓 evil 指向一個合適的目標,顯然,我們目前缺少能夠泄露地址的手段,但回顧其上一章曾說過的,v8 對存儲的地址進行了壓縮,只保留了低 32 字節,那么實際情況會是什么樣的呢?
    強網杯-WriteUp
    2022-08-02 08:02:30
    然后使用 admin/123登錄管理員賬戶即可,登錄后存在購買頁面,經過測試,使用如下 payload 可以繞過檢查,再訪問主頁面即可獲得 flag
    由此可以推測,之前找到的main.node,可能就是解密模塊。此時找到了AES的算法常量,前兩個是重復的,可能是插件問題。只能去問度娘了,搜索一下AES加密解密原理與 C 實現代碼。
    在上周末的深育杯線上賽中,遇到了一個挺有意思的題目,叫 HelloJerry,考察的是 JerryScript 引擎的漏洞利用。
    跟隨P4nda大佬的博客復現了CVE-2018-17463,在一些大佬懶得講的地方加了一些理解和解釋,比較新手向。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类