#java #inputstream
#ява #входной поток #java
Вопрос:
У меня небольшая проблема с моим входным потоком.
Вот код :
public byte[] getBytes(InputStream in) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
int read = 0;
byte[] buffer = new byte[1024];
while ( 0 < (read = in.read(buffer))) {
Log.v(TAG,"buffering...");
out.write(buffer,0,read);
Log.v(TAG, "bufffered data size : " out.size());
}
Log.v(TAG, "close out");
out.close();
Log.v(TAG, "getBytes finish");
return out.toByteArray();
}
В моих журналах у меня есть «буферизация …» и размер данных до длины массива байтов, который я отправляю, но когда размер равен максимальному, ничего не происходит. Ни ошибки, ни сбоя, просто ничего, например, если мы останемся в while без создания цикла…
У кого — нибудь есть какие — нибудь идеи ?
И … извините за мой английский.
Редактировать:
Я добавил
if(is.available()==0){
Log.v(TAG, "time to sleep");
Thread.sleep(200);
if(is.available()==0)
break;
}
в конце моего времени и это сработает !
Спасибо вам за вашу помощь , ребята !
Комментарии:
1.
read
может блокироваться до тех пор, пока не будет доступен ввод.2. Что вы передаете как
InputStream in
? Если это сокет, он может просто ожидать поступления дополнительных данных.3. посмотрите на этот пример! java2s.com/Tutorial/Java/0180__File/GetbytesfromInputStream.htm
4. @JimGarrison Я передаю массив байтов по Bluetooth.
5. @Aayush Я смотрю на это и возвращаюсь.
Ответ №1:
Ну, in.read(buffer)
будет блокировать до тех пор, пока не получит данные, не дойдет до конца файла или не будет выдано исключение (отсюда). Я предполагаю, что он все еще просто ожидает дополнительных входных данных от InputStream.
Кроме того, вы должны закрыть входной поток после завершения чтения из него.
Комментарии:
1. Как я могу узнать , завершено ли чтение ? Я вижу это в журналах, но я не знаю размер данных раньше. Я переношу растровое изображение, поэтому размер отличается.
2. Я попытался добавить if(is.available()>0) break; в конце while, но это прерывает цикл до его завершения.
3. В большинстве случаев файлы содержат некоторые метаданные, которые описывают размер файла… Вы также можете просто продолжать считывать байты и сохранять их в какой-то динамически изменяемой структуре данных, например ArrayList.