2014-01-20 101 views
0

我試圖下載youtube視頻(使用像keepvid一樣的鏈接)。我得到的文件比通過瀏覽器下載的文件大4kB,無法播放。有人可以告訴我爲什麼,我做錯了什麼? 此外,當我一行一行地打印兩個文件時,它們顯示相同的數據。下面用於下載的代碼。 謝謝。You Tube Downloader

  try { 
      URL hr= new URL("link"); 
      URLConnection conn= hr.openConnection(); 
      conn.setRequestProperty("Uzer-Agent", "Mozilla/5.0"); 
      conn.connect(); 


      BufferedReader br=new BufferedReader(new InputStreamReader(conn.getInputStream())); 

      File file=new File("video.flv"); 
      PrintWriter pw=new PrintWriter(new FileWriter(file)); 

      String line=""; 

      while((line=br.readLine())!=null){ 

       System.out.println(line); 

       pw.println(line); 

       } 

      pw.close(); 
       } catch (Exception e){} 
+2

首先,我會用'User-Agent'修復'Uzer-Agent'。然後,你不應該試圖用'PrintWriter'來寫文本的二進制文件。改用'OutputStream'。 –

+2

「我得到的文件比通過瀏覽器下載的文件大4kB」「它們顯示的是相同的數據」---這兩個語句不一致。 –

+0

線分隔符? – vikingsteve

回答

0

是啊,雖然讀可能br.readLine()(不知道,我會跟br.read(char[ 4096 ], off, len)閱讀它來完成,但與pw.println寫作肯定是不對的,因爲它增加了每行的最後一個換行符 - 東西你不想在二進制文件中看到。

我把它像

char[] buff = new char[ 4096 ]; 
int offset = 0; 
while(-1 != br.read(buff, offset, 4096)){ 
    pw.write(buff); 
    offset += 4096; 
} 

您也可以使用輸入/輸出流在這裏,因爲你不需要做一個字符-conversions。

+0

字符流必須避免,不是因爲您不需要*字符轉換,而是因爲您*不能使用*字符轉​​換。這不是免費的選擇。 –

+0

我首先會選擇流媒體(不是讀者/寫作者),但我認爲,在大多數情況下,讀者/作者可以很好地工作,當然還有一些開銷。如果你與二進制數據一起下載一些UTF-8編碼文本 - 這就是閱讀器/寫入將變得方便的地方,這可能會變得棘手。 – injecteer

+0

使用字符流讀取/寫入二進制數據根本沒有意義---除此之外,它不可靠。關於二進制數據和UTF-8編碼文本之間的區別的觀點是無效的:如果使用字符流,它將* everything *視爲UTF-8編碼文本(或任何編碼有效),這正是它錯了。 –

0

,好像他們是文本文件,使用readLine()等不能讀取二進制文件(如flv)。您必須分別在InputStreamOutputStream中分別使用未格式化的read()write()方法。

相關問題