7

次のコードについて少し疑問があります。

try {
    File file = new File("writing");
    file.createNewFile();
    System.out.println(file.delete());
    System.out.println(file.exists());

    PrintWriter pw = new PrintWriter(file);
    pw.print(324.2342);
    pw.flush();
    pw.close();
    FileReader fr = new FileReader(file);
    BufferedReader br = new BufferedReader(fr);
    System.out.println(br.readLine());
    br.close();
} catch(IOException ioE) {
    System.out.println("Indeed");
}

file.exists()なぜこの状況で、メソッド file.delete() は、実行時に「true」を返し、 「false」を返すメソッドによっても確認されるため、機能すると明らかに言っています。ただし、実行時に「IOException the file "writing" does not exist」などの例外は発生しません。

物理的に削除されたにもかかわらず、ファイルがヒープに残り続けるのはなぜですか? delete メソッドが呼び出されるとすぐに、自動的にガベージ コレクションを行うべきではありませんか? 出力を見たので、そうではないことはわかっています。

4

4 に答える 4

4

これは、Fileが抽象パスを表しているためです。これについては、JavaDoc を参照してくださいhttp://docs.oracle.com/javase/6/docs/api/java/io/File.html。OS のファイル ハンドルを表すものではありません。
コード内の行:

PrintWriter pw = new PrintWriter(file);

新しいファイルを作成するだけです。これを呼び出した後、ファイルを削除してみてください...

于 2013-02-15T16:55:55.717 に答える
2

Fileobject は、ファイル システム上の物理ファイルへのパスが存在するかどうかを表します。そのため、(ファイルexists()が存在するかどうかを確認する)およびcreateNewFile()(ファイルが見つからない場合はファイルを作成する)必要があります。


PrintWriter(File file)また、存在しない場合は新しいファイルを作成することに注意してください。

パラメーター:

file - このライターの宛先として使用するファイル。ファイルが存在する場合は、サイズがゼロに切り捨てられます。そうしないと、新しいファイルが作成されます。出力はファイルに書き込まれ、バッファリングされます。

于 2013-02-15T16:54:57.870 に答える
1

ファイルは、(存在するかどうかに関係なく)実際のファイルへのハンドルです。あなたが言うように、あなたは上記のファイルを作成してから削除します-これまでのところすべて良いです。

後でPrintWriterにアクセスすると、使用時にファイルがもう一度作成されます。以前に削除したかどうかは関係ありません。

実際、ユースケースによっては、これは必要に応じて適切な場合があります。たとえば、古いログファイルを削除してから、再作成してもう一度書き込むことができます。

最後に、メソッドが存在するまで、コード内のガベージコレクションの対象となるものはありません。その場合でも、アンダーイルファイルは存在し続けます(最初から削除しない場合)。この場合のガベージコレクションは、基になるファイルに影響しません。削除の呼び出し後に削除され、PrintWriterでの処理が完了すると再び存在します。

お役に立てれば!

于 2013-02-15T17:01:17.070 に答える
0

ファイルには、特定のファイルへのリンクはなく、ファイルのパスによるファイル ポインターへのリンクはありません。次の行で、新しいファイルを作成しています。

PrintWriter pw = new PrintWriter(file);
于 2013-02-15T16:56:54.973 に答える