2013-07-18 9 views
10

자바를 사용하여 텍스트 파일의 마지막 줄을 지우려고합니다. 그러나 아래의 코드는 모든 것을 삭제합니다. 당신은 덮어 쓰기 모드로 파일을 (따라서 하나의 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, 나는 제임스 Holdernesss을 사용했기 때문에 그 말을 주셔서 대단히 감사합니다, 나는 내가 나를 그 말과 너무 많은 – 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

당신이 동안의 조건 – bachr

4

, 추가 모드에서 엽니이 있어야한다 :

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

그리고 게다가, 마지막 줄을 삭제하지 않을 것 : 독자가 파일의 현재 마지막 줄에 도달하지만, 작가는 마지막 줄 이후 입니다 - 우리는 추가 모드를 사용하는 것을 이상으로 지정했기 때문에.

당신이해야 할 것이다 무엇의 아이디어를 얻을이 answer를 살펴 보자. 당신은 이전을 대체있어 새 파일을 만드는

+0

당신을 감사 것을 할 것입니다 성능에 매우 관심이, 내가 t 답을 선택 바랬다 - 유일한 이유였다 '대답 – 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

감사를 도와 – Ted

+6

유일한 중요한 것은 당신이 당신의 문제에 대한 해결책 : – juan

5
위의 대답은 (음수 오프셋 시크 그렇지 않으면 당신은 IOException를 얻을) 파일에 남아있는 단 1 라인이 경우에 대처하기 위해 약간 수정 될 필요가

: 나는 다른 사람으로부터 혜택을

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보다 큰 여부 -) –

+0

'readByte' 메소드는 올바른 대문자이어야합니다. – mikelsr

0

가 그러나 코드가 작동하지 않았습니다. 여기 안드로이드 스튜디오에 대한 제 작업 코드가 있습니다. [자바 파일의 마지막 줄을 삭제]의

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(); 
} 
관련 문제