读取时拆分文件

f5emj3cl  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(376)

我有一个非常大的文件,我必须读取它并将其分离(取决于行的第一个字符)到其他文件中,然后再为另一个进程进行处理。问题是:有时,其中一个类型非常大,我们需要“拆分”它,所以会有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时,最初关闭原始文件,然后返回下一个文件,如果未达到限制,则重新分配,保持原样。
恐怕这样的话,版画作者在重新分配工作时就不能正常关闭了。它们是正常关闭,还是保持打开?
而且,对我来说,这似乎是一个非常丑陋的解决方案,我不知道是否有人有更好的解决方案。我无法再次读取原始文件:(

wsewodh2

wsewodh21#

一般来说,最好重新设计代码,以便在任何可自动关闭的应用程序上对资源进行简单的尝试。使用try with resource可以保证不会泄漏内存。表面上看,你已经处理了关闭,但,我会给你负面标记,因为你会泄漏在特殊情况下。
所以。。。你应该如何重新设计,使你可以尝试与资源始终?好吧,最简单的就是变得更原子化。打开文件/读取字符/关闭文件。然后将文件名踢到任何合适的队列中。队列对文件名进行操作、打开文件、填充、关闭文件的任何进程。不要传递打开的文件。

相关问题