有两个“适配器” 流类型,它们可以将字节流转化成字节流。这就是InputStreamReader 可以将InputStream转成为Reader,OutputStreamWriter可以将OutputStream转成为Writer。
适配器类,字节流转字符流
在这里插入图片描述当然也有类似字节流的装饰器实现方式,给字符流添加额外的功能或这说是行为。这些功能字符流类主要有:
BufferedReader
BufferedWriter
PrintWriter
LineNumberReader
PushbackReader
System类中的I/O流想想你的第一个Java程序是啥?我没猜错的话,应该是 hello world。
1System.out.println("hello world")简单到令人发指,今天就说说标准的输入/输出流。
在标准IO模型中,Java提供了System.in、System.out和System.error。
先说System.in,看下源码
1public final static InputStream in是一个静态域,未被包装过的InputStream。通常我们会使用BufferedReader进行包装然后一行一行地读取输入,这里就要用到前面说的适配器流InputStreamReader。
1public class SystemInReader {2 public static void main(String[] args) throws IOException {
3 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
4 String s;
5 while ((s = reader.readLine()) != null && s.length() != 0){
6 System.out.println(s);
7 }
8 }
9}
该程序等待会一直等待我们输入,输入啥,后面会接着输出。输入空字符串可以结束。
1121
3123
4123
System.out是一个PrintStream流。System.out一般会把你写到其中的数据输出到控制台上。System.out通常仅用在类似命令行工具的控制台程序上。System.out也经常用于打印程序的调试信息(尽管它可能并不是获取程序调试信息的最佳方式)。
System.err是一个PrintStream流。System.err与System.out的运行方式类似,但它更多的是用于打印错误文本。
可以将这些系统流重定向
尽管System.in, System.out, System.err这3个流是java.lang.System类中的静态成员,并且已经预先在JVM启动的时候初始化完成,你依然可以更改它们。
可以使用setIn(InputStream)、setOut(PrintStream)、setErr(PrintStream)进行重定向。比如可以将控制台的输出重定向到文件中。
1OutputStream output = new FileOutputStream("d:/system.out.txt");2PrintStream printOut = new PrintStream(output);
3System.setOut(printOut);
压缩(ZIP文档)
Java IO类库是支持读写压缩格式的数据流的。我们可以把一个或一批文件压缩成一个zip文档。这些压缩相关的流类是按字节处理的。先看下设计压缩解压缩的相关流类。
压缩类 功能CheckedInputStream getCheckSum()可以为任何InputStream产生校验和(不仅是解压缩)
CheckedOutputStream getCheckSum()可以为任何OutputStream产生校验和(不仅是压缩)
DeflaterOutputStream 压缩类的基类
ZipOutputStream 继承自DeflaterOutputStream,将数据压缩成Zip文件格式
GZIPOutputStream 继承自DeflaterOutputStream,将数据压缩成GZIP文件格式
InflaterInputStream 解压缩类的基类
ZipInputStream 继承自InflaterInputStream,解压缩Zip文件格式的数据
GZIPInputStream 继承自InflaterInputStream,解压缩GZIP文件格式的数据