我有一个非常大的文件,我必须读取它并将其分离(取决于行的第一个字符)到其他文件中,然后再为另一个进程进行处理。问题是:有时,其中一个类型非常大,我们需要“拆分”它,所以会有n个子文件。
我不能用资源重新Mapprintwriter,我正在执行以下操作。我用try with resources和另一个我动态管理的文件来管理“确定”的文件:
try PrintWriter printerFile2 = new PrintWriter(new FileWriter(file2))) {
PrintWriter printerFile1= new PrintWriter (new FileWriter(String.format("%s.%02d", file1, part)));
while ((line = br.readLine()) != null) {
if (line.startsWith("A")) {
type = line.charAt(1);
doStuffA(type);
count++;
printerFile1 = decidePartFile(file1,Constants.MAX_LINES_AB, printerFile1);
printerFile1.print(line+"\n");
} else if (line.startsWith("B")) {
type = line.charAt(1);
doStuffB(type);
count++;
printerFile1 = decidePartFile(file1,Constants.MAX_LINES_AB, printerFile1);
printerFile1.print(line+"\n");
} else if (line.startsWith("C")) {
type = line.charAt(1);
doStuffC(type);
printerFile2 .print(line + "\n");
} else if (line.startsWith("D")) {
type = line.charAt(1);
doStuffD(type);
printerFile2 .print(line + "\n");
}
printerFile1.close();
}
decidepartfile()方法
private PrintWriter decidePartFile (String file,int limit, PrintWriter originalPrintWriter) throws IOException{
if (count == limit){
part++;
count= 0;
originalPrintWriter.close();
String filePartName= String.format("%s.%02d", file1, part
PrintWriter newPrinter = new PrintWriter(new FileWriter(filePartName));
return newPrinter;
} else {
return originalPrintWriter;
}
}
当达到限制并更改printwriter时,最初关闭原始文件,然后返回下一个文件,如果未达到限制,则重新分配,保持原样。
恐怕这样的话,版画作者在重新分配工作时就不能正常关闭了。它们是正常关闭,还是保持打开?
而且,对我来说,这似乎是一个非常丑陋的解决方案,我不知道是否有人有更好的解决方案。我无法再次读取原始文件:(
1条答案
按热度按时间wsewodh21#
一般来说,最好重新设计代码,以便在任何可自动关闭的应用程序上对资源进行简单的尝试。使用try with resource可以保证不会泄漏内存。表面上看,你已经处理了关闭,但,我会给你负面标记,因为你会泄漏在特殊情况下。
所以。。。你应该如何重新设计,使你可以尝试与资源始终?好吧,最简单的就是变得更原子化。打开文件/读取字符/关闭文件。然后将文件名踢到任何合适的队列中。队列对文件名进行操作、打开文件、填充、关闭文件的任何进程。不要传递打开的文件。