[英]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(或更高版本)。 如果您堅持使用舊版本(或者無論如何要擴展工具庫),請查看以下免費庫:
IOUtils.copy(...)
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.