查看用java中的套接字传输的文件时会出现奇怪的东西
我正在尝试使用java中的套接字传输文件 这是密码 客户端代码 然后返回查看用java中的套接字传输的文件时会出现奇怪的东西,java,sockets,gedit,Java,Sockets,Gedit,我正在尝试使用java中的套接字传输文件 这是密码 客户端代码 然后返回baos.toByteArray(),并使用OutputStream的write方法将其写入文件 服务器代码 问题 当我传输.txt文件并在gedit中查看它时,它会显示文本,后跟多个\00\00\00,但当我使用记事本(葡萄酒中)打开它时,它只显示文本。此外,还可以查看图像和.doc。那么它是与gedit有关还是与我的程序有关 编辑 我发送了一些类似“嗨,希望它能工作!”的信息这就是问题所在(或者至少是个问题): 不管实际
baos.toByteArray()
,并使用OutputStream的write方法将其写入文件
服务器代码
问题
当我传输.txt
文件并在gedit
中查看它时,它会显示文本,后跟多个\00\00\00
,但当我使用记事本(葡萄酒中)
打开它时,它只显示文本。此外,还可以查看图像和.doc
。那么它是与gedit有关还是与我的程序有关
编辑
我发送了一些类似“嗨,希望它能工作!”的信息这就是问题所在(或者至少是个问题):
不管实际读取了多少字节,您总是要写出整个缓冲区。你应该:
int bytesRead;
while ((bytesRead = fis.read(biti, 0, 1024)) != -1)
{
dos.write(biti, 0, bytesRead);
}
(两个代码位都有相同的问题。)
您可能希望了解哪些实用程序方法可以减轻反复编写此类代码的繁琐(以及可能出现的错误)。read方法将返回从流中读取的实际字节数。您应该将其作为写入方法的参数,否则您将向其写入垃圾。放置发送和接收的内容是的,这很有意义,也很有效。非常感谢!
try{
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
DataInputStream din = new DataInputStream (socket.getInputStream());
// check if it is really a file or if it is an existing file
File file = new File(din.readUTF());
// write false
if ( !file.exists() || !file.isFile() ){
dos.writeBoolean(false);
dos.flush();
}
// write true and write the file
else {
byte biti[] = new byte[1024];
dos.writeBoolean(true);
FileInputStream fis = new FileInputStream(file);
while(fis.read(biti,0,1024) != -1){
dos.write(biti,0,biti.length);
}
dos.flush();
try{ fis.close(); } catch (IOException e){}
}
} catch (IOException e){}
finally {
try{socket.close();}catch(IOException e){}
}
while(fis.read(biti,0,1024) != -1)
{
dos.write(biti,0,biti.length);
}
int bytesRead;
while ((bytesRead = fis.read(biti, 0, 1024)) != -1)
{
dos.write(biti, 0, bytesRead);
}