Java从文件读取并使用DataOutputStream发送

时间:2014-05-07 23:22:51

标签: java file dataoutputstream

我正在尝试编写一个迷你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();
}

3 个答案:

答案 0 :(得分:2)

问题是读者/作者读取文本(而不是Input~ / OutputStreams)。 FileReader内部使用默认的操作系统编码。这种转换永远不会对二进制文件做。另请注意,readLine会丢弃结束行(\r\n\n\u0085)。从Java 7开始,你可以做到

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

而不是诡计循环。

答案 1 :(得分:1)

Joop的解决方案非常适合Java7(或更高版本)。如果您遇到旧版本(或者想要扩展您的工具库),请查看以下免费库:

  • Apache Commons IO(实际上所有的Apache Commons都很有趣)。在那里你可以IOUtils.copy(...)
  • Google Guava它有点复杂但灵活。使用ByteSource.copyTo(ByteSink)

我喜欢Google库中的缓存,非常整洁

答案 2 :(得分:1)

如果您没有Java 7并且不想添加外部库,则Java中用于流的规范复制循环如下:

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

其中countint,buffer是任何非零大小的byte[]。它不必是接近文件大小的任何地方。我通常使用8192。