1

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

4

9 回答 9

2

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

于 2010-10-04T01:26:10.150 回答
1

Reader应该使用一次来读取文件。如果您想再次读取该文件,请Reader在此基础上创建一个新文件。

使用Guava的 IO 实用程序,您可以创建一个很好的抽象,让您可以使用Files.newReaderSupplier(File, Charset)多次读取文件。这为您提供了一个InputSupplier<InputStreamReader>Reader ,您可以随时通过调用从中检索一个新的getInput()

更好的是,Guava 有许多InputSupplier直接使用 s 的实用方法……这使您不必担心自己关闭提供的内容Reader。CharStreams类包含大多数文本相关的 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
  }
}

给定 a File,您可以像这样调用此方法:

File file = ...;
doSomeStuff(Files.newReaderSupplier(file, Charsets.UTF_8)); // or whatever charset

如果您想在不先将每一行读入内存的情况下对每一行进行一些处理,您也可以使用readLines采用LineProcessor的重载。

于 2010-10-04T03:46:51.963 回答
1

缓冲区读取器仅支持 reset() 到缓冲数据的位置。但这不能转到文件的开头(假设该文件大于缓冲区)。
解决方案:
  1.重新打开
  2.使用 RandomAccessFile

于 2010-10-04T01:34:39.540 回答
0

在检查是否无法读取更多行之后,您可以通过递归调用 run() 函数来执行此操作 - 这是一个示例

// Reload the file when you reach the end (i.e. when you can't read anymore strings)
  if ((sCurrentLine = br.readLine()) == null) {
    run();
  }
于 2011-02-23T04:04:12.697 回答
0

如果你想这样做,你可能需要考虑一个随机访问文件。有了它,您可以明确地将位置设置回开头并从那里重新开始阅读。

于 2010-10-04T01:24:21.807 回答
0

我建议使用公共图书馆

http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html

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

于 2010-10-04T01:25:55.860 回答
0

不确定您是否考虑过BufferedReadermark()上的和reset()方法

如果您的文件只有几 MB 大小,并且您可以在文件开头设置标记并在到达文件末尾时保持 reset() ,这可能是一个选项。看来,对同一文件的后续读取将完全从缓冲区提供,而无需转到磁盘。

于 2010-10-04T01:34:38.620 回答
0

我面临同样的问题,并徘徊在这个问题上。

1.使用mark()和reset()方法:

可以使用 FileReader 和 FileInputStream 创建 BufferedReader。FileReader 不支持 Mark 和 Reset 方法。当我尝试这样做时,我遇到了一个例外。即使我尝试使用 FileInputStream 我也无法做到,因为我的文件很大(我猜你的文件也是如此)。如果文件长度大于缓冲区,则标记和重置方法既不适用于 FileReader,也不适用于 FileInputStream。在@jtahlborn的这个答案中了解更多信息。

2. 关闭和重新打开文件

当我关闭并重新打开文件并创建一个新的 BufferedReader 时,它运行良好。我猜理想的方法是再次重新打开文件并构造一个新的 BufferedReader 作为 FileReader 或 FileInputStream 应该只使用一次来读取文件。

于 2013-06-19T19:23:01.977 回答
0
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());

        }
}
于 2015-10-05T05:42:43.350 回答