2015-11-21 1 views
2

У меня есть InputStream, установленный на URL-адрес сырого текстового файла, размещенного в Интернете. Каждая строка представляет собой другое высказывание, и метод должен получать текст из файла и сохранять его в папку кеша для использования в приложении. Нет проблем с подключением к URL-адресу, в противном случае в журналах будет обнаружено FileNotFoundException (проверено это), а файл кэша создается, но он ничего не сохраняет в кэш-файле (имеет разрешения, тоже проверял). Что вызывает это?InputStream подключается к URL-адресу, но ничего не возвращает

код для чтения страницы:

protected Void doInBackground(Void... Params) { 
    try { 
     File quote = new File("Absolute path to cache"); 
     URL url = new URL("URL of file"); 
     InputStream is = url.openStream(); 
     OutputStream os = new FileOutputStream(quote); 
     byte[] buffer = new byte[is.available()]; 
     is.read(buffer); 
     os.write(buffer); 
     is.close(); 
     os.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 
+0

Классическое неправильное использование 'available()', и тот, который специально предупрежден в Javadoc. – EJP

+0

«Нет проблем с подключением к URL-адресу, иначе это даст FileNotFoundException». Нет. Это даст исключение SocketTimeoutException. – greenapps

+0

@greenapps Неправильно. Это дало бы «ConnectException», если соединение не удалось, «FileNotFoundException», если статус HTP был 404, оба из которых являются проблемами с URL-адресом и «SocketTimeoutException», если он установил тайм-аут чтения, и он был запущен. – EJP

ответ

1

В зависимости от соединения, is.available() могут или не могут быть доступны - функция будет возвращать ноль, и в результате вы не писать ничего в выходной поток.

Лучший способ сделать это - прочитать, пока больше данных не будет прочитано - например. см. here.

+0

О, я вижу. Теперь у меня проблема. Однако вместо вашей реализации я использовал только фиксированный 1024-байтовый буфер. Работает отлично, спасибо – zXTechnoWolf

-1

Попробуйте это.

@Override 
    protected void doInBackground(Void... Params) { 
     try{ 
     File quote = new File("Absolute path to cache"); 
     URL url = new URL("URL of file"); 
     HttpURLConnection httpCon = 
     (HttpURLConnection) url.openConnection(); 

     if(httpCon.getResponseCode() != 200) 
      throw new Exception("Failed to connect"); 
     } 

     InputStream is = httpCon.getInputStream(); 
     OutputStream os = new FileOutputStream(quote); 
     byte[] buffer = new byte[is.available()]; 
     is.read(buffer); 
     os.write(buffer); 
     is.close(); 
     os.close(); 

     }catch(Exception e){ 
     e.printTrackTrace(); 
     } 
     return null; 
    } 
+0

Это не помогло бы - см. Мой ответ выше. – Melllvar

+0

Попробуйте, почему? Какое выгодное изменение имеет это? Вы должны объяснить. Простого кода недостаточно. Ничто здесь не устраняет основную проблему. – EJP