2012-04-21 91 views
-2

我有自定義套接字客戶端服務器。現在,當我傳輸二進制文件時,有些字節會轉換爲超出範圍的字符。所以我用十六進制字符串發送它們。這樣可行。但是對於另一個問題,這不是解決方案。通過套接字或http下載圖像

當我從網上下載圖片時,會發生同樣的事情。有些字節變成別的東西。我按字節比較了字節。 轉換爲字符串顯示?而不是符號。我曾試過讀者和字節數組輸入流。我已經在網上嘗試過所有的例子。我可以做什麼錯誤?

更新(回答接受):

檢查您發送或接收對象的啞劇。如果它是一個二進制文件,請使用InputStream | OutputStream和派生類,當文本時,使用Reader |作家和派生類。

不要使用讀者和作家下載的二進制文件,像我一樣(文本這隻作品,然後你必須使用十六進制字符串,增加了性能問題):

void saveFile(String strFileName){ 


try{ 
     URL url = new URL(strImageRoot + strFileName); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream())); 
     BufferedWriter bw = new BufferedWriter(new FileWriter(strImageDownloadPath + strFileName)); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      bw.write(line); 
     } 
    }catch(FileNotFoundException fnfe){ 
     System.out.println("FileNotFoundException occured!!!"); 
    }catch(IOException ioe){ 
    }catch(Exception e){ 
     System.out.println("Exception occured : " + e); 
    }finally{ 
     System.out.println("Image downloaded!!!"); 
    } 
} 
+2

發表您的代碼.. – 2012-04-21 06:07:28

回答

1

使用此代碼

  File root = android.os.Environment.getExternalStorageDirectory();    

      File dir = new File (root.getAbsolutePath() + "/image"); 
      if(dir.exists()==false) { 
       dir.mkdirs(); 
      } 

      URL url = new URL("http://4.bp.blogspot.com/-zqJs1fVcfeY/TiZM7e-pFqI/AAAAAAAABjo/aKTtTDTCgKU/s1600/Final-Fantasy-X-Night-Sky-881.jpg"); 
      //URL url = new URL(DownloadUrl); 
      //you can write here any link 
      File file = new File(dir,"Final-Fantasy-X-Night-Sky-881.jpg"); 



      long startTime = System.currentTimeMillis(); 


      //Open a connection to that URL. 
      URLConnection ucon = url.openConnection(); 


      //* Define InputStreams to read from the URLConnection. 

      InputStream is = ucon.getInputStream(); 
      BufferedInputStream bis = new BufferedInputStream(is); 


      //* Read bytes to the Buffer until there is nothing more to read(-1). 

      ByteArrayBuffer baf = new ByteArrayBuffer(6000); 
      int current = 0; 
      while ((current = bis.read()) != -1) { 
       baf.append((byte) current); 
      } 


      //Convert the Bytes read to a String. 
      FileOutputStream fos = new FileOutputStream(file); 
      fos.write(baf.toByteArray()); 
      fos.flush(); 
      fos.close(); 
+0

感謝。本文有助於理解何時使用以及何時從其他位置下載文件:http://docs.oracle.com/javase/tutorial/essential/io/file.html – 2014-07-31 06:29:21

0

當我構建一個Socket客戶端服務器應用程序時,我遇到了類似的問題。字節將是一些奇怪的字符,我嘗試了各種各樣的事情來嘗試和比較它們。然後我遇到了一個討論,其中some1指出我應該使用datainputstream,dataoutstream,並讓它進行字節間的轉換。完全爲我工作。我從來沒有觸及過字節。