2011-11-21 2 views
33

다음 메서드는 내가 추가 한 최신 항목 만 씁니다. 이전 항목에는 추가하지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?PrintWriter 추가 메서드가 추가되지 않음

public void addNew() { 
    try { 
     PrintWriter pw = new PrintWriter(new File("persons.txt")); 
     int id = Integer.parseInt(jTextField.getText()); 
     String name = jTextField1.getText(); 
     String surname = jTextField2.getText(); 
     Person p = new Person(id,name,surname); 
     pw.append(p.toString()); 
     pw.append("sdf"); 
     pw.close(); 
    } catch (FileNotFoundException e) {...} 
} 

답변

64

PrintWriter의 방법은 (는) 파일을 열되는 모드를 변경 것을 의미하지 않는다 append()라고 사실.

당신은뿐만 아니라 추가 모드에서 파일을 열 필요가 :

PrintWriter pw = new PrintWriter(new FileOutputStream(
    new File("persons.txt"), 
    true /* append = true */)); 

또한 해당 파일이 시스템 기본 인코딩으로 작성됩니다 유의하십시오. 항상 원하는 것은 아니며 상호 운용성 문제가 발생할 수 있으므로 파일 인코딩을 명시 적으로 지정할 수 있습니다.

+0

이 잠자는 스레드, 그것에 대해 유감을 각성 같다. 그러나 나는 의심한다. 어떻게 File 객체 만 주어진다면 파일에서 작업을 추가 할 수 있으며 Stream 클래스 (예 : FileOutputStream 등)를 사용할 수 없습니다. 내가 허용하는 것은 : Printwriter pw = new PrintWriter (file); : 나는 append(), write(), print()를 시도했다. 이 시나리오에서 추가 할 수있는 임의의 방법이 있습니까? –

+0

설명에 따르면, PrintWriter의 'append()'메소드는 Writer에 추가되는 사실을 나타냅니다.e 파일 자체가 아닌 출력 스트림입니다. –

+0

그리고 @ user1707035의 질문과 관련하여 아니오, PrintWriter를 사용하여 OutputStream 객체로 생성하지 않고 추가 할 수없는 것처럼 보입니다. 이는 PrintWriter가 인스턴스 생성시 스트림을 열고 File 또는 filename을 인수로 지원하는 유일한 생성자가 'append'매개 변수없이 OutputStream 객체를 내부적으로 생성함으로써 File을 열기 때문입니다. 참조 (docs) : https://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html#PrintWriter(java.io.File) –

15
PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"),true)); 

true은 추가 플래그입니다. documentation을 참조하십시오.

9

를 열고 다음 코드와 같은 추가 모드에서 파일 : 허용 대답은 의도는 문자를 쓸 수 있다는 사실을 고려하지 않습니다 이럴

PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"), true)); 
4

. (주제가 오래된 것은 알고 있지만 동일한 주제를 검색하는 동안 조언 된 해결책을 찾기 전에이 게시물을 발견 했으므로 여기에 게시하고 있습니다.)

FileOutputStream docs에서 바이트를 인쇄하려면 FileOutputStream을 사용합니다. .

FileOutputStream에 원시 바이트 등 화상 데이터의 스트림을 기록하는 것을 의미한다. 문자 스트림을 작성하려면 FileWriter를 사용해보십시오.

게다가, BufferedWriter docs에서 : 프롬프트 출력이 필요한 경우를 제외하고

, FileWriters와 OutputStreamWriter와 같은 , 비용이 많이 드는 등 수 있습니다 그의 쓰기() 작업 어떤 작가 주위에 BufferedWriter로 포장하는 것이 좋습니다 .

마지막으로, 대답은 다음 (언급 한 바와 같이 in this other StackOverFlow post) 다음과 같습니다

PrintWriter out = null; 
try { 
    out = new PrintWriter(new BufferedWriter(new FileWriter("writePath", true))); 
    out.println("the text"); 
}catch (IOException e) { 
    System.err.println(e); 
}finally{ 
    if(out != null){ 
     out.close(); 
    } 
} 

또한, 자바 7, 당신은 시도 -과 - 자원 문을 사용할 수 있습니다. 어떤 finally 블록은 자동으로 처리됩니다 때문에 선언 된 자원 (들)을 닫을 필요하지, 또한 덜 장황하다 :

try(PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("writePath", true)))) { 
    out.println("the text"); 
}catch (IOException e) { 
    System.err.println(e); 
} 
관련 문제