(나는 당신의 예는 독자이며, 입력 스트림 무엇 무엇의 관점에서 깨진 생각하지만 어쨌든 질문 수) 당신은 그런 일을 할 수
을,하지만 당신은 방법을 정확하게 알 필요가 각 구성 요소는 버퍼링과 관련하여 작동합니다.
작업중인 소켓 입력 스트림은 특정 바이트를 한 번만 읽을 수 있습니다 (체크 아웃 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);
이것은 컴파일되지 않습니다 :'InputStreamReader' (문자 기반)에서'(Data) InputStream' (바이트 기반)을 만들 수 없습니다. 런타임시, 버퍼링 문제 (BufferedReader 및 DataInputStream으로 무엇을하고 싶은가?) 때문에 여전히 실패 할 가능성이 높습니다. –