A. 如何利用java高效讀取大文件

可以使用BufferedReader解決高效讀取大文件:
具體如下:

例如:BufferedReader br = new BufferedReader(newInputStreamReader(inputStream)

B. java中有沒有 讀取大文本文件(500MB以上),指定行數的某一行數據的類庫 有的話請給出教程,謝謝~

解決這種問題,
簡單說,設那個大文件為big.txt
寫一個程序生成一個big.idx數據文件,記錄big.txt每一行的結束位置+1,每個位置用long類型存儲。
比如得到數據內容(非文本):
[10][22][34][84] ....[2345312].....[50000000]
掃描一遍,生成這500MB的長度文件,比如有10萬行,這個big.idx文件就有800KB左右。
就根據big.idx可以查找指定行數了,比如查第1234行
已知一個long佔8個位元組,打開
第1234行的起始位置的存儲位置p=(1234-2)*8=9856
第1234行的長度len的位置lp=(1234-1)*8=9864
尋道big.idx的p處,在p處讀取一個long為pos
尋道big.idx的lp處,在p處讀取一個long為npos
pos中就記錄big.txt中第1234行的起始位置
該行長度len=npos-pos;
打開big.txt,查找pos位置,讀len個位元組,轉換成字元串,
就讀出了指定的1234行
把這個不大的big.idx的內容整理到內存中間,讀取速度更快。

引經據典說,以上屬於資料庫基礎的ISAM方法。

C. JAVA如何讀取大容量TXT文件

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

D. java怎樣讀取大文件

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

Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path));

這種方法帶來的問題是文件的所有行都被存放在內存中,當文件足夠大時很快就會導致程序拋出OutOfMemoryError 異常。
例如:讀取一個大約1G的文件:

@Testpublic void givenUsingGuava_whenIteratingAFile_thenWorks() throws IOException { String path = ... Files.readLines(new File(path), Charsets.UTF_8);}

這種方式開始時只佔用很少的內存:(大約消耗了0Mb內存)

[main] INFO org.baelng.java.CoreJavaIoUnitTest - Total Memory: 128 Mb[main] INFO org.baelng.java.CoreJavaIoUnitTest - Free Memory: 116 Mb

然而,當文件全部讀到內存中後,我們最後可以看到(大約消耗了2GB內存):

[main] INFO org.baelng.java.CoreJavaIoUnitTest - Total Memory: 2666 Mb[main] INFO org.baelng.java.CoreJavaIoUnitTest - Free Memory: 490 Mb

這意味這一過程大約耗費了2.1GB的內存——原因很簡單:現在文件的所有行都被存儲在內存中。
把文件所有的內容都放在內存中很快會耗盡可用內存——不論實際可用內存有多大,這點是顯而易見的。
此外,我們通常不需要把文件的所有行一次性地放入內存中——相反,我們只需要遍歷文件的每一行,然後做相應的處理,處理完之後把它扔掉。所以,這正是我們將要做的——通過行迭代,而不是把所有行都放在內存中。

E. java 讀取大容量文件,內存溢出怎麼分段讀取(按一定容量讀取)

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Scanner;

public class TestPrint {
public static void main(String[] args) throws IOException {
String path = "你要讀的文件的路徑";
RandomAccessFile br=new RandomAccessFile(path,"rw");//這里rw看你了。要是之都就只寫r
String str = null, app = null;
int i=0;
while ((str = br.readLine()) != null) {
i++;
app=app+str;
if(i>=100){//假設讀取100行
i=0;
// 這里你先對這100行操作,然後繼續讀
app=null;
}
}
br.close();
}

}

F. 怎樣使用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內存)

G. Java中如何高效的讀取大文件

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

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

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

package com.campu;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.Reader;

/**
* @author 碼農小江
* H20121012.java
* 2012-10-12下午11:40:21
*/
public class H20121012 {
/**
* 功能:Java讀取txt文件的內容
* 步驟:1:先獲得文件句柄
* 2:獲得文件句柄當做是輸入一個位元組碼流,需要對這個輸入流進行讀取
* 3:讀取到輸入流後,需要讀取生成位元組流
* 4:一行一行的輸出。readline()。
* 備註:需要考慮的是異常情況
* @param filePath
*/
public static void readTxtFile(String filePath){
try {
String encoding="GBK";
File file=new File(filePath);
if(file.isFile() && file.exists()){ //判斷文件是否存在
InputStreamReader read = new InputStreamReader(
new FileInputStream(file),encoding);//考慮到編碼格式
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt = null;
while((lineTxt = bufferedReader.readLine()) != null){
System.out.println(lineTxt);
}
read.close();
}else{
System.out.println("找不到指定的文件");
}
} catch (Exception e) {
System.out.println("讀取文件內容出錯");
e.printStackTrace();
}

}

public static void main(String argv[]){
String filePath = "L:\\Apache\\htdocs\\res\\20121012.txt";
// "res/";
readTxtFile(filePath);
}

}

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

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

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

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

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

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

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

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

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

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

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