Java读取文件并使用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();
}
# 1 楼答案
问题是读者/作者阅读文本(而不是输入/输出流)。FileReader在内部使用默认的操作系统编码。这种转换对二进制文件永远不会起作用。还要注意的是,readLine会丢弃以(
\r\n
、\n
或\u0085
)结尾的行。从Java7开始,您可以而不是诡计循环
# 2 楼答案
Joop的解决方案非常适合Java7(或更高版本)。如果您仍停留在旧版本上(或者无论如何都想扩展您的工具库),请查看以下免费库:
IOUtils.copy(...)
ByteSource.copyTo(ByteSink)
我喜欢谷歌库中的缓存,非常整洁
# 3 楼答案
如果您没有Java 7并且不想添加外部库,Java for streams中的规范复制循环如下所示:
其中
count
是int,
,而buffer
是任何非零大小的byte[]
。它不必接近文件的大小。我通常使用8192