2011-07-05 48 views
0

プログラムでストリームが開いているかどうかを判断する方法があるのだろうか?プログラムですでに使用されているファイルを書き直します

私はいくつかのコードを使用していますが、私の目標は、同じファイルに複数回書き込んだり、毎回書き換えたり書き換えたりできるようにすることです。しかし、私はどこかで、この他のグループに属するコードがストリームを閉じるのを忘れているかもしれない、あるいはJavaがそれを扱うことができないかもしれないと思いますか?空のファイルの先頭ではなく、ファイルの終わりに常に書き込みます。それは削除されませんし、すでにプログラムによって開かれている場合は名前を変更することはできません。

オープンストリームの問題の場合は、ストリームをクローズする必要があります(コードを実行していて、オープンストリームが見つからないようです)。あるいは、Javaがそれを処理できない場合は、オブジェクトを再インスタンス化するための良い方法がありますか?

または、ファイルをnullに設定して消去する方法がありますか?または、ファイルを開いて消去し、オフセットを0に設定する必要がありますか?

任意のヒントは、相続人はあなたに役に立つかもしれないいくつかの良いコード

+0

まずはこれを提供しましょう。ファイルの書き込みは、デフォルトでは追加モードではなく、明示的に設定する必要があります。したがって、 "あなたは常にファイルの最後に書き込みます"と言われる部分は、この他のコード、またはあなたが追加するよう指示していると考えられます。ソースコードとエラーメッセージを歓迎します。 – demongolem

+0

ファイルを開いているかどうかを確認するために、このSOのリンクを共有しましょう。http://stackoverflow.com/questions/1390592/java-check-if-file-is-already-open – demongolem

+0

もう1つコードが追加するように指示しています。私の目標は、コードを変更しないことです(更新をリリースするので、常にコードを変更する必要があります)。これをfalseに設定しようとしましたが、ファイルを書き込む方法は、本当。私はファイルを消去する方法を探しています。指定された場所から特定の数のバイスをファイルに書き込むwriteメソッドを使用しています。しかし、私はそれを何と書くべきかはわかりませんか?空白または空白? @demongolem私はそれが可能ではないかもしれないと言っている以外は、そのリンクがどのように非常に役立つのかよく分かりませんか? – Sean

答えて

0

いいだろう:

public void writeToNewFile(String filePath, String data) 
{ 
    PrintWriter writer; 
    File file; 
    try 
    { 
     file = new File(filePath); 
     file.createNewFile(); 
     writer = new PrintWriter(new FileWriter(file)); 
     writer.println(data); 
     writer.flush(); 
     writer.close(); 
    }catch(Exception e){e.printStackTrace();} 
    writer = null; 
    file = null; 
    \\setting file & writer to null releases all the system resources and allows the files to be accessed again later 
} 

//this will write to end of file 
public void writeToExistingFile(String filePath, String data) 
{ 
    PrintWriter writer; 
    File file; 
    try 
    { 
     file = new File(filePath); 
     if(!file.exists()) 
      file.createNewFile(); 
     writer = new PrintWriter(new FileWriter(file,true)); 
     writer.println(data); 
     writer.flush(); 
     writer.close(); 
    }catch(Exception e){e.printStackTrace();} 
    writer = null; 
    file = null; 
    \\setting file & writer to null releases all the system resources and allows the files to be accessed again later 
} 

public String[] readFile(String filePath) 
{ 
    String data[]; 
    Iterator<String> it; 
    ArrayList<String> dataHolder = new ArrayList<String>(); 
    BufferedReader reader; 
    File file; 
    try 
    { 
     file = new File(filePath); 
     reader = new BufferedReader(new FileReader(file)); 

     int lines = 0; 
     while(reader.ready()) 
     { 
      lines++; 
      dataHolder.add(reader.readLine()); 
     } 

     data = new String[lines]; 
     it = dataHolder.iterator(); 
     for(int x=0;it.hasNext();x++) 
      data[x] = it.next(); 

     reader.close(); 
    }catch(Exception e){e.printStackTrace();} 
    reader = null; 
    file = null; 
    \\setting file & reader to null releases all the system resources and allows the files to be accessed again later 
    return data; 
} 

public void deleteFile(String filePath) 
{ 
    File file; 
    try 
    { 
     file = new File(filePath); 
     file.delete(); 
    }catch(Exception e){e.printStackTrace();} 
    file = null; 
} 

public void createDirectory(String directory) 
{ 
    File directory; 
    try 
    { 
     directory = new File(directory); 
     directoyr.mkDir(); 
    }catch(Exception e){e.printStackTrace();} 
    directory = null; 
} 

が、これは助けを願って!

0

@John Detter、私はすでにかなりの部分を試していましたが、それは良い/有益なコードです。

私はRandomAccessFileとしてファイルを別のスレッド(私が読み書きしていないことがわかっていたとき)で開くことで解決しました。私はファイルの長さを取得し、raf.skipBytes(length)と呼ばれ、ファイルを消去しました。 それに付随する奇妙なことがいくつかありますが、それは私のために働きます。

+1

Johnさんはあなたのメッセージを受け取りません。あなたは正しくフォーマットされていますが、回答ではないコメントでなければなりません。 – Keng

関連する問題