2013-07-18 11 views
10

Javaを使用してテキストファイルの最後の行を削除したいと思います。ただし、以下のコードはすべてを削除します。あなたは追加モードで開き、(したがって、単一write操作は、ファイルの内容全体を拭きます)上書きモードでファイルを開いているテキストファイルの最後の行を削除します。

public void eraseLast() 
{ 
    while(reader.hasNextLine()) { 
     reader.nextLine(); 

     if (!reader.hasNextLine()) { 
      try { 
       fWriter = new FileWriter("config/lastWindow.txt"); 

       writer = new BufferedWriter(fWriter); 
       writer.write(""); 
       writer.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
+1

可能重複(http://stackoverflow.com/questions/9149648/deleting-the-last-line-of-a-file-with-java ) –

+2

提示された答えはすべて不自然です。ファイルを切り捨てるのではなく、2ギガのファイルをループします。あなたがしたいのは、最後の行が終了して切り詰められることです。http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#truncate(long) –

+1

@DMoses、私は非常にパフォーマンスに興味がありますので、私はそれを実行します – Ted

答えて

17

何かをしたい、あなたのような何かを行うことができます

RandomAccessFile f = new RandomAccessFile(fileName, "rw"); 
long length = f.length() - 1; 
do {      
    length -= 1; 
    f.seek(length); 
    byte b = f.readByte(); 
} while(b != 10); 
f.setLength(length+1); 
f.close(); 

改行文字を探して2番目の最後のバイトから開始し、見つかるまで後方検索を続けます。次に、その改行後にファイルを切り捨てます。

最後の文字が改行(つまり、最後の行の最後)の場合は、最後の2バイト目から開始します。

+2

while条件に '&& length> 0'を追加してください。 – bachr

4

それは次のようになります。

fWriter = new FileWriter("config/lastWindow.txt", true); 

そして、さらに、の最後の行は削除されません。リーダーがファイルの現在の最後の行に達したにもかかわらず、の後に最後の行の後に追加モードを使用する必要があります。

あなたが何をしなければならないかを知るには、answerをご覧ください。新しいファイルを作成せずにファイルの最後の行を削除したい場合は、古いものを置き換えるの新しいファイルを作成している

+0

助けを借りて、助けてくれてありがとう – Ted

8

、あなたが

このような
public void eraseLast() { 
    StringBuilder s = new StringBuilder(); 
    while (reader.hasNextLine()) { 
     String line = reader.readLine(); 
     if (reader.hasNextLine()) { 
      s.append(line); 
     } 
    } 
    try { 
     fWriter = new FileWriter("config/lastWindow.txt"); 
     writer = new BufferedWriter(fWriter); 

     writer.write(s.toString()); 

     writer.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
+0

私はあなたの答えを選択しなかった唯一の理由は、私がジェームズホルダーネス'Answer – Ted

+6

唯一重要なことは、あなたの問題に対する解決策を見つけることです。 – juan

5

上記の答えは少しのファイルに残された唯一の1行がある場合に対処するために修正する必要がある(そうでなければ、否定のためにIOExceptionを取得シークオフセット):

RandomAccessFile f = new RandomAccessFile(fileName, "rw"); 
long length = f.length() - 1; 
do {      
    length -= 1; 
    f.seek(length); 
    byte b = f.readbyte(); 
} while(b != 10 && length > 0); 
if (length == 0) { 
f.setLength(length); 
} else { 
f.setLength(length + 1); 
} 
+0

そしてファイルサイズが0より大きいかどうかを確認する必要があります。 ) –

+0

'readByte'メソッドは正確に大文字にする必要があります – mikelsr

0

私は他人の恩恵を受けコードは機能しませんでした。ここにアンドロイドスタジオの私の作業コードです。 [Javaを使用したファイルの最後の行を削除する]の

File file = new File(getFilesDir(), "mytextfile.txt"); 
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw"); 
byte b; 
long length = randomAccessFile.length() ; 
if (length != 0) { 
    do { 
     length -= 1; 
     randomAccessFile.seek(length); 
     b = randomAccessFile.readByte(); 
    } while (b != 10 && length > 0); 
    randomAccessFile.setLength(length); 
    randomAccessFile.close(); 
} 
関連する問題