Java 什么';这是逐行处理大型文本文件的最有效方法

Java 什么';这是逐行处理大型文本文件的最有效方法,java,Java,我(认为)我正在逐行处理一个文本文件,直到找到一个特定的令牌 (Psuedo Code) Scanner scanner = new Scanner(new FileReader("myTextFile.txt"); while (scanner.hasNext() { boolean found = process(scanner.nextLine(); if (found) return; } 有些文件很大。这段代码实际上是逐行扫描文件,还是扫描仪或文件读取器将整个文件读

我(认为)我正在逐行处理一个文本文件,直到找到一个特定的令牌

(Psuedo Code)

Scanner scanner = new Scanner(new FileReader("myTextFile.txt");
while (scanner.hasNext() {
    boolean found = process(scanner.nextLine();
    if (found) return;
}
有些文件很大。这段代码实际上是逐行扫描文件,还是扫描仪或文件读取器将整个文件读入内存,然后逐行通过内存缓冲区?

您需要吗

BufferedReader br = new BufferedReader(new FileReader(file));
String line;
boolean found = false;
while ((line = br.readLine()) != null) {
     if(line.equalsIgnoreCase("Your string"))
       found = true;
}
你想要什么

Path filePath=Path.get(“myTextFile.txt”);
布尔值=false;
try(BufferedReader br=Files.newBufferedReader(filePath,CharSet.forName()){
对于(字符串line=br.readLine();line!=null;line=br.readLine()){
发现=过程(线);
如果(找到){
打破
};
}
}
Path filePath=Path.get(“myTextFile.txt”);
布尔值=false;
try(BufferedReader br=Files.newBufferedReader(filePath,CharSet.forName()){
对于(字符串line=br.readLine();line!=null;line=br.readLine()){
发现=过程(线);
如果(找到){
打破
};
}
}


你能试试BufferedReader吗?它是一行接一行的。我不确定找到的是什么,但要小心,你的匹配不会被分成两行。以字节块而不是以行为单位读取可能会获得更好的性能(同样,这取决于你在寻找什么)。这取决于您需要什么。如果您使用Java单机版进行批处理,这只是时间问题和适当的对象管理,您可以使用BufferedReader…您将只使用每行所需的内存…您可以尝试BufferedReader吗?它是逐行的。我不确定找到了什么,但请小心您的match不会被分成两行。以字节块为单位的读取性能可能比以行为单位的读取性能更好(同样,这取决于您要查找的内容)。这取决于您需要什么。如果您使用Java单机版进行批处理,这只是时间问题和适当的对象管理,您可以使用BufferedReader…您将只使用每行所需的内存…
BufferedReader
工作正常,无论文件是否适合内存。此外,不同的
BufferedReader
BufferedInputStream
之间的区别在于,输入流访问原始字节,而读取器读取字符。@Puce我没有编写代码,如果你看我文章的结尾,它是一个直接复制粘贴,以说明代码是如何工作的。
DataInputStream.readLine()
已被弃用(请参阅),这本质上让我们有了
BufferedReader
作为唯一好的选择(除了编写自己的)来做好这项工作。输入流是为原始数据(字节)设计的访问,没有其他内容。此外,
BufferedReader
可能会在引擎盖下使用输入流,为其添加字符转换。这是总体上最好的选择。@amn再次声明,我没有编写此代码。请随时向作者发送消息。可用()的正确用法很少,这不是其中之一。这不是对文件结尾的测试。您可以自己联系作者。您承担了发布的责任,您可以吸引上升票和下降票。-1
BufferedReader
工作正常,无论文件是否放入内存。此外,
BufferedReader
还有,
BufferedInputStream
,除了显而易见的一点之外,就是输入流访问原始字节,而读取器读取字符。@Puce我没有编写代码,如果你看我文章的结尾,它是一个直接复制粘贴,以说明代码是如何工作的。
DataInputStream.readLine()
不推荐使用(请参阅),这基本上让我们有了
BufferedReader
作为唯一的好选择(除了编写自己的)来做好这项工作。输入流是为原始数据(字节)设计的访问,没有其他内容。此外,
BufferedReader
可能会在引擎盖下使用输入流,为其添加字符转换。这是总体上最好的选择。@amn再次声明,我没有编写此代码。请随时向作者发送消息。可用()的正确用法很少,这不是其中之一。这不是对文件结尾的测试。请自行联系作者。您承担了发布的责任,您可以吸引上升票和下降票。-1+1-这应该是首选方法。如果您不需要
找到
,请将其声明移到循环之外ons inside(
for(String-line;(line=br.readLine)!=null;){/*循环体*/}
)-这样就不会用未使用的变量污染外部作用域。+1-这应该是首选方法。如果不需要
line
在循环外部找到,请将它们的声明移到内部(
)(stringline;(line=br.readLine)!=null;){/*循环体*/}
)-这样就不会用未使用的变量污染外部范围。
public static void main(String[] args) {

        File file = new File("C:\\testing.txt");
        FileInputStream fis = null;
        BufferedInputStream bis = null;
        DataInputStream dis = null;

        try {
            fis = new FileInputStream(file);

            bis = new BufferedInputStream(fis);
            dis = new DataInputStream(bis);

            while (dis.available() != 0) {
                System.out.println(dis.readLine());
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fis.close();
                bis.close();
                dis.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
Path filePath = Paths.get("myTextFile.txt");
boolean found = false;
try (BufferedReader br = Files.newBufferedReader(filePath, CharSet.forName(<char-set-name>)){
   for (String line = br.readLine(); line != null; line = br.readLine()) {
     found = process(line);
     if (found){
        break;
     };
   }
}