2008-11-07 7 views
7

저는 전선을 통해 정보를 전송하기 위해 소켓 프로그래밍을 해왔습니다. DataOutputStream.writeUTF() 문제가 발생했습니다. 최대 64k의 문자열을 허용하는 것으로 보이지만이 상황을 극복 할 수있는 몇 가지 상황이 있습니다. 큰 문자열을 지원하거나 내 자신을 굴릴 필요가있는 좋은 대안이 있습니까?DataOutputStream으로 큰 문자열 작성하기

답변

15

실제로 문자 당 1, 2 또는 3 바이트로 압축하는 알고리즘을 사용하기 전에 2 바이트를 사용하여 문자열의 길이를 씁니다. (java.io.DataOutput의 문서를 참조하십시오.) UTF-8에 가깝지만 문서화되어 있긴하지만 호환성 문제가 있습니다. 쓰려는 데이터의 양에 대해 크게 걱정하지 않는다면, 먼저 문자열의 길이를 쓰고, getBytes 메소드를 사용하여 문자열의 원시 데이터를 쓰면 쉽게 작성할 수 있습니다.

// Write data 
String str="foo"; 
byte[] data=str.getBytes("UTF-8"); 
out.writeInt(data.length); 
out.write(data); 

// Read data 
int length=in.readInt(); 
byte[] data=new byte[length]; 
in.readFully(data); 
String str=new String(data,"UTF-8"); 
+0

API가 있기를 바랬지 만 근본적으로 내가 생각한 것을 확인했습니다. – Glen

2

OutputStreamWriter을 UTF-8 인코딩과 함께 사용할 수 있어야합니다. 명시 적 writeUTF 메소드는 없지만 생성자에서 charset을 설정할 수 있습니다. 시도해보십시오.

Writer osw = new OutputStreamWriter(out, "UTF-8"); 

여기서 out은 현재 포장중인 OutputStream입니다.

7

ObjectOutputStream.writeObject()은 (소스 코드를 통해 확인 된) 긴 문자열을 올바르게 처리합니다.

ObjectOutputStream oos = new ObjectOutputStream(out); 
... other write operations ... 
oos.writeObject(myString); 
... other write operations ... 

가 이런 식으로 읽기 : : 이런 식으로 문자열을 쓰기

ObjectInputStream ois = new ObjectInputStream(in); 
... other read operations ... 
String myString = (String) ois.readObject(); 
... other read operations ... 

DataOutputStream와 또 다른 차이점은 ObjectOutputStream를 사용하여 인스턴스화 할 때 자동으로 4 바이트 스트림 헤더를 기록,하지만 일반적으로 갈 것입니다 지불 할 벌금이 아주 적다.

관련 문제