Входной поток Java заблокирован

#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.