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再次声明,我没有编写此代码。请随时向作者发送消息。可用()的正确用法很少,这不是其中之一。这不是对文件结尾的测试。您可以自己联系作者。您承担了发布的责任,您可以吸引上升票和下降票。-1BufferedReader
工作正常,无论文件是否放入内存。此外,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;
};
}
}