Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java文件IO在使用BufferedInputStream读取大文件时被截断_Java_File_File Io_Bigdata - Fatal编程技术网

Java文件IO在使用BufferedInputStream读取大文件时被截断

Java文件IO在使用BufferedInputStream读取大文件时被截断,java,file,file-io,bigdata,Java,File,File Io,Bigdata,我有一个函数,其中只给我一个BufferedInputStream,没有关于要读取的文件的其他信息。不幸的是,我无法更改方法定义,因为它是由我无权访问的代码调用的。我一直在使用下面的代码读取文件并将其内容放入字符串中: public String[] doImport(BufferedInputStream stream) throws IOException, PersistenceException { int bytesAvail = stream.available();

我有一个函数,其中只给我一个BufferedInputStream,没有关于要读取的文件的其他信息。不幸的是,我无法更改方法定义,因为它是由我无权访问的代码调用的。我一直在使用下面的代码读取文件并将其内容放入字符串中:

public String[] doImport(BufferedInputStream stream) throws IOException, PersistenceException {
    int bytesAvail = stream.available();
    byte[] bytesRead = new byte[bytesAvail];
    stream.read(bytesRead);
    stream.close();
    String fileContents = new String(bytesRead);
    //more code here working with fileContents
}

我的问题是,对于大文件(>2Gb),此代码会导致程序运行极慢或截断数据,具体取决于执行程序的计算机。是否有人建议在这种情况下如何处理大型文件?

您假设
available()
返回文件的大小;事实并非如此。它返回可读取的字节数,可以是小于或等于文件大小的任何数字


不幸的是,如果没有关于文件数据长度的其他信息源(即,通过调用
java.io.file.length()
),就无法一次完成所需的操作。相反,您可能需要从多次读取中累积。一种方法是使用
ByteArrayOutputStream
。读入一个固定的、有限大小的数组,然后将读入的数据写入一个
ByteArrayOutputStream
。最后,拉出字节数组。您需要使用
read()
write()
这三种参数形式,并查看
read()
的返回值,这样您就可以准确地知道每次调用时缓冲区中读取了多少字节。

我不确定您为什么认为无法逐行读取它
BufferedInputStream
仅描述如何访问底层流,它没有对最终如何从其中读取数据施加任何限制。您可以像使用任何其他
InputStream
一样使用它

也就是说,你可以一行一行地读

InputStreamReader streamReader = new InputStreamReader(stream);
BufferedInputReader lineReader = new BufferedInputReader(streamReader);
String line = lineReader.readLine();
...

[编辑]此回答是针对问题的原始措辞,该问题专门要求一种逐行阅读输入文件的方法。

我不确定“你为什么认为”每个文件都有行。他们没有。也很难理解为什么您认为每个文件都有字符。他们没有。从一个文件中读取一行数据,而这个数据可能有一行,也可能没有一行,或者多行,并不能解决实际问题-1.原问题已予修改。最初,海报表明他们更喜欢逐行读取文件,因此我假设输入是一个带换行符的字符流。