当前位置:网站首页 > Java教程 > 正文

java动态输出教程



廖雪峰
资深软件开发工程师,业余马拉松选手。

和相反,是Java标准库提供的最基本的输出流。

和类似,也是抽象类,它是所有输出流的超类。这个抽象类定义的一个最重要的方法就是,签名如下:

这个方法会写入一个字节到输出流。要注意的是,虽然传入的是参数,但只会写入一个字节,即只写入最低8位表示字节的部分(相当于)。

和类似,也提供了方法关闭输出流,以便释放系统资源。要特别注意:还提供了一个方法,它的目的是将缓冲区的内容真正输出到目的地。

为什么要有?因为向磁盘、网络写入数据的时候,出于效率的考虑,操作系统并不是输出一个字节就立刻写入到文件或者发送到网络,而是把输出的字节先放到内存的一个缓冲区里(本质上就是一个数组),等到缓冲区写满了,再一次性写入文件或者网络。对于很多IO设备来说,一次写一个字节和一次写1000个字节,花费的时间几乎是完全一样的,所以有个方法,能强制把缓冲区内容输出。

通常情况下,我们不需要调用这个方法,因为缓冲区写满了会自动调用它,并且,在调用方法关闭之前,也会自动调用方法。

但是,在某些情况下,我们必须手动调用方法。举个栗子:

小明正在开发一款在线聊天软件,当用户输入一句话后,就通过的方法写入网络流。小明测试的时候发现,发送方输入后,接收方根本收不到任何信息,怎么回事?

原因就在于写入网络流是先写入内存缓冲区,等缓冲区满了才会一次性发送到网络。如果缓冲区大小是4K,则发送方要敲几千个字符后,操作系统才会把缓冲区的内容发送出去,这个时候,接收方会一次性收到大量消息。

解决办法就是每输入一句话后,立刻调用,不管当前缓冲区是否已满,强迫操作系统把缓冲区的内容立刻发送出去。

实际上,也有缓冲区。例如,从读取一个字节时,操作系统往往会一次性读取若干字节到缓冲区,并维护一个指针指向未读的缓冲区。然后,每次我们调用读取下一个字节时,可以直接返回缓冲区的下一个字节,避免每次读一个字节都导致IO操作。当缓冲区全部读完后继续调用,则会触发操作系统的下一次读取并再次填满缓冲区。

我们以为例,演示如何将若干个字节写入文件流:

每次写入一个字节非常麻烦,更常见的方法是一次性写入若干字节。这时,可以用提供的重载方法来实现:

和一样,上述代码没有考虑到在发生异常的情况下如何正确地关闭资源。写入过程也会经常发生IO错误,例如,磁盘已满,无权限写入等等。我们需要用来保证在无论是否发生IO错误的时候都能够正确地关闭:

和一样,的方法也是阻塞的。

用可以从文件获取输出流,这是常用的一个实现类。此外,可以在内存中模拟一个:

实际上是把一个数组在内存中变成一个,虽然实际应用不多,但测试的时候,可以用它来构造一个。

同时操作多个资源时,在语句中可以同时写出多个资源,用隔开。例如,同时读写两个文件:

请利用和,编写一个复制文件的程序,它可以带参数运行:

下载练习

Java标准库的定义了所有输出流的超类:

  • 实现了文件流输出;
  • 在内存中模拟一个字节流输出。

某些情况下需要手动调用的方法来强制输出缓冲区;

总是使用来保证正确关闭。

  • 上一篇: java jce教程
  • 下一篇: java正则表达式教程
  • 版权声明


    相关文章:

  • java jce教程2025-03-03 10:58:01
  • java怎么添加教程2025-03-03 10:58:01
  • java做打印小票教程2025-03-03 10:58:01
  • java编程全套教程2025-03-03 10:58:01
  • java经典教程完整版2025-03-03 10:58:01
  • java正则表达式教程2025-03-03 10:58:01
  • 菜鸟教程java常用类2025-03-03 10:58:01
  • Java语言PPT教程2025-03-03 10:58:01
  • java教程aop2025-03-03 10:58:01
  • webservice 教程 java2025-03-03 10:58:01