我正在尝试使用java中的套接字传输文件
这是代码
try{
// get streams
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
DataInputStream din = new DataInputStream (socket.getInputStream());
dos.writeUTF(fileName);
dos.flush();
boolean isOk = din.readBoolean();
if(!isOk){
throw new StocFileNotFound("Fisierul: " + fileName +" was not found on:" + address.toString());
} else {
baos = new ByteArrayOutputStream();
byte biti [] = new byte[1024];
while(din.read(biti,0,1024) != -1){
baos.write(biti,0,biti.length);
}
}
}
catch(IOException e){}
finally {
try{ socket.close(); } catch (IOException e){}
}
然后我返回baos.toByteArray()
并使用OutputStream的write方法将其写入文件。
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){}
}
当我转移.txt
文件并在gedit
中查看时,它会显示文字后跟多个\00\00\00
,但是当我使用notepad(in wine)
打开它时,它只会显示文本。加上观看图像和.doc
也有效。它是gedit
还是我的程序呢?
编辑 我正在发送类似“嗨,希望它有效!”的内容。
答案 0 :(得分:2)
这是问题(或至少是 问题):
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);
}
(你在两个代码中遇到了同样的问题。)
您可能希望查看具有各种实用工具方法的Guava,以减轻您一遍又一遍地编写此类代码的繁琐(以及可能的错误)。
答案 1 :(得分:0)
read方法将返回从流中读取的实际字节数。你应该使用它作为write方法的参数,否则你将为它写垃圾。