Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java读取文件并使用DataOutputStream发送_Java_File_Dataoutputstream - Fatal编程技术网

Java读取文件并使用DataOutputStream发送

Java读取文件并使用DataOutputStream发送,java,file,dataoutputstream,Java,File,Dataoutputstream,我正在尝试编写一个小型FTP应用程序,从文件中读取二进制数据并将其发送到客户端。我的程序通常不会按预期运行,通常会发送文件,但不会完全发送(即发送文本文件且内容为空)。我认为这可能是因为我使用filereader来阅读这一行,尽管我不太明白为什么这会是一个问题。 以下是相关代码: File file = new File(rootDirectory, name); int filenum = (int)file.length(); long filelen = file.length(); Sy

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

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

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

问题不是wile循环。

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

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

而不是wile循环。

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

  • (实际上,所有apachecommons都很有趣)。您可以在那里执行
    IOUtils.copy(…)
  • 这是一个稍微复杂一点,但灵活。使用
    ByteSource.copyTo(ByteSink)

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

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

  • (实际上,所有apachecommons都很有趣)。您可以在那里执行
    IOUtils.copy(…)
  • 这是一个稍微复杂一点,但灵活。使用
    ByteSource.copyTo(ByteSink)

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

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

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

其中,
count
是一个
int,
buffer
是任何非零大小的
字节[]
。它不必接近文件的大小。我通常使用8192。

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

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

其中,
count
是一个
int,
buffer
是任何非零大小的
字节[]
。它不必接近文件的大小。我通常使用8192。

请用堆栈跟踪发布错误。为什么要读写同一个文件?我想你的意思是
DataOutputStream bos=newdataoutputstream(socketOut)?你的代码有点让人困惑…对不起,我用它进行测试,我没有使用OutputStream。很抱歉,不清楚:没有错误,例如,当我发送文本文件时,它有两个问题,读卡器读取字符而不是字节,所以你不能发送字节数,然后发送字符。另一个问题是readline可以转换和截断行结尾。只需取消文件InputStream并读取字节[],或使用其中一个IOUTIL来泵送数据。请使用堆栈跟踪发布错误。为什么要读取和写入同一个文件?我想你的意思是
DataOutputStream bos=newdataoutputstream(socketOut)?你的代码有点让人困惑…对不起,我用它进行测试,我没有使用OutputStream。很抱歉,不清楚:没有错误,例如,当我发送文本文件时,它有两个问题,读卡器读取字符而不是字节,所以你不能发送字节数,然后发送字符。另一个问题是readline可以转换和截断行结尾。只需取消FileInputStream并读取byte[]或使用其中一个ioutil来泵送数据。我感觉bufferreader是其中的一部分,感谢您的澄清。虽然如果我将文件读入字符串变量行,然后将其写入字节,这会不会不一样?@James No.string不是二进制数据的容器。我感觉bufferreader是其中的一部分,谢谢你澄清。虽然如果我将文件读入字符串变量行,然后将其作为字节写入,这会不会不一样?@James No.string不是二进制数据的容器。