我正在尝试编写一个迷你FTP应用程序,它从文件中读取二进制数据并将其发送到客户端。我的程序通常不按预期运行,通常最终发送文件,但不完全执行(即发送文本文件,内容为空)。我想这可能是因为我使用文件读取器来读取行,虽然我不太明白为什么这会是一个问题。 以下是相关代码:
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();
}
答案 0 :(得分:2)
问题是读者/作者读取文本(而不是Input~ / OutputStreams)。 FileReader内部使用默认的操作系统编码。这种转换永远不会对二进制文件做。另请注意,readLine会丢弃结束行(\r\n
,\n
或\u0085
)。从Java 7开始,你可以做到
Files.copy(file.toPath(), socketOut);
而不是诡计循环。
答案 1 :(得分:1)
Joop的解决方案非常适合Java7(或更高版本)。如果您遇到旧版本(或者想要扩展您的工具库),请查看以下免费库:
IOUtils.copy(...)
ByteSource.copyTo(ByteSink)
我喜欢Google库中的缓存,非常整洁
答案 2 :(得分:1)
如果您没有Java 7并且不想添加外部库,则Java中用于流的规范复制循环如下:
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
其中count
是int,
而buffer
是任何非零大小的byte[]
。它不必是接近文件大小的任何地方。我通常使用8192。