2014-03-13 3 views
2

내가 텍스트를 쓸 때 작가 대신 outputstreams의 사용되어야한다는 것을 알고 있지만, 아직도 내가이 프로그램을 실행 한 후 파일 outputStream.txt에 추가 문자가 이유를 이해하지 않습니다ObjectOutputStream에 기입 추가 문자

public static void main(String[] args) throws FileNotFoundException, IOException 
    { 
     ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("C:\\Data\\tmp\\outputStream.txt"))); 
     oos.writeObject("SomeObject"); 
     oos.writeUTF("SomeUTF"); 
     oos.flush(); 
     oos.close(); 
     BufferedWriter writer = new BufferedWriter(new FileWriter(new File("C:\\Data\\tmp\\outputWriter.txt"))); 
     writer.write("SomeObject"); 
     writer.write("SomeUTF"); 
     writer.flush(); 
     writer.close(); 
    } 

파일 outputWriter.txt은 예상대로 17 바이트이지만 인식 할 수없는 텍스트를 포함하여 outputStream.txt은 28입니다. 왜 그런가요?

답변

4

ObjectOutputStream은 스트림에 Java 객체를 쓰는 데 사용됩니다. 즉, String의 값을 스트림에 씁니다. 대신에 "다음 객체는 String이고 그 값은 SomeObject"이라고 쓰십시오.

일반 텍스트 파일을 원할 경우 Writer API를 사용해야합니다.

참고 : 코드는 플랫폼에 따라 다릅니다. 당신이 플랫폼 독립적 인 확인하려면, 당신은 사용해야합니다 :

FileOutputStream stream = new FileOutputStream(file); 
    return new BufferedWriter(new OutputStreamWriter(stream, Charset.forName("UTF-8"))); 
0

ObjectOutputStream은 바이너리 데이터를 씁니다. 이 API에서

: 수정 UTF-8 형식이 String의

public void writeUTF(String str) throws IOException 

기본 데이터 쓰기.

추가 바이트는 아마도 수정 된 UTF-8 인코딩에서 나왔습니다.

1

outputStream.txt 파일 객체 직렬화에로 "SomeObject의"의 바이너리 (스트림) 형식이 포함되어 있습니다. 이것은 ObjectInputStream을 사용하여 원래의 객체로 다시 읽을 수 있습니다. 이것을 역 직렬화 프로세스라고합니다.

그러나 BufferedWriter 텍스트 형식의 데이터를 직렬화와 관련이 없습니다. 따라서 다시 읽는 동안 텍스트를 읽고 개체를 수동으로 다시 만들어야합니다.

+0

추가 바이트를 제거 할 수있는 방법이 있습니까? –

+0

왜 그렇게하고 싶은지, 어쨌든 다른 질문 인 것 같습니까? 새로운 질문으로 질문하십시오. – sakura