BufferedOutputStream 生成空白文件
BufferedOuputStream make Blank file
我有以下用于从客户端上传文件到服务器 tcp 的代码,但是当我尝试手动打开文件时,文件是空的,为什么重量好..
我在 Whosebug 上看了很多 post 但没有任何改变
谢谢
(抱歉我的英语不好)
服务器:
public class ThreadServer 扩展线程{
private Socket soc;
private FileOutputStream fos;
private BufferedOutputStream bos;
private InputStream in;
public ThreadServer (Socket soc) {
this.soc = soc;
}
public void run(){
try {
fos = new FileOutputStream("C:/Users/erwan/workspace/Word/server/text.txt");
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
bos = new BufferedOutputStream(fos);
byte[] buffer = new byte[1024];
try {
in = soc.getInputStream();
int count = 0;
while((count= in.read(buffer, 0 , buffer.length)) != -1) {
System.out.println(count+" octets received...");
bos.write(buffer);
}
bos.flush();
bos.close();
in.close();
soc.close();
System.out.println("File sent succesfully!");
}catch(IOException e){
e.printStackTrace();
System.out.println("Une erreur est survenu");
}
}
}
客户:
public class Client {
private static Socket as;
private static FileInputStream fis;
private static BufferedInputStream bis;
private static OutputStream out;
public static void main( String[] args ){
as = null;
try{
as = new Socket(InetAddress.getLocalHost(),4020);
File f = new File (args[0]);
byte [] buffer = new byte [(int) f.length()];
fis = new FileInputStream(f);
setBis(new BufferedInputStream(fis));
out = as.getOutputStream();
System.out.println("uploading...");
out.write(buffer,0,buffer.length);
out.flush();
out.close();
System.out.println("the file is uploaded.");
as.close();
}catch(IOException e){
e.printStackTrace();
}
}
客户端的缓冲区似乎没有填充数据。它被初始化为具有文件长度的字节数组,但没有对输入流进行读取方法调用。出于测试目的,fis.read(buffer) 可能会快速将一些数据放入缓冲区。请记住,读取不能保证填满缓冲区的整个长度。因此,特别是如果您的文件包含零,则可能是罪魁祸首没有将实际数据读入(客户端的)缓冲区。
除此之外,服务器代码还假定读取方法已完全填充缓冲区,因此写入方法调用应指定一个长度(计数)。所以把 bos.write(buffer) 改成 bos.write(bos, 0, count)。这可能会在文件末尾变得明显(如果文件长度超过 1024 字节),因为文件末尾将成为前一个块中某些数据的重复。
我有以下用于从客户端上传文件到服务器 tcp 的代码,但是当我尝试手动打开文件时,文件是空的,为什么重量好..
我在 Whosebug 上看了很多 post 但没有任何改变
谢谢
(抱歉我的英语不好)
服务器:
public class ThreadServer 扩展线程{
private Socket soc;
private FileOutputStream fos;
private BufferedOutputStream bos;
private InputStream in;
public ThreadServer (Socket soc) {
this.soc = soc;
}
public void run(){
try {
fos = new FileOutputStream("C:/Users/erwan/workspace/Word/server/text.txt");
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
bos = new BufferedOutputStream(fos);
byte[] buffer = new byte[1024];
try {
in = soc.getInputStream();
int count = 0;
while((count= in.read(buffer, 0 , buffer.length)) != -1) {
System.out.println(count+" octets received...");
bos.write(buffer);
}
bos.flush();
bos.close();
in.close();
soc.close();
System.out.println("File sent succesfully!");
}catch(IOException e){
e.printStackTrace();
System.out.println("Une erreur est survenu");
}
}
}
客户:
public class Client {
private static Socket as;
private static FileInputStream fis;
private static BufferedInputStream bis;
private static OutputStream out;
public static void main( String[] args ){
as = null;
try{
as = new Socket(InetAddress.getLocalHost(),4020);
File f = new File (args[0]);
byte [] buffer = new byte [(int) f.length()];
fis = new FileInputStream(f);
setBis(new BufferedInputStream(fis));
out = as.getOutputStream();
System.out.println("uploading...");
out.write(buffer,0,buffer.length);
out.flush();
out.close();
System.out.println("the file is uploaded.");
as.close();
}catch(IOException e){
e.printStackTrace();
}
}
客户端的缓冲区似乎没有填充数据。它被初始化为具有文件长度的字节数组,但没有对输入流进行读取方法调用。出于测试目的,fis.read(buffer) 可能会快速将一些数据放入缓冲区。请记住,读取不能保证填满缓冲区的整个长度。因此,特别是如果您的文件包含零,则可能是罪魁祸首没有将实际数据读入(客户端的)缓冲区。
除此之外,服务器代码还假定读取方法已完全填充缓冲区,因此写入方法调用应指定一个长度(计数)。所以把 bos.write(buffer) 改成 bos.write(bos, 0, count)。这可能会在文件末尾变得明显(如果文件长度超过 1024 字节),因为文件末尾将成为前一个块中某些数据的重复。