流已经被操作或在循环文件内容时关闭

  • 本文关键字:文件 循环 操作 java
  • 更新时间 :
  • 英文 :

String fileName = "C:\Users\xxxxx\Downloads\InformeModificacionesUnificado28102021-09.txt";
//  File file = new File(fileName);
//  output = new BufferedWriter(new FileWriter(file));

try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
map.forEach((caracterMal, caracterBien) -> {
stream.forEach(x -> {
String cadenaWena = "";
cadenaWena = x.replaceAll(caracterMal, caracterBien);
System.out.println(cadenaWena); 
//output.write(cadenaWena);
});
});
} catch (IOException e) {
e.printStackTrace();
}
}

当我运行这段代码循环文件内容时,它会给我这个错误:

线程"main"异常java.lang.IllegalStateException: stream has已被操作或已关闭

那有什么问题?

该流只能迭代一次。你是在为map中的每个元素迭代。

停止使用lambdas(通常,流上的直接.forEach是糟糕的java代码;你失去了检查异常、控制流和局部变量透明度,你什么也得不到),问题就消失了:

static void main(String[] args) throws IOException {
var path = Paths.get(fileName);
var lines = Files.readAllLines(path);
for (var e : map.entrySet()) {
for (String line : lines) {
String cadenaWena = line.replace(caracterMal, caracterBien);
System.out.println(cadenaWena);
}
}
}

修复了很多问题:

  • 它一次读取文件,而不是一遍又一遍地读取。内存访问比磁盘访问快得多。
  • 它没有疯狂的错误处理(打印一半的错误,把另一半扔进垃圾桶,然后继续运行?这不是好的代码)。
  • 短。
  • 它使用适当的replace(替换所有出现)。replaceAll是一个命名不当的方法,将第一个参数解释为regexp,显然不在您的情况下。
  • 它不使用无意义的lambdas,因此更灵活。

最新更新