美文网首页
JAVA中write()方法后调用flush()方法

JAVA中write()方法后调用flush()方法

作者: 程序员的交流电 | 来源:发表于2019-11-30 23:12 被阅读0次

我们都知道,文件的读取和写入的速度是很慢的,现代计算机中IO是计算机快速运行的一个瓶颈。而cpu的操作速度是很快的,如果cpu等待io,这样就会造成cpu资源的极大的浪费,程序运行的效率必然会降低的。相比之下,把数据放到缓存区,然后等到缓存区满了,然后让cpu进行io操作,当缓存区没有满,cpu就去干其他的事情。,这样就会更加的高效的,资源利用率也在提高。于是我们考虑的是先将硬盘里面的数据预加载到缓冲区(大小可以定义,选择合适的缓冲区大小),然后等待缓冲区的IO操作。这样就减少了cpu的io,提高程序运行的效率。其中将硬盘数据于内存进行交互是由IO系统来完成的。java也是采用这种方式,通过基本流处理(缓冲机制)减少IO操作。来提高程序运行的效率。

OutputStream抽象类里面的方法
public abstract void write(int b) 写出一个字节的数据
public void write(byte b[]) 把所有直接写到数组里面
public void write(byte b[], int off, int len) 把所有的数据写到数组的off到len
public void flush() 把缓存区里面的所有数据强制刷到目的地
public void close() 先把缓存区里面的所有的数据强制的刷到目的地,然后关闭流

其实也并不是说一定要在write之后使用flush的,就像使用while来写大量数据到本地,当到最后,直接的close就可以了。并不需要flush。
read()方法和write()是线程阻塞的,也就是说,当某个线程试图向另一端网络节点读取或写入数据时,有可能会发生网络连接异常或者是服务器短期内没有响应,这将会导致该线程阻塞,同样地,在无数据状态进行读取,数据已满进行写操作时,同样会发生阻塞,这时,其他线程抢占资源后继续执行。如果出现此现状,读取到缓冲池中的数据不能够及时的发送到另一端的网络节点,需要该线程再次竞争到CPU资源才可正常发送。

还有一种情况,当我们将数据预存到缓冲池中时,当数据的长度满足缓冲池中的大小后,才会将缓冲池中的数据成块的发送,若数据的长度不满足缓冲池中的大小,需要继续存入,待数据满足预存大小后再成块的发送。往往在发送文件过程中,文件末尾的数据大小不能满足缓冲池的大小。最终导致这部分的数据停留在缓冲池无法发送。

这时,就需要我们在write()方法后,手动调用flush()方法,强制刷出缓冲池中的数据,(即使数据长度不满足缓冲池的大小)从而保证数据的正常发送。当然,当我们调用流的close()方法后,系统也会自动将输出流缓冲区的数据刷出,同时可以保证流的物理资源被回收。
参考文章:https://blog.csdn.net/qq_35271409/article/details/82057096

相关文章

  • JAVA中write()方法后调用flush()方法

    我们都知道,文件的读取和写入的速度是很慢的,现代计算机中IO是计算机快速运行的一个瓶颈。而cpu的操作速度是很快的...

  • 2018-08-23 netty异步

    //netty 中writeandflush()方法 整体步骤:先write再flush write流程 ctx....

  • 如何在Java中实现远程方法调用

    如何在Java中实现远程方法调用 一、Java中的远程方法调用 JAVA教程远程方法调用(Remote Metho...

  • Java基础IO流相关

    递归调用内存溢出图 I/O流示意图 输入流中flush方法和close方法的区别 flush:刷新缓冲区,流对象可...

  • 10.3 UiPath如何调用Java

    调用Java方法(Invoke Java Method)的介绍从Java Scope中的.jar加载的方法中调用指...

  • Java中IO流浅析

    一、常见流 我们知道java中流类分为字节流和字符流。 二、关于flush()方法 许多流类都有flush()方法...

  • ChunkedWriteHandler

    write方法将数据包装成PendingWrite塞入队列flush方法:从队列里面取出数据对于如果是Chunke...

  • 关闭流要点1_try异常管理

    close()关闭文件流当调用close()方法时,首先会把缓冲区数据写入文件(也可以直接调用flush()方法)...

  • JNI&NDK开发最佳实践(七):JNI之本地方法与ja

    java调用本地方法 java调用本地方法主要有如下两个场景: java调用.c或.cpp文件中的方法,参考 JN...

  • C++子线程调用Java方法

    1. C++ 全局调用Java方法 之前讨论过,如何C++主线程中调用 Java 函数C++主线程调用Java方法...

网友评论

      本文标题:JAVA中write()方法后调用flush()方法

      本文链接:https://www.haomeiwen.com/subject/pjpawctx.html