① 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 讀取大文件有什麼可以優化的嗎
內存硬碟可以極大地提高文件的讀寫速度,行情的讀寫是應用內存硬碟的絕好情況:
1,可以把行情小站的行情文件地址配置在內存硬碟上。這樣可以加速行情小站寫文件的速度。
2,本系統再從內存硬碟讀取,又可以加快讀取速度。
3,內存硬碟掉電後會丟失文件,這里基本不在乎這個缺點,因為行情文件本來就是臨時的,如果有持久化的需要,大部分內存硬碟也支持持久化的功能。
由於行情小站會不斷的更新行情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 中。