Java读取文件并使用DataOutputStream发送
我正在尝试编写一个小型FTP应用程序,从文件中读取二进制数据并将其发送到客户端。我的程序通常不会按预期运行,通常会发送文件,但不会完全发送(即发送文本文件且内容为空)。我认为这可能是因为我使用filereader来阅读这一行,尽管我不太明白为什么这会是一个问题。 以下是相关代码: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
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不是二进制数据的容器。