Android загружает двоичные файлы

У меня возникают проблемы с загрузкой бинарного файла (видео) в моем приложении из Интернета. В Quicktime, если я загружаю его напрямую, он отлично работает, но через мое приложение каким-то образом его перепутали (хотя они выглядят точно так же в текстовом редакторе). Вот пример:

URL u = new URL("http://www.path.to/a.mp4?video"); HttpURLConnection c = (HttpURLConnection) u.openConnection(); c.setRequestMethod("GET"); c.setDoOutput(true); c.connect(); FileOutputStream f = new FileOutputStream(new File(root,"Video.mp4")); InputStream in = c.getInputStream(); byte[] buffer = new byte[1024]; int len1 = 0; while ( (len1 = in.read(buffer)) > 0 ) { f.write(buffer); } f.close(); 

6 Solutions collect form web for “Android загружает двоичные файлы”

Я не знаю, является ли это единственной проблемой, но у вас есть classический глюк Java: вы не рассчитываете на то, что read () всегда разрешено возвращать меньше байтов, чем вы просите. Таким образом, ваше чтение может получить меньше 1024 байт, но ваша запись всегда выдает ровно 1024 байта, включая байты из предыдущей итерации цикла.

Исправить:

  while ( (len1 = in.read(buffer)) > 0 ) { f.write(buffer,0, len1); } 

Возможно, более высокие задержки или меньшие размеры пакетов 3G на Android усугубляют эффект?

 new DefaultHttpClient().execute(new HttpGet("http://www.path.to/a.mp4?video")) .getEntity().writeTo( new FileOutputStream(new File(root,"Video.mp4"))); 

Одна из проблем – это чтение буфера. Если каждое чтение входного streamа не является точным кратным 1024, вы скопируете плохие данные. Использование:

 byte[] buffer = new byte[1024]; int len1 = 0; while ( (len1 = in.read(buffer)) != -1 ) { f.write(buffer,0, len1); } 
  public class download extends Activity { private static String fileName = "file.3gp"; private static final String MY_URL = "Your download url goes here"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); try { URL url = new URL(MY_URL); HttpURLConnection c = (HttpURLConnection) url.openConnection(); c.setRequestMethod("GET"); c.setDoOutput(true); c.connect(); String PATH = Environment.getExternalStorageDirectory() + "/download/"; Log.d("Abhan", "PATH: " + PATH); File file = new File(PATH); if(!file.exists()) { file.mkdirs(); } File outputFile = new File(file, fileName); FileOutputStream fos = new FileOutputStream(outputFile); InputStream is = c.getInputStream(); byte[] buffer = new byte[1024]; int len1 = 0; while ((len1 = is.read(buffer)) != -1) { fos.write(buffer, 0, len1); } fos.flush(); fos.close(); is.close(); } catch (IOException e) { Log.e("Abhan", "Error: " + e); } Log.i("Abhan", "Check Your File."); } } 

Я исправил код на основе предыдущих обратных связей в этой теме. Я тестировал, используя eclipse и несколько больших файлов. Он работает нормально. Просто скопируйте и вставьте это в свою среду и измените http-путь и местоположение, в которое вы хотите загрузить файл.

 try { //this is the file you want to download from the remote server String path ="http://localhost:8080/somefile.zip"; //this is the name of the local file you will create String targetFileName boolean eof = false; URL u = new URL(path); HttpURLConnection c = (HttpURLConnection) u.openConnection(); c.setRequestMethod("GET"); c.setDoOutput(true); c.connect(); FileOutputStream f = new FileOutputStream(new File("c:\\junk\\"+targetFileName)); InputStream in = c.getInputStream(); byte[] buffer = new byte[1024]; int len1 = 0; while ( (len1 = in.read(buffer)) > 0 ) { f.write(buffer,0, len1); } f.close(); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

Удачи Alireza Aghamohammadi

Просто используйте метод копирования Apache ( Apache Commons IO ) – преимущество использования Java!

 IOUtils.copy(is, os); 

Не забудьте закрыть streamи в блоке finally:

 try{ ... } finally { IOUtils.closeQuietly(is); IOUtils.closeQuietly(os); } 
  • Широковещательный приемник для проверки подключения к Интернету в приложении Android
  • Уменьшение размера приложения для Android (apk)
  • Неверная версия хранилища ключей при вызове android
  • Как нарисовать круг на canvasе в Android?
  • Android разнородный gridview как pinterest?
  • Ограничения внешнего ключа в Android с помощью SQLite? on Удалить каскад
  • BitmapFactory.decodeStream возвращает значение null при настройке параметров
  • Неудачное обнаружение службы с использованием Bluetooth на Android
  • Пользовательские шрифты и XML-макеты (Android)
  • Android-импорт java.nio.file.Files; не может быть решен
  • Android Row становится Unclickable с кнопкой
  • Interesting Posts

    Как создать ярлык, который задает переменную окружения, а затем запускает программу, не открывая окно CMD?

    Вычистите компьютер, переустановите драйверы видеокарты?

    Если страница «забыл пароль?» Отправляет ваш старый пароль, является ли это окончательным доказательством того, что они сохранили его в виде обычного текста?

    Стиль ошибки проверки в WPF, аналогичный Silverlight

    git add –interactive “Ваш отредактированный кусок не применяется”

    Невозможно создать модель данных сущности – с помощью MySql и EF6

    Внедрение луча

    Почему множественное наследование не разрешено в Java или C #?

    Запросы против фильтров

    Разница между дозой и в Clojure

    Высокое использование ЦП «Система» и «Системные прерывания» (вызванное ACPI.sys)

    Как убрать щебетать Twitter-загрузчика, нажав на него?

    Как разрешить пользователям проверять последнюю версию приложения внутри приложения?

    jQuery Ajax дождитесь загрузки всех изображений

    Преобразование .NET Ticks в SQL Server DateTime

    Давайте будем гением компьютера.