Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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中使用缓冲读取器再次读取文件?_Java_Bufferedreader - Fatal编程技术网

如何在Java中使用缓冲读取器再次读取文件?

如何在Java中使用缓冲读取器再次读取文件?,java,bufferedreader,Java,Bufferedreader,我有一个Java代码,它使用缓冲区读取器读取输入文件,直到readLine方法返回null。我需要无限次地再次使用该文件的内容。我怎样才能从头再读取此文件

我有一个Java代码,它使用缓冲区读取器读取输入文件,直到readLine方法返回null。我需要无限次地再次使用该文件的内容。我怎样才能从头再读取此文件

如果您想这样做,您可能需要考虑一下。有了它,您可以显式地将位置设置回开头,然后从那里重新开始阅读。

我建议使用commons库


我认为有一种方法可以将文件读入byteArray,这可能是另一种方法

我建议使用commons库


我认为有一个调用,可以将文件读入byteArray,这可能是另一种方法

您可以关闭并重新打开它。另一种选择是:如果它不是太大,把它的内容放到一个列表中。

你可以关闭它,然后重新打开它。另一种选择:如果不是太大,将其内容放入列表中。

不确定您是否考虑了屏幕上的标记和重置方法


如果您的文件大小只有几MB,并且您可以在文件开头设置标记,并在到达文件末尾后继续重置,则可以选择此选项。另外,对同一文件的后续读取似乎将完全从缓冲区提供,而无需转到磁盘。

不确定您是否考虑了磁盘上的标记和重置方法


如果您的文件大小只有几MB,并且您可以在文件开头设置标记,并在到达文件末尾后继续重置,则可以选择此选项。同样,对同一文件的后续读取似乎将完全从缓冲区进行,而无需进入磁盘。

缓冲区读取器仅支持重置为缓冲数据的位置。但如果文件大于缓冲区,则无法转到文件的开头。 解决: 1.重新开放
2.使用RandomAccessFile

缓冲区读取器仅支持重置为缓冲数据的位置。但如果文件大于缓冲区,则无法转到文件的开头。 解决: 1.重新开放 2.使用RandomAccessFile

应使用一个读卡器读取文件一次。如果要再次读取该文件,请基于该文件创建一个新读取器

使用的IO实用程序,您可以创建一个很好的抽象,让您可以根据需要多次读取文件。这为您提供了一个可以通过随时调用getInput从中检索新读取器的方法

更好的是,番石榴有许多实用的方法,可以直接利用输入供应商。。。这使您不用担心自己关闭提供的读卡器。该类包含大多数与文本相关的IO实用程序。一个简单的例子:

public void doSomeStuff(InputSupplier<? extends Reader> readerSupplier) throws IOException {
  boolean needToDoMoreStuff = true;
  while (needToDoMoreStuff) {
    // this handles creating, reading, and closing the Reader!
    List<String> lines = CharStreams.readLines(readerSupplier);
    // do some stuff with the lines you read
  }
}
如果您想对每一行执行一些处理,而不首先将每一行读入内存,您也可以使用readLines重载,该重载会占用一个时间。

一个读卡器应该用于读取文件一次。如果要再次读取该文件,请基于该文件创建一个新读取器

使用的IO实用程序,您可以创建一个很好的抽象,让您可以根据需要多次读取文件。这为您提供了一个可以通过随时调用getInput从中检索新读取器的方法

更好的是,番石榴有许多实用的方法,可以直接利用输入供应商。。。这使您不用担心自己关闭提供的读卡器。该类包含大多数与文本相关的IO实用程序。一个简单的例子:

public void doSomeStuff(InputSupplier<? extends Reader> readerSupplier) throws IOException {
  boolean needToDoMoreStuff = true;
  while (needToDoMoreStuff) {
    // this handles creating, reading, and closing the Reader!
    List<String> lines = CharStreams.readLines(readerSupplier);
    // do some stuff with the lines you read
  }
}

如果您想对每一行进行一些处理,而不首先将每一行读取到内存中,您也可以使用readLines重载,该重载需要一个时间。

在检查是否不能读取更多行后,通过递归调用run函数来完成此操作-下面是一个示例

// Reload the file when you reach the end (i.e. when you can't read anymore strings)
  if ((sCurrentLine = br.readLine()) == null) {
    run();
  }

在检查是否不能读取更多的行之后,通过递归调用run函数来实现这一点——下面是一个示例

// Reload the file when you reach the end (i.e. when you can't read anymore strings)
  if ((sCurrentLine = br.readLine()) == null) {
    run();
  }

我也面临着同样的问题,并开始徘徊在这个问题上

一,。使用标记和重置方法:

BufferedReader可以使用FileReader和FileInputStream创建。FileReader不支持标记和重置方法。我尝试这样做时遇到了一个异常。甚至当我尝试使用FileInputStream时,我也没能做到,因为我的文件很大,我想即使是你的也是如此。如果文件长度大于缓冲区,则标记和重置方法对FileReader和FileInputStream都不起作用。更多关于这方面的信息,请访问@jtahlborn

二,。关闭并重新打开文件

当我关闭并重新打开文件并创建一个新的BufferedReader时,它工作得很好。
我想理想的方法是重新打开文件,并构造一个新的BufferedReader作为文件读取器,或者FileInputStream只应用于读取文件一次

我也面临同样的问题
try {
            BufferedReader br = new BufferedReader(new FileReader(input));

            while ((line = br.readLine()) != null)
            {
                //do somethng
            }
            br.close();
        }
        catch(IOException e)
        {
            System.err.println("Error: " + e.getMessage());

        }
}
然后开始徘徊在这个问题上

一,。使用标记和重置方法:

BufferedReader可以使用FileReader和FileInputStream创建。FileReader不支持标记和重置方法。我尝试这样做时遇到了一个异常。甚至当我尝试使用FileInputStream时,我也没能做到,因为我的文件很大,我想即使是你的也是如此。如果文件长度大于缓冲区,则标记和重置方法对FileReader和FileInputStream都不起作用。更多关于这方面的信息,请访问@jtahlborn

二,。关闭并重新打开文件

当我关闭并重新打开文件并创建一个新的BufferedReader时,它工作得很好。
我想理想的方法是重新打开文件,并构造一个新的BufferedReader作为文件读取器,或者FileInputStream只应用于读取文件一次

你为什么要这样做?原因可能会改变答案或提示不同的解决方案。另外,您是说您实际上不想再次读取文件的内容,只是读取第一次读取的相同缓冲数据?你没有说清楚。我想从中读取的文件是一个很长的人员列表,请检查用户输入的人员列表是否存在于列表中。包含列表的文件大约为1.9MB,用户会输入十几个名称……为什么要这样做?原因可能会改变答案或提示不同的解决方案。另外,您是说您实际上不想再次读取文件的内容,只是读取第一次读取的相同缓冲数据?你没有说清楚。我想从中读取的文件是一个很长的人员列表,请检查用户输入的人员列表是否存在于列表中。包含列表的文件约为1.9MB,用户将输入十几个名称…您的代码可能需要更正-如果出现任何错误,并从try-catch块中引发异常,BufferedReader保持打开状态。是否建议添加finally?您的代码可能需要更正-如果出现任何错误并且从try-catch块中引发异常,BufferedReader将保持打开状态。是否建议添加finally?
try {
            BufferedReader br = new BufferedReader(new FileReader(input));

            while ((line = br.readLine()) != null)
            {
                //do somethng
            }
            br.close();
        }
        catch(IOException e)
        {
            System.err.println("Error: " + e.getMessage());

        }
}