我们用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=eOutputStream常用方法如下。
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主要有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类图