有什么方法可以从文本文件中读取特定行吗?在 API 或 Apache Commons 中。就像是 :
String readLine(File file, int lineNumber)
我同意实现起来很简单,但是如果文件很大,它的效率就不是很高。
有什么方法可以从文本文件中读取特定行吗?在 API 或 Apache Commons 中。就像是 :
String readLine(File file, int lineNumber)
我同意实现起来很简单,但是如果文件很大,它的效率就不是很高。
String line = FileUtils.readLines(file).get(lineNumber);
可以,但它仍然存在效率问题。
或者,您可以使用:
LineIterator it = IOUtils.lineIterator(
new BufferedReader(new FileReader("file.txt")));
for (int lineNumber = 0; it.hasNext(); lineNumber++) {
String line = (String) it.next();
if (lineNumber == expectedLineNumber) {
return line;
}
}
由于缓冲区,这将稍微更有效。
查看Scanner.skip(..)
并尝试跳过整行(使用正则表达式)。我不知道它是否会更有效 - 对其进行基准测试。
PS与效率我的意思是内存效率
不是我知道的。
请注意,文件上没有关于行开始位置的特定索引,因此任何实用程序方法都将与以下内容一样有效:
BufferedReader r = new BufferedReader(new FileReader(file));
for (int i = 0; i < lineNumber - 1; i++)
{
r.readLine();
}
return r.readLine();
(当然,具有适当的错误处理和资源关闭逻辑)。
因为文件是字节而不是面向行的 - 任何通用解决方案的复杂性最多为 O(n),其中 n 是文件大小(以字节为单位)。您必须扫描整个文件并计算行分隔符,直到您知道要读取文件的哪个部分。
番石榴有类似的东西:
List<String> Files.readLines(File file, Charset charset);
所以你可以做
String line = Files.readLines(file, Charsets.UTF_8).get(lineNumber);
如果您正在阅读的行的长度都相同,那么计算可能会很有用。
但是在线条长度不同的情况下,我认为在行数正确之前,没有其他方法可以一次读取它们。
不幸的是,除非您可以保证文件中的每一行都是完全相同的长度,否则您将不得不通读整个文件,或者至少阅读您所追求的那一行。
计算行数的唯一方法是在文件中查找换行符,这意味着您将不得不读取每个字节。
可以优化您的代码以使其简洁易读,但在下面您将始终阅读整个文件。
如果您要一遍又一遍地读取同一个文件,您可以解析该文件并创建一个索引来存储某些行号的偏移量,例如第 100 行、第 200 行等的字节数。
使用文件工具:
File fileFeatures = new File(
"Homework1AdditionalFiles/jEdit4.3/jEdit4.3ListOfFeatureIDs.txt");
String line = (String) FileUtils.readLines(fileFeatures).get(lineNumber);
如果您打算以相同的方式处理同一个文件(在某行查找文本),您可以为您的文件编制索引。行号 -> 偏移量。
根据这个答案,Java 8 使我们能够从文件中提取特定的行。该答案中提供了示例。