日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

fileinputstream resources 读取文件_压缩20M文件从30秒到1秒,包教包会

發布時間:2025/3/19 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 fileinputstream resources 读取文件_压缩20M文件从30秒到1秒,包教包会 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
作者:不學無數的程序員鏈接:https://www.jianshu.com/p/25b328753017

壓縮20M文件從30秒到1秒的優化過程

有一個需求需要將前端傳過來的10張照片,然后后端進行處理以后壓縮成一個壓縮包通過網絡流傳輸出去。之前沒有接觸過用Java壓縮文件的,所以就直接上網找了一個例子改了一下用了,改完以后也能使用,但是隨著前端所傳圖片的大小越來越大的時候,耗費的時間也在急劇增加,最后測了一下壓縮20M的文件竟然需要30秒的時間。壓縮文件的代碼如下。

這里找了一張2M大小的圖片,并且循環十次進行測試。打印的結果如下,時間大概是30秒。

第一次優化過程-從30秒到2秒

進行優化首先想到的是利用緩沖區**BufferInputStream。在FileInputStreamread()**方法每次只讀取一個字節。源碼中也有說明。

這是一個調用本地方法與原生操作系統進行交互,從磁盤中讀取數據。每讀取一個字節的數據就調用一次本地方法與操作系統交互,是非常耗時的。例如我們現在有30000個字節的數據,如果使用FileInputStream那么就需要調用30000次的本地方法來獲取這些數據,而如果使用緩沖區的話(這里假設初始的緩沖區大小足夠放下30000字節的數據)那么只需要調用一次就行。因為緩沖區在第一次調用read()方法的時候會直接從磁盤中將數據直接讀取到內存中。隨后再一個字節一個字節的慢慢返回。

BufferedInputStream內部封裝了一個byte數組用于存放數據,默認大小是8192

優化過后的代碼如下

輸出

可以看到相比較于第一次使用FileInputStream效率已經提升了許多了

第二次優化過程-從2秒到1秒

使用緩沖區buffer的話已經是滿足了我的需求了,但是秉著學以致用的想法,就想著用NIO中知識進行優化一下。

使用Channel

為什么要用Channel呢?因為在NIO中新出了ChannelByteBuffer。正是因為它們的結構更加符合操作系統執行I/O的方式,所以其速度相比較于傳統IO而言速度有了顯著的提高。Channel就像一個包含著煤礦的礦藏,而ByteBuffer則是派送到礦藏的卡車。也就是說我們與數據的交互都是與ByteBuffer的交互。

在NIO中能夠產生FileChannel的有三個類。分別是FileInputStreamFileOutputStream、以及既能讀又能寫的RandomAccessFile

源碼如下

我們可以看到這里并沒有使用ByteBuffer進行數據傳輸,而是使用了transferTo的方法。這個方法是將兩個通道進行直連。

這是源碼上的描述文字,大概意思就是使用transferTo的效率比循環一個Channel讀取出來然后再循環寫入另一個Channel好。操作系統能夠直接傳輸字節從文件系統緩存到目標的Channel中,而不需要實際的copy階段。

copy階段就是從內核空間轉到用戶空間的一個過程

可以看到速度相比較使用緩沖區已經有了一些的提高。

內核空間和用戶空間

那么為什么從內核空間轉向用戶空間這段過程會慢呢?首先我們需了解的是什么是內核空間和用戶空間。在常用的操作系統中為了保護系統中的核心資源,于是將系統設計為四個區域,越往里權限越大,所以Ring0被稱之為內核空間,用來訪問一些關鍵性的資源。Ring3被稱之為用戶空間。

用戶態、內核態:線程處于內核空間稱之為內核態,線程處于用戶空間屬于用戶態

那么我們如果此時應用程序(應用程序是都屬于用戶態的)需要訪問核心資源怎么辦呢?那就需要調用內核中所暴露出的接口用以調用,稱之為系統調用。例如此時我們應用程序需要訪問磁盤上的文件。此時應用程序就會調用系統調用的接口open方法,然后內核去訪問磁盤中的文件,將文件內容返回給應用程序。大致的流程如下

直接緩沖區和非直接緩沖區

既然我們要讀取一個磁盤的文件,要廢這么大的周折。有沒有什么簡單的方法能夠使我們的應用直接操作磁盤文件,不需要內核進行中轉呢?有,那就是建立直接緩沖區了。

非直接緩沖區:非直接緩沖區就是我們上面所講內核態作為中間人,每次都需要內核在中間作為中轉。

直接緩沖區:直接緩沖區不需要內核空間作為中轉copy數據,而是直接在物理內存申請一塊空間,這塊空間映射到內核地址空間和用戶地址空間,應用程序與磁盤之間數據的存取通過這塊直接申請的物理內存進行交互。

