6

現在、JavaコードのFileOutputStreamで問題が発生しています。

実際、私はファイルの作成にFileOutputStreamを使用していますが、ファイルが作成されると、それを削除する方法はありません。私が理解できる限り、これはFileOutputstreamが閉じられていないという事実に起因している可能性があります。

私の要約されたコードの下に:

     outFile = new FileOutputStream(dir+"\\"+fileName);
     outFile.write("Test");
     outFile.flush();
     outFile.close();
     outFile = null;
     System.gc();

その場合、「手動で」でもファイルを削除する方法はありません。私のプログラムが起動されたとき、私は単純なデルでそれをウィンドウズで削除することはできません。また、次のコードを使用して、フォルダdirのコンテンツを削除しようとしましたが、どちらも機能しませんでした。

static public void delDir( String place )

{
    File path = new File( place );
    System.out.println(path.exists());//return true
    if( path.exists() )
        {
        File[] f = path.listFiles();
        for( int j = 0 ; j < f.length ; j++ )
            {
            if( f[ j ].isDirectory() )
                {
                deleteDirectory( path+"\\"+f[ j ] );
                }
            f[ j ].delete();
            }
        }
}

だから私の質問は: 次の削除のためにこのファイルを閉じる方法(またはそれを閉じることができない場合はそれを適切に削除する方法)?

4

7 に答える 7

13

これはJavaのバグです。はい、それはめったにありませんが、それらは存在します;)後に追加してもらえますかoutFile.close()

outFile = null;
System.gc();

そして、それを削除してみてください。これが機能しない場合は、より多くの可能性があります。お知らせ下さい。

アップデート

私にとってはうまくいきます:

public class FileDeleteExample {
    public static void main(String[] args) throws Exception {
        File f = new File("test.txt");

        FileOutputStream outFile = null;

        try {
            outFile = new FileOutputStream(f);
            outFile.write("Test".getBytes());
        } finally {
            outFile.flush();
            outFile.close();
            outFile = null;
            System.gc();
        }

        f.delete();
    }
}

アップデート

行を削除して言及したSumitSinghの例で試してみましたが、outFile=null; System.gc;これもうまくいきます。したがって、に問題はないはずFileOutputStreamです。上記の小さな例を試して、それが機能するかどうかを教えていただけますか?

アップデート

void closeQuietly(FileOutputStream out) {
    try { out.flush(); out.close(); } catch(Exception e) {} 
}

finally次に、ブロック内のメソッドを呼び出すだけです。

于 2012-08-23T16:24:20.533 に答える
1

同じ問題が発生しました。delete()メソッドがファイルに対してfalseを返しました。

私の場合、ファイルの作成、FileOutputStreamへの書き込み、ファイルの削除の間のどこかで、FileInputStreamを使用していて、close()を呼び出すのを忘れていました。

したがって、コードのどこかで、このファイルに別のストリームを添付し、開いたままにした可能性があります。

問題の本当の原因を見つける前に、私はこれを一時的に修正するために単純なハックを使用しました:

FileOutputStream fos = new FileOutputStream(myFile);
fos.close();
myFile.delete();

ファイルでdeleteを呼び出す直前に、その上に別のFileOutputStreamを作成し、close()を呼び出しました。

これにより、このファイルの以前のすべてのロックが解除され、delete()を呼び出すことができます。

それでも、これを行うのは良い習慣ではありません。誰があなたのファイルを使用しているかを見つけて、それを正しい方法で解決する必要があります。

于 2013-06-27T10:44:14.077 に答える
0

さて、ファイルの出力と入力ストリームを閉じる方法は次のとおりです。

name.close()

削除コードは問題ないようです。正当な理由でFileOutputStreamを使用している場合を除き、FileOutputStreamの代わりにFileIOを使用することをお勧めします。プログラムが終了したらファイルを削除できますか?

于 2012-08-23T16:23:05.580 に答える
0

このコードを試すことができます。

    File file = new File(dir+"\\"+fileName);
    FileOutputStream outFile;
    try {
        outFile = new FileOutputStream(file);
        outFile.write("Test".getBytes());
        outFile.flush();
        outFile.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
   file.delete();

これらは以下のリンクで確認できます。

  1. Javaでファイルを削除できません
  2. Java'file.delete()'は指定されたファイルを削除していません!
  3. Java6ファイルの削除
于 2012-08-23T16:27:49.447 に答える
0

ApacheCommonsIOのFileUtils.deleteDirectoryを使用することをお勧めします。Java削除のバグを克服し、使用するコードの量を減らし、何よりも機能します。

電話する代わりに

delDir(place);

電話するだけ

FileUtils.deleteDirectory(new File(place));

更新:delDirメソッドで、次のように呼び出します 。

deleteDirectory(new File(path + "\\" + f[j]));

しかしの結果

File[] f = path.listFiles();

すでにファイルにパスが含まれているので、次を使用できます。

deleteDirectory( f[j].getPath() );
于 2012-08-23T16:31:02.263 に答える
0

あまり関係ありませんが:

ファイルを閉じるというこの解決策は、別の問題を解決するのに役立ちました。Java 6からプログラムを実行すると、アプリケーションを閉じるまで新しいプロセスが中断されました(Java 7では問題ありませんでした)。この回答に基づく解決策は、次のことに役立ちました。

    String[] com = new String[]{javaRun, arg1, arg2, arg3, arg4};

    Process proc = Runtime.getRuntime().exec(com, null, dir);

    proc = null;
    System.gc();

これはJava6で動作します。インスピレーションをありがとう。

于 2013-07-30T11:00:15.667 に答える
0

問題は最初の行にある可能性があります:outFile = new FileOutputStream(dir + "\" + fileName);

  1. 新しいものが必要かどうかわからない。
  2. ディレクトリがパスに含まれるべきだとは思わないでください。AFAIK FileOutputStreamのディレクトリは、アプリの内部ディレクトリとして定義されています。

HTH

于 2017-12-01T19:55:18.607 に答える