2011-03-20 4 views
0

내가 자바 프로그램을 읽고있다, 그것은 aways를 보내기 전에 바이트 배열을 문자열로 변환 :왜 문자열을 바이트로 보내기 전에 변환합니까? 이 소켓을 통해 메시지를 보낼 때

public static void write(String msg, OutputStream out) { 
    out.write (msg.getBytes("ASCII")); 
} 

을 나는 C++ 프로그래머입니다 때문에, 나는 이점이 무엇인지 모른다 자바에서 이렇게하려면. 아무도 말해 줄 수 없습니까?

답변

2

Java의 문자열 유형은 유니 코드입니다. 문자열은 바이트가 아닌 일련의 문자 (실제로 "코드 포인트")입니다. 네트워크를 통해 올바르게 전송하려면 코드 포인트 (약 백만 개가 있음)를 바이트로 표시하는 방법에 대한 규칙이 필요합니다. 그러나 문자열이 완전히 ASCII임을 알게되면 게시 된 코드에서와 같이 모든 코드 포인트가 단일 바이트에 들어 맞다고 가정하면 간단한 방법을 사용할 수 있습니다.

0

Java에서 문자열은 항상 내부적으로 유니 코드입니다. 따라서 다른 언어의 "chars"와 같이 8 비트 ASCII와 같은 "원시"표현이 없기 때문에 인코딩하지 않고 이진 스트림에 직접 문자열을 쓸 수는 없습니다.

0

소켓 (시스템 수준)은 바이트를 처리하기 때문에. C 또는 C++ 또는 시스템 소켓 라이브러리를 사용하는 다른 프로그램과 동일합니다.

BufferedWriter out = 
    new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())); 

의 BufferedWriter가 write(String s, int off, int len) 방법을 포함 : 멀리, 예를 들어 자바에서

, 그러나, 당신은 할 수 있습니다 추상적 인.

1

소켓이 OutputStream을 사용하여 바이트를 쓰도록 설계 되었기 때문에. OutputStream 용 JavaDoc은 다음을 나타냅니다.

출력 스트림은 출력 바이트 을 받아 들여 일부 싱크에 보냅니다. C++ 문자열 달리

는 형식 UTF-16으로 표현되는 문자의 시퀀스 java.lang.CharSequence 아닌 (C++ 등) ASCII 문자 바로 배열된다. 이제부터 String을 원하는 인코딩 (사용자의 경우 ASCII로)으로 인코딩해야하는 이유가 있습니다.

+0

C++은 유니 코드 문자열을 완벽하게 사용할 수 있습니다. Java가 String/CharSequence와 C++ char *을 가지고 있다는 사실은 무의미합니다. 이 질문은 문자 인코딩과 문자를 바이트로 변환하는 것에 관한 것입니다. 유니 코드 문자열 유형을 사용하는 경우 C++에도 존재하는 문제입니다. – dty

0

문자열을 직접 스트림에 쓸 수 있지만 ObjectOutputStream이라는 특별한 유형의 '필터링'스트림을 사용해야합니다. 이 사용 물론

ObjectOutputStream oos = new ObjectOutputStream(outputStream); 
oos.writeObject("Foo"); 

은 문자열은 단지 바이트의 배열과 같은 형식의,하지만 ObjectInputStream를 알아야 독점 형식을 사용하지 않습니다. 이 Stream 형은, String 뿐만이 아니고, 임의의 Serializable 객체를 기입하기 위해서 사용할 수 있습니다.

관련 문제