既然直接緩沖區那么快,我們為什么不都用直接緩沖區呢?其實直接緩沖區有以下的缺點。直接緩沖區的缺點:

  • 不安全
  • 消耗更多,因為它不是在JVM中直接開辟空間。這部分內存的回收只能依賴于垃圾回收機制,垃圾什么時候回收不受我們控制。
  • 數據寫入物理內存緩沖區中,程序就喪失了對這些數據的管理,即什么時候這些數據被最終寫入從磁盤只能由操作系統來決定,應用程序無法再干涉。
  • 綜上所述,所以我們使用transferTo方法就是直接開辟了一段直接緩沖區。所以性能相比而言提高了許多

    使用內存映射文件

    NIO中新出的另一個特性就是內存映射文件,內存映射文件為什么速度快呢?其實原因和上面所講的一樣,也是在內存中開辟了一段直接緩沖區。與數據直接作交互。源碼如下

    打印如下

    可以看到速度和使用Channel的速度差不多的。

    使用Pipe

    Java NIO 管道是2個線程之間的單向數據連接。Pipe有一個source通道和一個sink通道。其中source通道用于讀取數據,sink通道用于寫入數據。可以看到源碼中的介紹,大概意思就是寫入線程會阻塞至有讀線程從通道中讀取數據。如果沒有數據可讀,讀線程也會阻塞至寫線程寫入數據。直至通道關閉。

    Whether or not a thread writing bytes to a pipe will block until another thread reads those bytes

    我想要的效果是這樣的。源碼如下:

    源碼地址https://github.com/modouxiansheng/Doraemon

    總結

    生活處處都需要學習,有時候只是一個簡單的優化,可以讓你深入學習到各種不同的知識。所以在學習中要不求甚解,不僅要知道這個知識也要了解為什么要這么做。

    總結

    以上是生活随笔為你收集整理的fileinputstream resources 读取文件_压缩20M文件从30秒到1秒,包教包会的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: av一二三四| 韩国性猛交╳xxx乱大交 | 日韩激情视频网站 | 四虎永久在线 | 欧美性生活一级 | 91l九色lporny| 亚洲专区在线视频 | 你懂的网站在线 | 人人爽夜夜爽 | 国产精品外围 | 一级视频在线观看 | 东北高大丰满bbbbzbbb | 人人看人人射 | 黄色理伦片 | 日本xxxx高清 | 在线免费视频观看 | 日韩一区二区精品视频 | 国产精品久久久久久免费免熟 | 国产视频一区二区三 | 91视频免费视频 | 红桃视频隐藏入口 | 亚洲欧美va天堂人熟伦 | 国产aⅴ片 | 初尝人妻少妇中文字幕 | 蜜桃传媒一区二区亚洲 | 免费看欧美成人a片无码 | 蜜臀久久99精品久久久 | 精品一区在线视频 | 亚洲免费天堂 | 欧美日韩一区三区 | 91久久久久国产一区二区 | 日韩性插 | 狂野欧美性猛交xxⅹ李丽珍 | 78日本xxxxxxxxx59| 精品欧美久久 | 手机在线观看免费av | 超碰成人在线观看 | 麻豆高清视频 | 国产免费网址 | av加勒比在线 | 性色视频在线观看 | 九九热在线视频播放 | 国产精品亚洲一区二区无码 | 清纯唯美亚洲激情 | 啪啪网站免费 | 免费在线中文字幕 | 成人欧美一区二区三区黑人一 | 男女吻胸做爰摸下身 | 在线www | 制服丝袜第二页 | 免费看的黄色 | 亚洲黄色视屏 | 色婷婷av一区二区三区麻豆综合 | 无码人妻丰满熟妇精品 | 国产精品自拍网 | 狠狠噜噜 | 91片黄在线观 | 亚洲最大av网站 | 91精品综合久久久久久 | 九九九热视频 | 久久午夜网| 亚洲乱码精品 | 日本一级三级三级三级 | 久久99精品久久久久久国产越南 | 国产午夜精品在线观看 | 91免费 看片 | 亚洲精品乱码久久久久久写真 | 在线观看一区二区视频 | 国产美女流白浆 | 麻豆福利在线观看 | 69亚洲| 欧美在线不卡视频 | 色七七在线| 一区二区网 | v片在线看 | 国产51精品 | 日本一级三级三级三级 | 波多野结衣在线视频播放 | av免费的| 99精品毛片 | av三级在线播放 | 国产夫绿帽单男3p精品视频 | 日本啪啪片 | 美女搡bbb又爽又猛又黄www | 日日躁狠狠躁 | wwwav在线| 少妇久久久久久被弄高潮 | 热久久久久 | 亚洲一久久 | 视频一区二区三区四区五区 | 色先锋资源网 | 亚洲av高清一区二区三区 | 最新av导航 | 欧美激情 国产精品 | 久草欧美 | 欧美激情成人在线 | 亚洲黄色在线播放 | 99精品国产成人一区二区 | а√天堂8资源中文在线 |