簡體   English   中英

Java從文件讀取並使用DataOutputStream發送

[英]Java reading from file and sending using DataOutputStream

我正在嘗試編寫一個微型FTP應用程序,該應用程序從文件中讀取二進制數據並將其發送到客戶端。 我的程序通常表現不理想,通常會發送文件,但未完全完成(即發送文本文件且內容為空白)。 我認為可能是因為我使用filereader來讀取該行,盡管我不太清楚為什么會出現問題。 以下是相關代碼:

File file = new File(rootDirectory, name);
int filenum = (int)file.length();
long filelen = file.length();
System.out.println("File is: " + filenum + " bytes long");
socketOut.writeLong(filelen);
fileIn = new BufferedReader(new FileReader(file));
System.out.println("Sending: " + name);

while((line = fileIn.readLine()) != null){
       socketOut.writeBytes(line);
       socketOut.flush();
}

問題在於,讀取器/寫入器讀取文本(與Input〜/ OutputStreams相反)。 FileReader在內部使用默認的操作系統編碼。 該轉換永遠不會對二進制文件進行。 還要注意,readLine丟棄行尾( \\r\\n\\n )。 從Java 7開始,您可以執行

Files.copy(file.toPath(), socketOut);

而不是惡意循環。

Joop的解決方案非常適合Java7(或更高版本)。 如果您堅持使用舊版本(或者無論如何要擴展工具庫),請查看以下免費庫:

  • Apache Commons IO (實際上所有Apache Commons都很有趣)。 在那里您可以執行IOUtils.copy(...)
  • Google Guava有點復雜但靈活。 使用ByteSource.copyTo(ByteSink)

我喜歡Google圖書館中的緩存,非常簡潔

如果您沒有Java 7並且不想添加外部庫,則Java中流的規范復制循環如下:

while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}

其中count是一個int,buffer是任何非零大小的byte[] 它不必在文件大小附近。 我通常使用8192。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM