導航:首頁 > 編程語言 > java讀取大文件內容

java讀取大文件內容

發布時間:2022-05-29 07:10:05

java中如何高效的讀取大文件

讀取文件行的標准方式是在內存中讀取,Guava 和Apache Commons IO都提供了如下所示快速讀取文件行的方法:

Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path));
這種方法帶來的問題是文件的所有行都被存放在內存中,當文件足夠大時很快就會導致程序拋出OutOfMemoryError 異常。

② 如何提高java讀取大文本文件的效率

JavaNIO的創建目的是為了讓Java程序員可以實現高速I/O而無需編寫自定義的本機代碼。JavaNIO的高效得益於其兩大"助手":Channel和Buffer。NIO將最耗時的I/O操作(即填充和提取緩沖區)轉移回操作系統,因而可以極大地提高速度。

③ java 如何讀取大文件

以下將從常規方法談起,通過對比來說明應該如何使用java讀取大文件。

1、常規:在內存中讀取
讀取文件行的標准方式是在內存中讀取,Guava 和Apache Commons IO都提供了如下所示快速讀取文件行的方法:
Files.readLines(new File(path), Charsets.UTF_8);
FileUtils.readLines(new File(path));
這種方法帶來的問題是文件的所有行都被存放在內存中,當文件足夠大時很快就會導致程序拋出OutOfMemoryError 異常。
例如:讀取一個大約1G的文件:
@Test
public void givenUsingGuava_whenIteratingAFile_thenWorks() throws IOException {
String path = ...
Files.readLines(new File(path), Charsets.UTF_8);
}
這種方式開始時只佔用很少的內存:(大約消耗了0Mb內存)
然而,當文件全部讀到內存中後,我們最後可以看到(大約消耗了2GB內存):
這意味這一過程大約耗費了2.1GB的內存——原因很簡單:現在文件的所有行都被存儲在內存中。
把文件所有的內容都放在內存中很快會耗盡可用內存——不論實際可用內存有多大,這點是顯而易見的。
此外,我們通常不需要把文件的所有行一次性地放入內存中——相反,我們只需要遍歷文件的每一行,然後做相應的處理,處理完之後把它扔掉。所以,這正是我們將要做的——通過行迭代,而不是把所有行都放在內存中。

2、文件流
FileInputStream inputStream = null;
Scanner sc = null;
try {
inputStream = new FileInputStream(path);
sc = new Scanner(inputStream, "UTF-8");
while (sc.hasNextLine()) {
String line = sc.nextLine();
// System.out.println(line);
}
// note that Scanner suppresses exceptions
if (sc.ioException() != null) {
throw sc.ioException();
}
} finally {
if (inputStream != null) {
inputStream.close();
}
if (sc != null) {
sc.close();
}
}
這種方案將會遍歷文件中的所有行——允許對每一行進行處理,而不保持對它的引用。總之沒有把它們存放在內存中:(大約消耗了150MB內存)

3、Apache Commons IO流
同樣也可以使用Commons IO庫實現,利用該庫提供的自定義LineIterator:
LineIterator it = FileUtils.lineIterator(theFile, "UTF-8");
try {
while (it.hasNext()) {
String line = it.nextLine();
// do something with line
}
} finally {
LineIterator.closeQuietly(it);
}
由於整個文件不是全部存放在內存中,這也就導致相當保守的內存消耗:(大約消耗了150MB內存)

④ 如何利用Java高效讀取大文件,利用Java讀取文件

可以使用BufferedReader解決高效讀取大文件:

具體如下:

例如:BufferedReaderbr=newBufferedReader(newInputStreamReader(inputStream)

⑤ java如何讀取大容量的txt文件

java讀取txt文件內容。可以作如下理解:
首先獲得一個文件句柄。File file = new File(); file即為文件句柄。兩人之間連通電話網路了。接下來可以開始打電話了。
通過這條線路讀取甲方的信息:new FileInputStream(file) 目前這個信息已經讀進來內存當中了。接下來需要解讀成乙方可以理解的東西
既然你使用了FileInputStream()。那麼對應的需要使用InputStreamReader()這個方法進行解讀剛才裝進來內存當中的數據
解讀完成後要輸出呀。那當然要轉換成IO可以識別的數據呀。那就需要調用位元組碼讀取的方法BufferedReader()。同時使用bufferedReader()的readline()方法讀取txt文件中的每一行數據哈。

⑥ JAVA怎麼快速讀取一個大文件(1G多有500萬行)

java NIO除了非同步非阻塞特性外,另外一個重要特性就是文件讀取,原理是文件地址直接映射在線程內存,不要經過操作系統,可以大大提高響應速度。

下面是例子:
http://blog.csdn.net/chenleixing/article/details/44207469

⑦ Java 讀取大文件有什麼可以優化的嗎

優化一:採用內存硬碟(RamDisk)

內存硬碟可以極大地提高文件的讀寫速度,行情的讀寫是應用內存硬碟的絕好情況:

1,可以把行情小站的行情文件地址配置在內存硬碟上。這樣可以加速行情小站寫文件的速度。

2,本系統再從內存硬碟讀取,又可以加快讀取速度。

3,內存硬碟掉電後會丟失文件,這里基本不在乎這個缺點,因為行情文件本來就是臨時的,如果有持久化的需要,大部分內存硬碟也支持持久化的功能。

優化二:採用JNotify,用通知替代輪詢

由於行情小站會不斷的更新行情dbf文件,系統需要探測到一旦行情文件被更新,就立即讀取。傳統的策略是不斷輪詢行情文件的狀態,如果發現行情文件的最後修改日期(或者再加上文件大小)改變時,就認為文件被更新。但是這種方式既低效,時延又高且不穩定。假設即使把輪詢時間設置為10ms一次(這意味著1秒鍾就要輪詢100次), 平均時延也要5ms。

JNotify庫支持Windows,Linux和MacOS,允許監視一個文件夾,當這個文件夾下的文件被增刪改時,發起回調通知。代碼示例如下:

部署時,需要將本地庫放在執行根目錄下,或者用-Djava.library.path=/native/library/path指定本地庫的位置。

採用JNotify,用(基於操作系統的)通知而不是輪詢,可以非常快地發現文件被更新,根據測試時間<1ms (我覺得應該遠小於1ms,但是由於文件修改時間單位是毫秒,沒辦法更精確的測量)。

⑧ java 怎麼讀入大的文件內容

可考慮bufferedinputstream和bufferedoutputstream來位元組讀取,這個代碼太簡單了,適用於非頻繁操作。或採用nio的FileChannel,比較適合於高並發操作,如下為filechannel的部分代碼
File inFile = new File("D:\\error");
File outFile = new File("D:\\to.txt");

FileChannel inFileChannel = new FileInputStream(inFile).getChannel();
FileChannel outFileChannel = new FileOutputStream(outFile).getChannel();

ByteBuffer buffer = ByteBuffer.allocate(1024);
while(-1 != inFileChannel.read(buffer)){
buffer.flip();
outFileChannel.write(buffer);
buffer.clear();
}
outFileChannel.close();
inFileChannel.close();

⑨ java讀取一個10G大小的文本文件,怎麼才能快速的得到該文本文件裡面長度最長的單詞

沒辦法快速,無論如何,你10G 的內容必須得全部讀一遍。
常規的面試中這個涉及到內存的使用,只能使用遠遠低於數據大小的內存去完成任務。
如果是排序,需要分組,結果轉儲,然後歸並。
這里只要最長的一個,那就簡單多了。
定義一個變數放置最長的,逐行去讀文件,比變數長的就更新變數,讀完文件結果就出來了。

⑩ 如何利用Java高效讀取大文件

對文件建立 java.io.BufferedInputStream ,每次調用 read() 方法時會接連取出文件中長度為 arraySize 的數據到array 中。

閱讀全文

與java讀取大文件內容相關的資料

熱點內容
82一56的筒便演算法 瀏覽:404
數控機床fanuc編程 瀏覽:607
天刀mode不是內部或外部命令 瀏覽:854
長城c30壓縮機價格 瀏覽:1000
java打開圖片文件 瀏覽:409
跟程序員聊天聊到半夜 瀏覽:411
自己怎麼做app代碼 瀏覽:915
win7旗艦版進不去帶命令符 瀏覽:799
單片機溫度檢測電路 瀏覽:802
拼圖軟體不壓縮 瀏覽:656
紅袖添香小說源碼 瀏覽:624
erp加密工具在哪裡買 瀏覽:516
怎麼給qq群里的文件加密 瀏覽:762
androidsetbitmap 瀏覽:597
mt4反向編譯 瀏覽:201
sun伺服器命令 瀏覽:827
程序員同乘電梯 瀏覽:617
49乘以235的簡便演算法 瀏覽:673
新概念51單片機c語言教程光碟 瀏覽:262
伺服器分區如何選擇 瀏覽:354