2011-02-22 187 views
2

我試圖找到一種方法發送不同文件類型的文件從服務器到客戶端。發送文件從服務器到Java客戶端

我在服務器上的代碼把文件轉換成字節數組:

File file = new File(resourceLocation); 

byte[] b = new byte[(int) file.length()]; 
FileInputStream fileInputStream; 
try { 
    fileInputStream = new FileInputStream(file); 
    try { 
    fileInputStream.read(b); 
    } catch (IOException ex) { 
    System.out.println("Error, Can't read from file"); 
    } 
    for (int i = 0; i < b.length; i++) { 
    fileData += (char)b[i]; 
    } 
} 
catch (FileNotFoundException e) { 
    System.out.println("Error, File Not Found."); 
} 

我再發FILEDATA作爲一個字符串到客戶端。這對txt文件很好,但是當涉及到圖像時,我發現雖然它會在數據中創建好文件,但圖像不會打開。

我不確定我是否會以正確的方式進行。 感謝您的幫助。

+0

感謝迄今爲止的答案,試着你們現在說的話。 – Undefined 2011-02-22 23:10:36

回答

1

如果您正在讀取/寫入二進制數據,您應該使用字節流(InputStream/OutputStream)而不是字符流,並儘量避免字節和字符之間的轉換,就像您在示例中所做的那樣。

您可以使用下面的類從一個InputStream複製字節到OutputStream:

public class IoUtil { 

    private static final int bufferSize = 8192; 

    public static void copy(InputStream in, OutputStream out) throws IOException { 
     byte[] buffer = new byte[bufferSize]; 
     int read; 

     while ((read = in.read(buffer, 0, bufferSize)) != -1) { 
      out.write(buffer, 0, read); 
     } 
    } 
} 

你不給你如何與客戶端連接的太多細節。這是一個最簡單的例子,展示瞭如何將一些字節傳送到一個servlet的客戶端。 (您需要在響應中設置一些標題並適當地釋放資源)。

public class FileServlet extends HttpServlet { 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     // Some code before 

     FileInputStream in = new FileInputStream(resourceLocation); 
     ServletOutputStream out = response.getOutputStream(); 

     IoUtil.copy(in, out); 

     // Some code after 
    } 
} 
2

不要把它放到字符串中並用char轉換。只需讓你的套接字寫入你從文件輸入流獲得的字節數組。

相關問題