2 aabbwoshishei aabbwoshishei 于 2013.11.04 20:50 提问

java为什么flush( )方法不能输出数据,一定要close( )才行?

服务端:
ServerSocket ss=new ServerSocket(40006);
while(true)
{
Socket s=ss.accept();
OutputStream os=s.getOutputStream();
os.write("北京".getBytes());
os.flush();//这里改成os.close( ),客户端就能读到,这是为什么啊?
}

客户端:
try {
Socket s=new Socket("192.168.0.110",40006);
InputStream ins=s.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(ins));
String line;
while((line=br.readLine())!=null)
{
System.out.println(line);
}

6个回答

aabbwoshishei
aabbwoshishei   2013.11.04 22:23
已采纳

知道了,BufferedReader是根据“\n”或者“\r”来判断一行的,而这里的服务端根本就没有输入这两个符号,也许close()方法会自动给它加上吧。如果服务端手动给它加上这两个符号中的一个,就可以读出来了。

szsweet
szsweet 在要输入的内容后加下换行符号,os.write("北京\n".getBytes());
一年多之前 回复
lhf_115
lhf_115 然后,直接用ps.println(str),就可以发送了,ps.flush()和socket.shutdownOutput(),都不用?是这样吗?
接近 2 年之前 回复
lhf_115
lhf_115 楼主你好,在进行发送信息时,我用的Printstream ps = new PrintStream(socket.getOutputStream),
接近 2 年之前 回复
lhf_115
lhf_115 额六年后
接近 2 年之前 回复
ll_0520
ll_0520   2013.11.05 09:08

while((line=br.readLine())!=null)你这里是读一行数据,你应该在发送数据的适当位置手动加入回车或结束符。
os.close( )我猜测加入的是结束符

aabbwoshishei
aabbwoshishei 嗯,我昨晚看API发现的
4 年多之前 回复
ygycomon
ygycomon   Rxr 2013.11.05 10:22

flush是输出到缓冲区,缓冲区没满的话不发送,close的动作会强制把缓冲区里没发送的东西发送出去

ygycomon
ygycomon 嗯,对,是加入了一个换行符
4 年多之前 回复
aabbwoshishei
aabbwoshishei 缓冲区满不满都发送的吧?只是没有表示结束的符号,所以客户端会阻塞
4 年多之前 回复
dongtianliubuzhu
dongtianliubuzhu   2013.12.04 17:24

close连套接字都关闭了,当然出来了,flush只是清理缓冲区。而且你这个用了缓冲流也没建立缓冲啊

hxh1311
hxh1311   2014.11.20 17:14

OutputStream 这个类的flush()方法不执行任何代码,需要其他的输出流去重写这个方法的

Ryetal
Ryetal   2017.03.08 23:16

客户端的readline是阻塞的,只有读到尾部才会返回null,你在服务器端不调用close,socket没有关闭,那么客户端的readline就一直阻塞在那(也没有读到一行),所以没有输出

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
为什么部分IO流在调用Close()方法之前要先调用flush()方法
很多人可能一直比较纠结为什么有的带有缓冲功能的流在CLose()方法之前要先调用flush()方法 ,  我们先大概说一下带缓冲功能的流的原理   :   如果是需要频繁的对文件进行读或写  ,   普通流的速度会比较慢  ,   而缓冲流是在普通流的基础上多了一个缓冲区  ,   当读或写的数据达到一定量   ,    再自动往文件里进行读写  ,   如果没有装满缓冲区文件就已经读(写)完毕
BufferedWriter 的 flush() 方法
package com.corpus; import java.io.*; import java.util.List; import edu.stanford.nlp.ling.HasWord; import edu.stanford.nlp.ling.Sentence; import edu.stanford.nlp.ling.TaggedWord; import edu.stanford.
Java中的“流”的flush方法
在练习PrintWriter输出流时,出现一个问题,如下面的代码public class inputStreamExercise { public static void main(String[] args) { String s=null; try{ BufferedReader br= new
关于socket flush()目标端接收不到数据,close()可以接收到数据的问题
最近在写一个简单的socket示例时遇到一个问题,使用write.flush()目标端read接收不到数据,调用close()后数据可正常接收。这让我很是费解,记得当初学习flush方法时,都说明这个方法是强制将缓存区内容刷新到输出流中。难道是socket输出流有不一样。看到网上很多人在问这个问题,解释的也是五花八门的。后来我终于找到了原因,有这样疑惑的同胞们可以参考下,出问题的不是输出的逻辑,而是
IO流初学flush和close的区别
import java.io.*; public class FileWriterDemo1 { /** * @param args */ public static void main(String[] args) throws IOException{ // TODO Auto-generated method stub //创建一个FileWriter对象,该对象一被初
面试题:close()和flush()的区别?
对于字符流 一般写入的时候想要马上看到一般需要flush(), 面试题:close()和flush()的区别? A:close()关闭流对象,但是先刷新一次缓冲区,关闭之后,流对象不可以继续再使用了。 B:flush()仅仅是刷新缓冲区(一般写字符时要用,因为字符是先进入的缓冲区),流对象还可以继续使用
close()方法应该在finally语句中调用吗?
翻译人员: 铁锚 翻译时间: 2013年12月20日 原文链接: Should .close() be put in finally block or not? 下面列出了关闭输出流(output writer) 的三种不同方式. 第一种是将close()方法调用置于try语句块内部; //close() is in try clause try { PrintWriter out
struts2的action类一定要实现execte()吗?
今天在写struts2拦截器器时,忽然想到,action类一定要实现execute() 方法呢? 面我简单说下我的理解:    这个方法最初来源于Action类中的exceute(),我们常常是继承实现Action接口的ActionSupport类,从而获得exeute方法。为啥不直接去实现Action接口呢,其实也行,只不过ActionSupport中有更多利于我们完成项目的方法,例如val
Java_基础—flush和close方法的区别
* flush()方法 * 用来刷新缓冲区的,刷新后可以再次写出 * close()方法 * 用来关闭流释放资源的的,如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写出
File 里面的flush()和close()
前天项目组遇到文件上传,对内存加大的问题。特意看了看相关知识,也对这个有一定的了解 try { FileInputStream fis=new FileInputStream(new File("/home/saas/maven/maven.zip")); BufferedInputStream bis=new BufferedInputStream(fis); Fil