2014-10-02 2 views
0

내 응용 프로그램에서 나는 블루투스를 통해 바이트 스트림을 수신하고있다. 내가 입력 스트림에서 한 번에 바이트의 고정 된 양을 읽을 수 DataInputStream을 사용하고 :InputStream에서 바이트의 청크 읽기

private final InputStream mInStream = ... 
... 
DataInputStream dataInputStream = new DataInputStream(mInStream); 
... 
while(true) { 
... = dataInputStream.readFully(buffer,0,length); 
} 

내가이 BufferedInputStream에 mInStream을 포장하여 성능을 개선하고 DataInputStream에이 BufferedInputStream를 할 수 있나요? 예 :

private final InputStream mInStream = ... 
... 
BufferedInputStream buffInStream = new BufferedInputStream(mInStream); 
DataInputStream dataInputStream = new DataInputStream(buffInStream); 
... 
while(true) { 
... = dataInputStream.readFully(buffer,0,length); 
} 

이 성능이 향상됩니까? 또는 입력 스트림에서 일정한 바이트 수를 읽고 있기 때문에 동일하게 유지됩니까?

감사

답변

1

난은 BufferedInputStream을에 mInStream을 포장하여 성능을 개선하고의 DataInputStream으로이 BufferedInputStream을 넣을 수 있습니까?

당신이 읽고있는 버퍼의 크기에 따라 다릅니다. BufferedInputStream의 기본 내부 버퍼는 8k 바이트입니다. 자신의 버퍼가 이것과 비슷하거나 더 클 경우 이점이 없습니다. 버퍼가 128 또는 256 바이트라고하면 거의 확실합니다.

... = dataInputStream.readFully(buffer,0,length); 

readFully() 값을 반환하지 않습니다. 이 많은 바이트를 정확하게 원한다고 확신 할 때만이 메서드를 사용해야하며 모든 바이트가 입력에 있어야합니다. 나머지 입력이 'length보다 짧으면 EOFException이 표시되고 부분적으로 읽은 데이터는 손실됩니다. 얼마나 많은 데이터를 읽어야하는지 잘 모르겠 으면 read(byte[]) 또는 read(byte[], int, int).

+0

답장을 보내 주셔서 감사합니다. 바이트 스트림에서 고정 길이의 명령을 구문 분석해야하기 때문에 readFully가 필요합니다. readFully를 통해 읽은 각 데이터 프레임의 길이는 최대 128 바이트입니다. 그래서 이것을 정확하게 이해하면 길이가 128 인 버퍼를 만들어야합니다 (최대 명령 길이이기 때문에). 그리고 BufferedInputStrams로 성능을 얻으려면 좋은 크기가 될 것입니다. – Moonlit

+0

이 경우에는 'BufferedInputStream'을 사용해야한다고 생각합니다. 그렇습니다. 하지만 '최대 128 바이트'및 '최대 명령 길이'에 대해 우려하고 있습니다. 기대 한 길이의 * 정확하게 * 버퍼를 사용할 필요가 있거나 각각의 경우 적절한 값의'length' 매개 변수를 제공해야합니다. 항상 128 바이트를 읽는다면 명령어가 더 짧을지라도 항상 '128 바이트'가됩니다. 이는 '많아야'이 의미합니다. – EJP

+0

좋습니다. 문제가되지 않습니다. 그것이 같기 때문에 : 나는 데이터 전송을 시작하기 전에 전송 될 명령의 길이를 안다. 마찬가지로 Ok는 다음 데이터 스트림에서 길이 x의 명령을 모두받습니다. 그래서 길이 x의 버퍼를 만듭니다. 그리고 독서를 시작하십시오. 따라서 길이는 각 데이터 프레임마다 변경되지 않습니다. 응용 프로그램을 재구성 할 때 새로운 명령의 길이와 동일한 다른 길이의 버퍼 어레이를 다시 작성하여 다시 읽기 시작합니다. – Moonlit

관련 문제