java关于PrintWriter调用write方法之后使用flush方法获取不到内容原因探究求解惑!

问题描述

java关于PrintWriter调用write方法之后使用flush方法获取不到内容原因探究求解惑!

PrintWriter ps= new PrintWriter(socket.getOutputStream());

ps.write( "hello" );
ps.flush();
服务端获取不到hello信息,看了下PrintWriter源码,flush()中调用的是BufferedWriter中的flush(),如果这样的话,应该能刷新缓冲得到结果。但是没有。。。网上找到个说法,原文是这样的"为什么客户端调用了write()和flush()后,服务器端依然read不到数据。因为socket.getOutputStream()取到的实现类是java.net.SocketOutputStream,这个类并没有覆写flush方法,它的父类java.io.FileOutputStream也没有覆写,于是最终就调到了最顶层java.io.OutputStream的flush()方法,这就恶心了,这个方法是空的。于是...",如果这个说法是对的话,为什么我定义的PrintWriter对象会调用SocketOutputStream里面的flush()?如果这个说法不对,那么是什么导致调用write()之后flush()无效?求解惑,万分感谢!

解决方案

.close()之后才会有内容吧

解决方案二:

对,close()确实可以,但是flush()为什么不可以呢

解决方案三:

为什么我定义的PrintWriter对象会调用SocketOutputStream里面的flush()?

flush是一层层传下去的啊……PrintWriter.flush()调用BufferedWriter.flush(),BufferedWriter.flush()调用OutputStreamWriter.flush(),然后调用StreamEncoder.flush()。StreamEncoder的源代码没找到,但肯定最后还是调用了SocketOutputStream.flush()……

但是SocketOutputStream.flush()为空应该不构成问题,因为SocketOutputStream本身不缓存任何内容,而是将得到字节的立即输出,所以不需要flush

解决方案四:

我这里贴下主要的2个方法
public void createClientSocket(){
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Socket s = new Socket("127.0.0.1", 9009);
PrintWriter pw = new PrintWriter(s.getOutputStream());
String str = br.readLine();
while(!"quit".equals(str)){
//这两行server端可以获取str
// pw.println(str);
// pw.flush();
//这两行server端获取不到str
pw.write(str);
pw.flush();
str = br.readLine();
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void createServerSocket(){
    try {
        ServerSocket ss = new ServerSocket(9009);
        Socket s = ss.accept();
        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String str;
        while((str = br.readLine())!=null){
            System.out.println(str);
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
时间: 2024-12-03 15:58:42

java关于PrintWriter调用write方法之后使用flush方法获取不到内容原因探究求解惑!的相关文章

java虚拟机如何调用系统函数中的重载方法

问题描述 本人近来无事,研究下java虚拟机,java虚拟机如何调用同一类中的重载方法

求助java如果要调用摄像头用拍照要怎样去写

问题描述 求助java如果要调用摄像头用拍照要怎样去写 1C 具体内容是这样的,如果我要写一个三连拍保存照片的程序应该怎么写,可能的换能不能加上三张照片比对大小的功能,不行的话就不用了...因为不知道怎么去找出虚拟摄像头禁止掉才想用上面这个方法,我想确定拍照的摄像头是不是虚拟摄像头,然后去阻止这个虚拟摄像头拍照,但是不知道该怎么做...先谢各位了...

ASP技术Flush方法

ASP技术Flush方法 Flush方法发送缓冲立即HTML输出. 注意:如果response.Buffer是虚假的,这种方法将导致运行时错误. 语法 Response.Flush 好了下面我们来看看人实例吧. <% Response.Buffer=true %> <html> <body> <p>我写一些文字,但我会控制时, 文本将被发送到浏览器. <p> <p>文字不是尚未发出.我认为它回来了! "<p> &

Java 调用底层接口的几种方法

Java 调用底层接口 Java 调用底层接口要通过动态链接库进行,在windows下是dll文件,linux是so文件 Java调用动态库所需要关心的问题:     如何装载文件,以及如何定位所要使用的方法:      数据类型是如何对应的:     如何给使用的方法传递参数:     如何获取返回的值. 目前调用底层接口用的比较多的技术包括jni.jna.jnative.Nativecall等 JNI 封装本地接口 JAVA可以通过JNI接口访问本地的动态连接库,从而扩展JAVA的功能.使用

java中如何调用DLL方法

前段时间项目需要使用调用DLL来控制POS机外设,如钱箱和小票打印机.顾客显示屏等,于是,我便开始了java调用DLL中的方法的探索,事实上,网上的例子还是很多的,一些外部包的例子也有很多,但每个人的实际情况都有所不同,尽管只是一个很简单的调用,也花了我不少时间,在这里分享一下我的经验吧. 我是通过一个外部的JAR包来间接来获得DLL文件的句柄 的,它就是jacob了,这是java com brige的简写,呵呵, 这个名称起得非常形象吧,我用的版本是jacob 1.9的,你可以到它的官方网站去

Java通过JNI调用C语言的方法

JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能. 解决JAVA对本地操作的一种方法就是JNI. JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式).通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法. 简单介绍及应用如下: 一.JAVA中所需要做的工作 在JAVA程序中,首先需要在类中声明所调

python调用java模块SmartXLS和jpype修改excel文件的方法

  这篇文章主要介绍了python调用java模块SmartXLS和jpype修改excel文件的方法,涉及Python调用java模块的相关技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了python调用java模块SmartXLS和jpype修改excel文件的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # -*- coding: utf8 -*- """ 使用java的模块Sma

安卓应用开发通过java调用c++ jni的图文使用方法_Android

首先建议一个工程 HelloJni如下图: 按照默认的配置下一步,直到完成 .     如下图操作,点击windows菜单->Prefrence菜单:   弹出如下图:选择Andriod ->NDK: 配置完成以后,点击工程属性菜单: 做这一步的目的是,增加对c++代码的支持,他会自动生成一些东西,你会看到多一个jni的文件夹. 这个名字可以默认,就用工程的名字,实际上就是产生的c++代码生成.so文件的名称(windows上的dll文件). 完成以后.可以看代码,生成一个HelloJni的.

java小白又来问问题啦。关于方法调用

问题描述 java小白又来问问题啦.关于方法调用 直接上代码啦:问题也在代码的解释里啦:麻烦各位大神啊 public class Method{ public static void main(String[]args){//main方法可以调用main方法所在的类中的定义的其他方法,也可以调用别的类中的方法.(书上这么写的) System.out.print("The grade is:"); printGrade(78.5);//调用方法时要注意参数的传递,在 这里78.5就是实参