我在JAVA中读取更大的文件时遇到问题。我以前读过的文件大小为 750MB 所以当我以前用 BufferedReader ,扫描仪和 LineNumberReader读取文件时都无法阅读并导致 OutOfMemoryError 。
有没有简单的方法来阅读更大的文件?是否有任何方法可以跳过一些行并在跳过行后读取特定的行。
我用来读取文件的代码:
FileInputStream inputStream = null;
Scanner sc = null;
try
{
inputStream = new FileInputStream(path);
sc = new Scanner(inputStream, "UTF-8");
while (sc.hasNextLine())
{
String line = sc.nextLine();
}
if (sc.ioException() != null)
{
throw sc.ioException();
}
}
finally
{
inputStream.close();
sc.close();
}
例如:
如果我想从 1001到2000 读取多行,我怎样才能从那个更大尺寸的文件中读取这些特定的行。
提前致谢。
答案 0 :(得分:0)
问题是知道一条线的终点。如果不查看该文件,这根本不可能。没有此类功能可让您阅读特定行号。如果您询问了某个字节位置,则答案为java.io.RandomAccessFile
。
所以你有两个选择:
编辑:第二个选项要求文件不包含空行。在这种情况下,lookup-array也会触发 OutOfMemoryError 。每个java int需要4个字节。如果我们假设写入文件的换行符至少需要1个字节,则因子为4.因此,当索引750 MB大文件时,该阵列至少需要4 * 750 MB = 3 GB。因此,您必须使用命令行选项-Xmx扩展JVM堆。
第二次编辑:如上所述piet.t,如果文件只包含一行,则还必须使用命令行选项-Xmx扩大JVM堆。