Java流中的flush方法困惑
下面是我写的一个程序中客户端的一部分,目的是通过网络(socket编程)往服务器中发送数据,try{DataInputStreamdataInputStream=newD...
下面是我写的一个程序中客户端的一部分,目的是通过网络(socket编程)往服务器中发送数据,
try {
DataInputStream dataInputStream = new DataInputStream(
new BufferedInputStream(
new FileInputStream(file_text.getText())));
// DataOutputStream dataOutputStream = new DataOutputStream(
// new BufferedOutputStream(
// socket.getOutputStream()));
int end_len = dataInputStream.available();
int start_len = 0,len;
System.out.println("file 可取得的长度:" + end_len);
byte [] b = new byte[1024];
while(-1 != (len = dataInputStream.read(b))){
System.out.println("len = " + len);
dataOutputStream.write(b,start_len,len);
// start_len += len;
// dataOutputStream.write(b);
dataOutputStream.flush();
for(int j = 0;j<len;j++){
System.out.printf("b[%d] = %x ",j,b[j]);
}
}
dataOutputStream.flush();
dataInputStream.close();
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}catch(IOException e2){
e2.printStackTrace();
}
我的疑惑是:dataOutputStream.flush();这句不起作用,无法将缓冲区的数据及时送出,即服务器端收不到数据。只有当关闭流的的时候服务器端才可以收到数据。。
不知道什么原因,请教Java高手。。
回复一楼:dataOutputStream.write(b)是输出数据,这仅仅是写到缓冲区,即写到内存中。并没有真正的到达目的地。。JavaAPI文档中说flush可以刷新缓冲区,但是在我的程序中不起作用,不知道为什么。。
继续等待高手。
API文档中对.flush这么说的:刷新此输出流并强制写出所有缓冲的输出字节。flush 的常规协定是:如果此输出流的实现已经缓冲了以前写入的任何字节,则调用此方法指示应将这些字节立即写入它们预期的目标。
如果此流的预期目标是由基础操作系统提供的一个抽象(如一个文件),则刷新此流只能保证将以前写入到流的字节传递给操作系统进行写入,但不保证能将这些字节实际写入到物理设备(如磁盘驱动器)。
难道我的数据没有送到缓冲区?那去哪儿了? 展开
try {
DataInputStream dataInputStream = new DataInputStream(
new BufferedInputStream(
new FileInputStream(file_text.getText())));
// DataOutputStream dataOutputStream = new DataOutputStream(
// new BufferedOutputStream(
// socket.getOutputStream()));
int end_len = dataInputStream.available();
int start_len = 0,len;
System.out.println("file 可取得的长度:" + end_len);
byte [] b = new byte[1024];
while(-1 != (len = dataInputStream.read(b))){
System.out.println("len = " + len);
dataOutputStream.write(b,start_len,len);
// start_len += len;
// dataOutputStream.write(b);
dataOutputStream.flush();
for(int j = 0;j<len;j++){
System.out.printf("b[%d] = %x ",j,b[j]);
}
}
dataOutputStream.flush();
dataInputStream.close();
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}catch(IOException e2){
e2.printStackTrace();
}
我的疑惑是:dataOutputStream.flush();这句不起作用,无法将缓冲区的数据及时送出,即服务器端收不到数据。只有当关闭流的的时候服务器端才可以收到数据。。
不知道什么原因,请教Java高手。。
回复一楼:dataOutputStream.write(b)是输出数据,这仅仅是写到缓冲区,即写到内存中。并没有真正的到达目的地。。JavaAPI文档中说flush可以刷新缓冲区,但是在我的程序中不起作用,不知道为什么。。
继续等待高手。
API文档中对.flush这么说的:刷新此输出流并强制写出所有缓冲的输出字节。flush 的常规协定是:如果此输出流的实现已经缓冲了以前写入的任何字节,则调用此方法指示应将这些字节立即写入它们预期的目标。
如果此流的预期目标是由基础操作系统提供的一个抽象(如一个文件),则刷新此流只能保证将以前写入到流的字节传递给操作系统进行写入,但不保证能将这些字节实际写入到物理设备(如磁盘驱动器)。
难道我的数据没有送到缓冲区?那去哪儿了? 展开
3个回答
展开全部
flush实际上就是将所有的写入的流,一次性输出到文件中,之后进行关闭即可。如果没关闭流,也没进行flush,此时的内容并未写入到文件的。
可以通过“FileOutputStream”创建文件实例,之后过“OutputStreamWriter”流的形式进行存储,举例:
OutputStreamWriter pw = null;//定义一个流
pw = new OutputStreamWriter(new FileOutputStream("D:/test.txt"),"GBK");//确认流的输出文件和编码格式,此过程创建了“test.txt”实例
pw.write("我是要写入到记事本文件的内容");//将要写入文件的内容,可以多次write
pw.write("我是要写入到记事本文件的内容");//将要写入文件的内容,可以多次write
pw.flush();
pw.close();//关闭流
备注:文件流用完之后必须及时通过close方法关闭,否则会一直处于打开状态,直至程序停止,增加系统负担。
可以通过“FileOutputStream”创建文件实例,之后过“OutputStreamWriter”流的形式进行存储,举例:
OutputStreamWriter pw = null;//定义一个流
pw = new OutputStreamWriter(new FileOutputStream("D:/test.txt"),"GBK");//确认流的输出文件和编码格式,此过程创建了“test.txt”实例
pw.write("我是要写入到记事本文件的内容");//将要写入文件的内容,可以多次write
pw.write("我是要写入到记事本文件的内容");//将要写入文件的内容,可以多次write
pw.flush();
pw.close();//关闭流
备注:文件流用完之后必须及时通过close方法关闭,否则会一直处于打开状态,直至程序停止,增加系统负担。
展开全部
.flush(); 方法是将内存中的数据一次性输出~!但你没规定内存中数据达到多少时,调用.flush()方法!所以默认是关闭流时,一次性全输出!即:你读入的数据都放在内存中(当内存放不下时就报异常),关闭流时,再一次性把内存中的数据输出出去!!
象PrintWriter就有这个方法~但必须规定一个整数,就是当数据够了整数个以后.flush()方法就输出~!你就是差一个这个!
象PrintWriter就有这个方法~但必须规定一个整数,就是当数据够了整数个以后.flush()方法就输出~!你就是差一个这个!
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
dataOutputStream.write(b); 这句就是输出数据啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询