2011-10-23 3 views
1

난 그냥 방황 :사용 하나의 InputStream (BufferedReader로 같은,의 DataInputStream)

InputStreamReader in = new InputStreamReader(socket.getInputStream()); 
BufferedReader reader = new BufferedReader(in); 
DataInputStream dis = new DataInputStream(in); 

지금 내가 BufferedReader로 읽고 싶습니다. 특정 명령 (그냥 문자열)이 도착하면 DataInputStream에서 계속 읽으 려합니다.

이 방법이 효과가 있습니까? 그렇다면 좋든 나쁘 든 연습으로 간주됩니까?

+1

이것은 컴파일되지 않습니다 :'InputStreamReader' (문자 기반)에서'(Data) InputStream' (바이트 기반)을 만들 수 없습니다. 런타임시, 버퍼링 문제 (BufferedReader 및 DataInputStream으로 무엇을하고 싶은가?) 때문에 여전히 실패 할 가능성이 높습니다. –

답변

5

(나는 당신의 예는 독자이며, 입력 스트림 무엇 무엇의 관점에서 깨진 생각하지만 어쨌든 질문 수) 당신은 그런 일을 할 수

을,하지만 당신은 방법을 정확하게 알 필요가 각 구성 요소는 버퍼링과 관련하여 작동합니다.

작업중인 소켓 입력 스트림은 특정 바이트를 한 번만 읽을 수 있습니다 (체크 아웃 InputStream.markSupported()). 해당 입력 스트림을 BufferedInputStream에 랩핑하면 몇 바이트 앞서 효과적으로 읽지 만 mark()reset() 기능을 추가 할 수도 있습니다.

즉, BufferedInputStream 상단의 모든 리더/입력 스트림은 앞뒤로 읽거나, 건너 뛰거나 뒤로 건너 뛸 수 있습니다. 그러나 여기에서는 "버퍼"의 다른 레이어를 추가하지 않도록주의해야합니다. 즉 BufferedReader>InputStreamReader>BufferedInputStream>InputStream.

대답은 '예'입니다. 작동하도록 만들 수 있습니다. 모든 구성 요소의 정확한 동작을 알고 있습니다 (나는 종종 BufferedXXX을 던지는 사람들을 보게됩니다).

당신의 예에서 나는 할 것이다 :

BufferedInputStream in = new BufferedInputStream(socket.getInputStream()); 
InputStreamReader reader = new InputStreamReader(in, "utf-8"); // consider char encoding 
DataInputStream dis = new DataInputStream(in); 
2

이 작동하지 않습니다.

버퍼 판독기는 버퍼를 읽고이를 행으로 구문 분석합니다. 예를 들어 2 라인과 1/2 라인이 있다면 페이로드 스트림 마커를 그 위치로 옮길 것입니다. 이제 라인을 읽고 DataInputStream을 사용하여 long 값을 읽는 것으로 결정합니다. 이 코드는 페이로드 스트림의 위치 (2.5 줄 이후)에서이 값을 읽으려고 시도합니다. 하지만 첫 번째 줄 다음에있는 번호를 읽고 싶었습니다.

이 예제는 왜이 아이디어가 좋은 연습이 아니며 또한 설명한다고 생각합니다. Java 스트림은 데코레이터 (래퍼) 패턴을 구현합니다. 각 스트림은 자체 기능을 추가합니다. 동일한 "실제"스트림을 여러 래퍼로 래핑하려는 시도가이 캡슐화를 중단하려는 시도처럼 보입니다.