마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

byte 스트림 데이터 읽기 묘수 없을까요?

0 추천
임베디드 디바이스로부터 1초에 11,397회 정도의 byte 데이터가 전송되어 옵니다.

BufferedInputStream을 이용해서 읽는데요,

EOF 처리가 디바이스쪽에서 어렵다해서 파일 사이즈만큼 읽는데

(파일 사이즈를 디바이스쪽에서 던져줌)

 

문제는 해당 파일 사이즈만큼 읽혀지지를 않네요...

그래서 read()하는 메소드에서 blocking이 되 계속 데이터를 대기하는 현상입니다.

 

여러가지 방법을 동원해 봤는데 해결이 잘 안되네요.

무슨 좋은 방법이 없을까요 정녕?

감사합니다.

 

ps.

통신은 블루투스로 하고 있습니다.
UnlimitedJava (910 포인트) 님이 2016년 8월 10일 질문

1개의 답변

+1 추천
 
채택된 답변
제가 답변해줬던 분인거 같은데

디바이스에서 던져준 파일 사이즈와 수신한 파일 사이즈가 일치하는지 확인해보세요.

일치 하신다면 다음을 확인해 보세요.

 

read 함수를 쓰실때 어떻게 쓰시는지 확인이 안되는데 혹시

read(byte[], int, int) 이 방식으로 쓰셨을때

통신 I/O 가 관여되어 있는 read 함수 이기 때문에 3번째 인자인 length만큼 읽히지 않을 수가 있습니다.

그래서 read함수 자체가 실제 읽은 length를 리턴하여 줍니다.

단적으로 예를 들어서

 

byte[] buf = new byte[1024];

int nReadCnt;

nReadCnt = read(buf, 0, buf.length);

 

로 하였을때 실제로 원하시는 nReadCnt값은 1024가 되어야 하겠지만 실제로는 그보다 훨씬 작은 값이 될수도 있다는 얘기입니다. 만약 512가 리턴되었다고 하면 read 함수는 buf변수에 0번째부터 511번째까지만 update 시켜주기 때문에 다음에 받아야할 총 사이즈는 (실제 파일사이즈-1024)가 아닌 (실제 파일사이즈-512)가 되어야 하지요.

이 부분도 확인 해 보시기 바랍니다.
Development Guy (70,570 포인트) 님이 2016년 8월 10일 답변
UnlimitedJava님이 2016년 8월 11일 채택됨
답변 대단히 감사합니다.
정확히 표현하면 임베디드(C로 코딩)쪽에서 그 디바이에서 있는 SD 카드의 파일의 내용을 읽어서
블루투스로 폰쪽으로 던지고 이 블루투스에 연결된 폰에서는 BufferedInputStream으로 읽는 형태입니다.

제가 참 궁금한 건 임베디드쪽에서 던져준 파일 사이즈만큼 for문으로 read()하는데 파일 사이즈만큼 읽지를 못하고 중간에 read()에서 계속 대기하는 현상이 왜 발생하는지 이해가 잘 안가네요 ...
임베디드쪽에서는 파일 사이즈만큼 데이터를 던져 준다고 하고요.
임베디드 쪽 전송 속도는 115200이고요...

코드는 이런 식입니다.
                    for(int i=0; i<fileSize; i++)
                    {
                        try {
                            fileCon = bis.read();   //bis는 BufferedInputStream 객체
                            Log.e("#######", "fileCon "+i+" : "+fileCon);
                        } catch(IOException ie){
                            ie.printStackTrace();
                        }
                    }
왜 read()를 쓰시죠?  read(buff, offset, length) 함수를 쓰는게 더 빠르실텐데요?
bis가 어차피 버퍼를 사용하기 때문에 read()가 문제 없을걸로 생각했던 겁니다.
두 메소드의 속도 차이가 많은가요?
그런데 read(buff, offset, length) 함수로 읽어 봐도 역시 파일 사이즈까지 읽지 못하는건 여전했습니다.
int nRemainSize = 1024;                   //앞으로 받아야할 남아있는 사이즈 (ex 전체 받아야할 사이즈가 1024라고 예를 들었습니다.)


                byte[] buf= new byte[128];
                int nRecvCnt = 0;
                while((nRecvCnt = bis.read(buf, 0, nRemainSize>buf.length ? buf.length : nRemainSize))> 0)
                {
                    //buf의 0부터 (nRecvCnt-1) 인덱스 까지의 값이 유효한 값

                    nRemainSize -= nRecvCnt;
                }

예제입니다.
감사합니다. 일단 다른 데이터가 섞여 들어오는 것은 확인이 됐는데 그게 추측컨데 BufferedInputStream의 버퍼에 남아 있는 데이터가 아닌가 생각됩니다.
...