我试图修改文本文件中的一些行,当我再次将该行写回文件时,我最终得到一个空白文件

时间:2012-11-19 14:30:45

标签: java

此代码正在读取一堆.java文件并找到“public [classname]”或“private [classname]”并在该行添加“System.out.println([classname])”。

问题是当我写回那条线时,我最后得到一个空白文件

谁能看到我做错了什么?

private static void work(ArrayList<File> fileList) {
    for (int i = 0; i < fileList.size(); i++) {
        replaceLines(fileList.get(i));
    }

}

public static void replaceLines(File file) {
    String path = file.getPath();
    String fileNameLong = file.getName();
    String fileName = null;
    if (fileNameLong.contains(".java")) {
        fileName = fileNameLong.substring(0, file.getName().indexOf("."));
    }
    if (fileName != null && fileName != "") {
        System.out.println(fileName);
        try {
            //prepare reading
            FileInputStream in = new FileInputStream(path);
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(in));
            //prepare writing
             FileWriter fw = new FileWriter(file);
             PrintWriter out = new PrintWriter(fw);

            String strLine;
            while ((strLine = br.readLine()) != null) {
                // Does it contain a public or private constructor?
                boolean containsPrivateCon = strLine.contains("private "
                        + fileName);
                boolean containsPublicCon = strLine.contains("public "
                        + fileName);

                if (containsPrivateCon || containsPublicCon) {
                    int lastIndexOfBrack = strLine.lastIndexOf("{");

                    while (lastIndexOfBrack == -1) {
                        strLine = br.readLine();
                        lastIndexOfBrack = strLine.lastIndexOf("{");
                    }

                    if (lastIndexOfBrack != -1) {
                        String myAddition = "\n System.out.println(\""
                                + fileName + ".java\"); \n";
                        String strLineModified = strLine.substring(0,
                                lastIndexOfBrack + 1)
                                + myAddition
                                + strLine.substring(lastIndexOfBrack + 1);
                        strLine = strLineModified;
                    }
                }
                out.write(strLine);
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }

}

2 个答案:

答案 0 :(得分:5)

您忘记刷新并关闭文件了。 PrintWriter保留一个缓冲区,除非你明确地flush()它,否则数据将(un)愉快地放在缓冲区中,它永远不会被写入输出。

因此您需要在第catch (Exception e) {

之前添加此内容
out.flush();
out.close();

请注意,这仅适用于PrintWriterPrintStream。关闭它们时,所有其他输出类都会刷新。

答案 1 :(得分:5)

如果要写入您正在读取的同一文件,则应该写入文件的副本(不同的文件名),然后重命名输出文件,或使用RandomAccessFile界面编辑就地存档。

通常,第一个解决方案比第二个解决方案更容易实现更多;除非文件很大(可能不是.java文件的情况),否则没有真正的理由使用第二个文件。