printwriter flush()是干嘛的

printwriter flush()是干嘛的,第1张

flush()直面意思就是刷新printwriter流的缓冲区。

printwriter流如果和文件流(如Stream和Reader流)一起使用的话,printwriter流首先是把程序中数据写入内存缓冲区,然后再由文件流写入文件。如果不刷新缓冲区的话,就一直暂用内存资源。

import java io ;public class CommandWrapper{Process process;Thread in;Thread out;public CommandWrapper(Process process){this process = process;final InputStream inputStream =process getInputStream();//final BufferedReaderr=new BufferedReader(new InputStreamReader(inputStream));final byte[] buffer = new byte[ ];out = new Thread(){//String line;int lineNumber= ;public void run(){try {while (true){int count = inputStream read(buffer);System out println(lineNumber+ : +new String(buffer count ));//line=r readLine();//System out println(lineNumber+ : +line);lineNumber++;}}catch (Exception e){}}};final BufferedReader reader =new BufferedReader(new InputStreamReader(System in));final OutputStreamoutputStream = process getOutputStream();in = new Thread(){String line;public void run(){try{while (true){outputStream write((reader readLine()+ \n ) getBytes());outputStream flush();}}catch (Exception e){}}};}public void startIn(){in start();}public void startOut(){out start();}public void interruptIn(){in interrupt();}public void interruptOut(){out interrupt();}public static void main(String[] args){try{CommandWrapper mand= new CommandWrapper(Runtime getRuntime() exec( native ascii ));mand startIn();mand startOut();}catch (Exception e){e printStackTrace();}}}我以native ascii为范例程序和网友给我的那个程序做了对比 发现如下几个在处理这个问题时需要注意的地方 由于不知道目标程序的输入输出顺序 因此只能建立两个单独的线程分别处理输入和输出 这样输入和输出就不会阻塞了 但是有些目标程序要求有特定的输入输出顺序 而经过这个类封装的结果是在任何状态下都可以输入 程序的任何输出也会被马上反映出来 这是构造通用类的第一个问题 不能直接使用I/O重定向 在最开始的时候我是考虑直接使用I/O重定向的 但是实际的情况是Process的I/O的定义刚好和我的预想相反 我们从Process取得的InputStream实际上是它的输出 而取得的OutputStream是它的输入 这样就无法进行I/O重定向了 必须我们进行编码来读取程序的输出和写入控制台的输入 (这里的I/O重定向是指想将它的I/O直接重定向到系统的I/O) 写入控制台的输入 outputStream write((reader readLine()+ \n ) getBytes());outputStream flush();这里有两个问题值得注意 第一个是我们在控制台输入一行数据以后按下回车 那么语句reader readLine()可以正确的得到你的输入 为什么要加那个换行符呢?这是在测试的时候发现的问题 在以native ascii作为例子的时候发现不加这个的话它不能得到控制台的输入 但是我在替那位网友解决的问题的时候他的程序则没有这个问题 因此猜想可能是因为有的程序要求读取的一整行的数据(例如native ascii) 而大部分的命令行程序在编码的时候读取的是整数这样的值或者其他类型的值 他们是以空格或者其他的字符分隔的 因此就不需要那个额外的换行符(例如那位网友的程序读取的是一元二次方程的三个系数) 另外一个问题就是flush方法的使用 在最开始的时候没有想到要这样刷新进去 无论是否加换行符外部程序都无法读取写入的输入 后来才想到要调用一下这个方法 这个也是在我们输出的时候应该注意的一个问题 有些需要马上反应出来的输出一般都在写入以后要调用它 否则输出/输入不能马上反应出来 对于程序的输出 最开始我是构造的一个BufferedReader想以行为单位输出 对于那位网友的程序 结果证明不是很好用 但是以native ascii作为例子运行又没有问题 这个估计和外部程序的代码也有关系 如果外部程序没有输出换行符可能使用BufferedReader就会有问题 但是通过直接读取输出就没有问题了 另外需要注意的就是 System out println(lineNumber+ : +new String(buffer count ));中严格来说应该是 System out println(lineNumber+ : +new String(buffer count));之所以减一是因为读取输入的时候人为的多加了一个换行符 如果这个地方不减一就会多输出一个空行 基于以上的种种原因 要构造一个执行外部程序的包装器类不太好办 特别是文章中提到的几个问题 有时间和兴趣的朋友可以做一下测试 看看以上的问题和猜测是否正确 另外附上一段源代码 是一个fortran的程序 implicit nonereal a b creal dreal root root print 请输入一元二次方程的系数a b c: read( ) a b cd=b acif(d>= ) thenroot =( b+sqrt(d))/( a)root =( b sqrt(d))/( a)print root = root print root = root elseprint 一元二次方程没有实根! end ifpauseend lishixinzhi/Article/program/Java/JSP/201311/19704

flush实际上就是将所有的写入的流,一次性输出到文件中,之后进行关闭即可。如果没关闭流,也没进行flush,此时的内容并未写入到文件的。

可以通过“FileOutputStream”创建文件实例,之后过“OutputStreamWriter”流的形式进行存储,举例:

OutputStreamWriter pw = null;//定义一个流

pw = new OutputStreamWriter(new FileOutputStream("D:/testtxt"),"GBK");//确认流的输出文件和编码格式,此过程创建了“testtxt”实例

pwwrite("我是要写入到记事本文件的内容");//将要写入文件的内容,可以多次write

pwwrite("我是要写入到记事本文件的内容");//将要写入文件的内容,可以多次write

pwflush();

pwclose();//关闭流

备注:文件流用完之后必须及时通过close方法关闭,否则会一直处于打开状态,直至程序停止,增加系统负担。

矢量,然后

#fff4ee第一亮度

#f4cec1第二黑暗

突出是白色的。

白人女孩一定是有更好的描述。

黑人女孩,一起画一些比较困难的。

希望为您服务。谢谢

以上就是关于printwriter flush()是干嘛的全部的内容,包括:printwriter flush()是干嘛的、详细讲解怎样在Java中运行其它应用程序、Java流中的flush方法困惑等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10079912.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存