2

このコードは、大量の .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);
        }
    }

}
4

2 に答える 2

5

ファイルをフラッシュして閉じるのを忘れました。PrintWriterバッファを保持し、明示的に指定しない限りflush()、データは(不幸にも)バッファに置かれ、出力に書き込まれることはありません。

したがって、行の前にこれを追加する必要がありますcatch (Exception e) {

out.flush();
out.close();

これはとにのみ必要であることに注意してPrintWriterくださいPrintStream。他のすべての出力クラスは、閉じるとフラッシュされます。

于 2012-11-19T14:33:26.173 に答える
5

読み取り元と同じファイルに書き込みたい場合は、ファイルのコピー (別のファイル名) に書き込み、出力ファイルの名前を変更するか、RandomAccessFileインターフェイスを使用してファイルをその場で編集する必要があります。

通常、最初のソリューションは 2 番目のソリューションよりも実装がはるかに簡単です。ファイルが巨大でない限り (これはおそらく .java ファイルには当てはまりません)、2 番目を使用する本当の理由はありません。

于 2012-11-19T14:35:21.683 に答える