Java基础-IO (4)

我们用BufferedInputStream给FileInputStream方法添加缓存区,改写后的read方法如下:

public static void readWithBuffer(File file) throws IOException{ try(FileInputStream fileInputStream=new FileInputStream(file); BufferedInputStream input=new BufferedInputStream(fileInputStream); ){ int byteData = input.read(); while (byteData != -1) { logger.info("byteData={}, char result={}", byteData, (char) byteData); byteData = input.read(); } } } OutputStream类图

OutputStream的层次关系如下:


OutputStream实现Closeable和Flushable接口,其装饰功能子类FilterOutputStream,类图如下:

输出流基本使用流程

输出流往往和某些数据的目标媒介相关联,比如文件,网络连接,管道等,如下将字符串apache写入当前项目data目录下的output.txt文件

package com.molyeo.java.io; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.*; /** * Created by zhangkh on 2018/8/5. */ public class BytedBasedOutputStream { static Logger logger = LoggerFactory.getLogger(ByteBasedInputStream.class.getName()); public static void main(String[] args) throws IOException { File path = new File("."); File file = new File(path, "data/output.txt"); logger.info(file.getAbsolutePath()); write(file, "apache"); } public static void write(File file, String content) throws IOException { try (FileOutputStream output = new FileOutputStream(file)) { byte[] bytesArray = content.getBytes(); for (int i = 0; i < bytesArray.length; i++) { output.write(bytesArray[i]); logger.info("byteData={}, char result={}", bytesArray[i], (char) bytesArray[i]); } output.flush(); } } }

程序输出如下:

18/08/05 13:00:23 INFO io.BytedBasedOutputStream: D:\workspace_spark\SparkInAction\.\data\output.txt 18/08/05 13:00:23 INFO io.BytedBasedOutputStream: byteData=97, char result=a 18/08/05 13:00:23 INFO io.BytedBasedOutputStream: byteData=112, char result=p 18/08/05 13:00:23 INFO io.BytedBasedOutputStream: byteData=97, char result=a 18/08/05 13:00:23 INFO io.BytedBasedOutputStream: byteData=99, char result=c 18/08/05 13:00:23 INFO io.BytedBasedOutputStream: byteData=104, char result=h 18/08/05 13:00:23 INFO io.BytedBasedOutputStream: byteData=101, char result=e

OutputStream常用方法如下。

write(byte[])
OutputStream同样包含了将字节数据中全部或者部分数据写入到输出流中的方法,分别是write(byte[])和write(byte[], int offset, int length)。
write(byte[])把字节数组中所有数据写入到输出流中。
write(byte[], int offset, int length)把字节数据中从offset位置开始,length个字节的数据写入到输出流。

flush()
OutputStream的flush()方法将所有写入到OutputStream的数据冲刷到相应的目标媒介中。比如,如果输出流是FileOutputStream,那么写入到其中的数据可能并没有真正写入到磁盘中。即使所有数据都写入到了FileOutputStream,这些数据还是有可能保留在内存的缓冲区中。通过调用flush()方法,可以把缓冲区内的数据刷新到磁盘(或者网络,以及其他任何形式的目标媒介)中。

close()
当你结束数据写入时,需要关闭OutputStream。通过调用close()可以达到这一点。因为OutputStream的各种write()方法可能会抛出IO异常,所以你需要把调用close()的关闭操作方在finally块中执行。如果使用基于try-with-resource的异常处理程序则由于实现了AutoCloseable接口,不用显示关闭。

FilterOutputStream

FilterOutputStream主要有3个子类,可以用来修改OutputStream的内部行为。

3个字类添加的功能如下:

类名   功能  
DataOutputStream   与DataInputStream配合使用,可以用可携带的方式往流里写基本类型  
BufferedOutputStream   写入缓冲区,而不是每次往流里写数据,都要进行物理操作  
PrintStream   负责生成带格式的输出。DataOutputStrem负责数据的存储,而PrintStream负责数据的显示。  

我们用BufferedOutputStream给FileOutputStream方法添加缓存区,改写后的write方法如下:

public static void writeWithBuffer(File file, String content) throws IOException { try (FileOutputStream fileOutputStream = new FileOutputStream(file); BufferedOutputStream output=new BufferedOutputStream(fileOutputStream) ) { byte[] bytesArray = content.getBytes(); for (int i = 0; i < bytesArray.length; i++) { output.write(bytesArray[i]); logger.info("byteData={}, char result={}", bytesArray[i], (char) bytesArray[i]); } output.flush(); } } Reader和Writer Reader类图

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwjswp.html