2011-11-11 4 views
11

この質問は、this質問の重複した複製であることを知っています。 しかし、私はそのページ全体を2回、セクションを3回読んでいます。私の人生では、どう答えられているのかわかりません。Java 6ファイルの削除

だから、私の問題に。

私は仕事中で、Java 6 SEを使用していないため、7にアップグレードできません。ファイルを作成して書き込み、何らかの処理を行い、ファイルを削除する必要があるプログラムを作成しています。上記の質問に尋ねた人物とまったく同じ問題が発生しています.Javaはファイルを削除しないため、理由を特定できません。

コード:これは、任意のスロー可能オブジェクト、エラーまたは例外がスローされていない

File f = null; 
FileWriter fw = null; 
try 
{ 
    f = new File("myFile.txt"); 
    fw = new FileWriter(f); 
    fw.write("This is a sentence that should appear in the file."); 
    fw.flush(); 
    if(f.delete()) 
     System.out.println("File was successfully deleted."); 
    else 
     System.err.println("File was not deleted."); 
} 
catch(Exception exc) 
{ 
    System.err.println(exc.getMessage()); 
} 
catch(Error er { 
    System.err.println(er.getMessage()); 
} 
catch(Throwable t) 
{ 
    System.err.println(t.getMessage()); 
} 
finally 
{ 
    fw.close(); 
} 

(Iは任意とすべてのエッジケースを除外するものを含みます)。 2番目の印刷ステートメント("File was not deleted.")がコンソールに印刷されています。私はWindows 7でこれを実行しており、完全な権限(rwx)を持っているフォルダに書き込んでいます。

私が参照した質問をするユーザーは、自分の質問に答えましたが、私の謙虚な意見ではそう簡単ではありません。いずれにせよ、私はそれを理解することに問題があります。彼/彼女はBufferedReaderを使用してFileInputStreamと違っているということを暗示しているようですが、私はそれがどのように当てはまるのか分かりません。

Java 7はjava.nio.file.Filesクラスの導入でこの問題を修正したようですが、Java 7を使用することはできません。その参照先の質問に

他の回答者は、私はこれらのすべてを試してみましたが、彼らが働いていないなど、そのように明示的System.gc()を呼び出すように、これはJavaで「バグ」であることをほのめかし、およびcircumventionsのすべての種類を与えます。

誰かが新しい視点を追加して、私のためにいくつかの考えをジョギングしているかもしれません。

+0

私はこれが重複しているとは思わない。あなたが他の質問から提案された解決策を試しても助けにならなかったので、その原因が異なる可能性があります。 – finnw

+2

最初に閉じます。そして... "Java 6を使用して立ち往生しましたか?"私はJDK7上で動作している単一の会社を知らない。私は1.4と1.5の多くを知っています。自分自身を幸運と考えてください。 –

+0

あなたが言ったことは逆です:BufferedReaderの代わりにFileInputStreamを使用することは、他の投稿のユーザーのために働いたことです。なぜそれが当てはまるのかについては、そこにあるいくつかのコメントはJavaのバグを示唆しています。 –

答えて

17

アクティブなオープンなFileWriterによって参照されているファイルを削除しようとしています。

これを試してみてください:

f = new File("myFile.txt"); 
fw = new FileWriter(f); 
fw.write("This is a sentence that should appear in the file."); 
fw.flush(); 
fw.close(); // actually free any underlying file handles. 
if(f.delete()) 
    System.out.println("File was successfully deleted."); 
else 
    System.err.println("File was not deleted."); 
8

何のファイルハンドラが存在しない場合にのみ、ファイルを削除することができますが開いたままに。 FileWriterを使用してファイルhanlderを開くので、削除する前にファイルを閉じる必要があります。言い換えれば、f.deleteは、fw.closeの後に実行する必要があります。

以下のコードを試してください。 fwがnullの場合など、見つかったすべての可能性のあるバグを防ぐために変更を加えました。

File f = null; 
FileWriter fw = null; 
try { 
    f = new File("myFile.txt"); 
    fw = new FileWriter(f); 
    fw.write("This is a sentence that should appear in the file."); 
    fw.flush(); // flush is not needed if this is all your code does. you data 
       // is automatically flushed when you close fw 
} catch (Exception exc) { 
    System.err.println(exc.getMessage()); 
} finally {// finally block is always executed. 
    // fw may be null if an exception is raised in the construction 
    if (fw != null) { 
     fw.close(); 
    } 
    // checking if f is null is unneccessary. it is never be null. 
    if (f.delete()) { 
     System.out.println("File was successfully deleted."); 
    } else { 
     System.err.println("File was not deleted."); 
    } 
}