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

안드로이드 TCP 소켓 통신 read()함수가 -1을 리턴하지않습니다.

0 추천
InputStream in = cSocket.getInputStream();
FileOutputStream fos;
BufferedInputStream br= new BufferedInputStream(in);
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "test" + File.separator +"sample.jpg");
fos=new FileOutputStream(file);
BufferedOutputStream fs=new BufferedOutputStream(fos);
int cnt=0;
while (true){
cnt++;
int s = br.read();
if(s<0)
break;
fs.write(s);
Log.e("error",String.valueOf(s)+","+String.valueOf(cnt));
fs.flush();
                    }

일부러 while문이 얼마나 도는지 확인해보려고 바이트 버퍼를 사용하지않고 돌려서 로그를 찍어보니

파일의 크기와 완전히동일하게 로그가 찍힌걸 확인할수 있었습니다.

그리고 저 코드를 돌림으로써 파일이 생성되었는데

 

이또한 저 파일의 크기와 완전히 동일합니다.

그런데 문제는 BufferedInputStream.read()메서드가 더이상 읽을것이 없으면 -1을 반환한다고 하는데

그래서 while문 무한루프 빠져나가는 조건이 read()의 반환값이 0보다 작게되면 빠져나가도록 했는데

파일을 끝까지 다읽어도 -1을 반환하지않아서 read()가 무한대기에 빠지면서 무한루프에서 빠져나갈수가 없습니다.

바이트스트림은 -1을 반환하는게 아닌가요?

저기서어떻게 조건을 주어야 while문을 빠져나갈수 있을까요,,,

안드잘하고싶 (3,310 포인트) 님이 2016년 4월 28일 질문

1개의 답변

0 추천

while( br.available() > 0 ){

}

위처럼 함 해보세요.

코딩인헬 (12,150 포인트) 님이 2016년 4월 29일 답변
저거 쓰니깐 쓰레드가 시작되자마자 바로 종료되어 버리길레
while(true){
s=br.read();
fs.write(s);
fs.flush();
if(br.available()==0)
break;
}
이렇게 해줘도 스레드 시작과 동시에 종료되어버리네요 ㅠ
http://www.yunsobi.com/blog/351
위 사이트 참고해 보세요.
...