3 回答

TA貢獻1811條經驗 獲得超5個贊
java提供了搞笑讀取文件的方式:文件流,下面以FileInputStream和Apache Commons IO流兩種讀取方式來詳細講解:
以下兩種代碼均是讀取一個大約1G的文件:
1、文件流
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內存)
2、Apache Commons IO流
同樣也可以使用Commons IO庫實現(xiàn),利用該庫提供的自定義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內存)

TA貢獻1865條經驗 獲得超7個贊
如果你想讀取文本內容,你應該使用InputStreamReader這個類,使用這個類并且指定文本內容的字符集,就可以讀出正確的內容。
InputStream這個類是用來讀取二進制字節(jié)的,比如做文件復制的時候,應該是用InputStream這個類。
不管是InputStreamReader還是InputStream,都可以聲明臨時緩沖數(shù)組,不同的是InputStreamReader聲明的數(shù)組是:char[] cs = new char[1024]
而InputStream聲明的數(shù)組是:byte[] bs = new byte[1024]

TA貢獻1725條經驗 獲得超8個贊
讀取文件行的標準方式是在內存中讀取,Guava 和Apache Commons IO都提供了如下所示快速讀取文件行的方法:
Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path));
這種方法帶來的問題是文件的所有行都被存放在內存中,當文件足夠大時很快就會導致程序拋出OutOfMemoryError 異常。
添加回答
舉報