我编写了一个java代码,它使用.exe
和FileInputStream
从服务器向客户端发送BufferedInputStream
文件,但文件在客户端损坏。
可能是什么原因?
command1= ServerFrame.msg1+".exe";
File p=new File(command1);
FileInputStream f=new FileInputStream(p);
BufferedInputStream bis=new BufferedInputStream(f);
Integer d=bis.available();
int d1=d;
byte b[]=new byte[d];
bis.read(b,0,d1);
System.out.println(d1);
dos=new DataOutputStream(s.getOutputStream());
BufferedOutputStream bos=new BufferedOutputStream(s.getOutputStream());
dos.writeUTF(d.toString()); // sending length in long
bos.write(b,0,d1); // sending the bytess
bos.flush();
bis.close();
bos.close();
dos.close();
答案 0 :(得分:2)
我认为s
是你的套接字。您的代码中很少有东西可以使用:
bis.available()
返回没有bocking可以读取的字节数,而不是文件的总大小,你应该使用循环来读取文件以下是您打算做的事情:
private void copy(InputStream in, OutputStream out) {
byte[] buf = new byte[0x1000];
int r;
while ((r = in.read(buf)) >= 0) {
out.write(b, 0, r);
}
}
InputStream in = new BufferedInputStream(new FileInputStream(path));
OutputStream out = new BufferedOutputStream(s.getOutputStream());
copy(in, out);
in.close();
out.close();
答案 1 :(得分:0)
bis.available()返回可用于读取的字节,它可能不是完整的内容大小,你必须在循环中读取它直到达到EOF。
答案 2 :(得分:0)
如果有人遇到同样的问题,缓冲区大小是这种情况的罪魁祸首:
Integer d=bis.available();
byte b[]=new byte[d];
它应该是较小的尝试1024或其他:
byte b[]=new byte[1024];
希望这会有所帮助..