2017-01-26 13 views
0

私はJavaで読み書きするためにRandomAccessFileを使用していました。しかし、ファイルに文字列を書き込むと、ファイルの現在の内容がオーバーライドされています。ここに私のコードはJava RandomAccessFile元のテキストを削除する

import java.io.RandomAccessFile; 
public class hello{ 
    public static void main(String[] args){ 
    RandomAccessFile a; 
    try{ 
     a = new RandomAccessFile("a.txt", "rw"); 
     System.out.println(a.readLine()); 
     a.writeUTF("another text"); 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 
    } 
} 

であり、ここで私のファイルの内容は

101 yes no yes no 
102 no no yes no 
103 yes no yes no 
104 no no yes no 
105 no yes no no 
106 yes yes yes no 

ですが、私はプログラムを実行すると、それは私が間違って何をした

101 yes no yes no 
another text no 
103 yes no yes no 
104 no no yes no 
105 no yes no no 
106 yes yes yes no 

なり?

+0

RandomAcessFile#のwriteUTFは、カーソルの位置に内容を上書きし、あなたが既に ')(' a.readLineを使用して1行を読んで以来/書き込みを開始し、あなたのファイルポインタはに位置しています2行目の開始。また、書き込み/読み込みを終了した後、ファイルストリームを 'a.close()'で閉じることもベストプラクティスです。 –

答えて

0

これが問題なのかどうかはまだわかりませんが、書き込みのためにファイルポインタをファイルの最後に移動できるようにRandomAccessFileにseekメソッドがあることがわかりました。あなたは、ファイルの長さに

long fileLength = a.length(); 

を見つける必要があり

0

は、その後、あなたがそれに書き込むことができるように、その位置にファイルポインタをオフセットする必要があります。

a.seek(fileLength); 

これで問題が解決されます。 メモでは、リソースを閉じる必要があります。たぶんしてみてください-で資源:

try (RandomAccessFile a = new RandomAccessFile("a.txt", "rw")) { 
      long fileLength = a.length(); 
      a.seek(fileLength); 
      System.out.println(a.readLine()); 
      a.writeUTF("another text"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
+0

明らかに、使用しているJavaのバージョンによっては、https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html –

+0

でも、既存の行を上書きせずに2行目に書き込むことはできません – KidUser

+0

@KidUserあなたは私の修正を試みましたか?最後に「別のテキスト」という行が書き込まれます。 –

関連する問題