5

Java プログラムの次の関数は、ファイルから読み取り、後で同じファイルに上書きすることを意図して記述されています。

public static void readOverWrite(File dir) throws IOException {
    for (File f : dir.listFiles()) {
        String[] data = readFile(f).split("\n");
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(f))) {
            for (int i = 0; i < data.length; i++) {
                writer.write((data[i]+"\n"));
            }
            writer.close();
        }
    }
} 

プログラムを実行しようとすると、次のエラー メッセージが表示されます。

Exception in thread "main" java.io.FileNotFoundException: ..\..\data\AQtxt\APW19980807.0261.tml (The requested operation cannot be performed on a file with a user-mapped section open)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at java.io.FileWriter.<init>(Unknown Source)
    at General.SplitCreationDate.splitLine(SplitCreationDate.java:37)
    at General.SplitCreationDate.main(SplitCreationDate.java:53)

エラーを解決するためのヘルプをリクエストしてください。


readFile のコード

protected static String readFile(File fullPath) throws IOException {
    try(FileInputStream stream = new FileInputStream(fullPath)) {
        FileChannel fc = stream.getChannel();
        MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
        stream.close();
        return Charset.defaultCharset().decode(bb).toString();
    }
} 

これは Windows の問題であり、readFile メソッドの MappedByteBuffer が問題の原因であることを別のスレッドで確認してください。以下のように readFile メソッドを書き直しました。できます!

protected static String readFile(File fullPath) throws IOException {
    String string = "";
    try (BufferedReader in = new BufferedReader(new FileReader(fullPath))) {
        String str;
        while ((str = in.readLine()) != null) {
            string += str + "\n";
        }
    }
    return string;
} 
4

2 に答える 2