有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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();
}

共 (3) 个答案

  1. # 1 楼答案

    问题是读者/作者阅读文本(而不是输入/输出流)。FileReader在内部使用默认的操作系统编码。这种转换对二进制文件永远不会起作用。还要注意的是,readLine会丢弃以(\r\n\n\u0085)结尾的行。从Java7开始,您可以

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

    而不是诡计循环

  2. # 2 楼答案

    Joop的解决方案非常适合Java7(或更高版本)。如果您仍停留在旧版本上(或者无论如何都想扩展您的工具库),请查看以下免费库:

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

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

  3. # 3 楼答案

    如果您没有Java 7并且不想添加外部库,Java for streams中的规范复制循环如下所示:

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

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