2016-02-14 2 views
0

У меня есть ссылка mp3, которую я хочу скачать из java только для тестирования. Вот что я код для этогоЗагрузка файла в Java

private void saveFile() throws Exception{ 
     System.out.println("Opening InputStream."); 
     InputStream is = fileUrlConnection.getInputStream(); 
     System.out.println("Total: "+is.available()+" bytes"); 
     FileOutputStream fos = new FileOutputStream(new File("hello.mp3")); 
     byte[] buffer = new byte[1024]; 
     while (is.read(buffer)!= -1) { 
      fos.write(buffer); 
     } 
     is.close(); 
     fos.close(); 
    } 

Вышеуказанный метод выдает исключение после нескольких вызовов.

java.net.SocketException: Unexpected end of file from server 
    at sun.net.www.http.HttpClient.parseHTTPHeader(Unknown Source) 
    at sun.net.www.http.HttpClient.parseHTTP(Unknown Source) 
    at sun.net.www.http.HttpClient.parseHTTPHeader(Unknown Source) 
    at sun.net.www.http.HttpClient.parseHTTP(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) 
    at com.jwc.FileSaver.saveFile(FileSaver.java:24) 
    at com.jwc.FileSaver.run(FileSaver.java:39) 
    at java.lang.Thread.run(Unknown Source) 
+0

Откуда вы знаете, что это не проходит мимо этой линии? Вызывает ли 'getInputStream' исключение? Кстати. 'is.read()' возвращает количество прочитанных байтов. Вы не можете просто игнорировать это число. – SpiderPig

+0

извините, но это исключение. любезно взгляните на мой вопрос еще раз спасибо –

+0

Вы должны поймать исключение, а затем вы можете либо загрузить файл снова, либо надеяться, что он будет полным, несмотря на эту ошибку. Вы также можете попытаться возобновить загрузку в момент ее остановки, как объяснено в этом вопросе. http://stackoverflow.com/questions/3411480/how-to-resume-an-interrupted-download – SpiderPig

ответ

0

Попробуйте следующий код, он должен работать:

BufferedInputStream in = null; 
FileOutputStream fout = null; 
try { 
    in = fileUrlConnection.getInputStream(); 
    fout = new FileOutputStream(new File("hello.mp3")); 

    final byte data[] = new byte[1024]; 
    int count; 
    while ((count = in.read(data)) != -1) { 
     fout.write(data, 0, count); 
    } 
} finally { 
    if (in != null) { 
     in.close(); 
    } 
    if (fout != null) { 
     fout.close(); 
    } 
} 
0

Если вы используете наконец Java 7, вы можете использовать Files.copy. Пример, приведенный там exacly, что вы хотите: «... для захвата веб-страницы и сохранить его в файл»

try (InputStream is = fileUrlConnection.getInputStream()) { 
     Files.copy(is, Paths.get("hello.mp3")); 
    } 
0

Я предлагаю использовать New IO, чтобы решить этот вопрос:

import java.io.IOException; 
import java.net.URL; 
import java.net.URLConnection; 
import java.nio.ByteBuffer; 
import java.nio.channels.Channels; 
import java.nio.channels.ReadableByteChannel; 
import java.nio.channels.SeekableByteChannel; 
import java.nio.file.Files; 
import java.nio.file.Paths; 
import java.nio.file.StandardOpenOption; 
public class Main { 
    public static void main(String[] args) throws IOException { 
     URL url = null; 
     ReadableByteChannel in = null; 
     SeekableByteChannel out = null; 
     try { 
      url = new URL("https://img1.goodfon.ru/original/3216x2072/f/56/samoed-sobaka-belaya-yazyk-trava.jpg"); 
      URLConnection cc = url.openConnection(); 
      in = Channels.newChannel(cc.getInputStream()); 
      out = Files.newByteChannel(Paths.get("dog.jpg"), StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.CREATE); 
      ByteBuffer buf = ByteBuffer.allocate(1024); 
      while (in.read(buf) != -1) { 
       buf.flip(); 
       out.write(buf); 
       buf.rewind(); 
       buf.limit(buf.capacity()); 
      } 
     } finally { 
      if (in != null) 
       in.close(); 
      if (out != null) 
       out.close(); 
     } 
    } 
} 
Смежные вопросы