A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 键盘有花生油 于 2018-11-26 15:14 编辑

day10 缓冲流 转换流 序列化流 打印流

[Java] 纯文本查看 复制代码
IO流:
    缓冲流: BufferedInputStream / BufferedOutputStream, BufferedReader / BufferedWriter
        在基本流上增加缓冲区 char[] byte[], 提高读写效率
    转换流: InputStreamReader / OutputStreamWriter
        字节转字符: FileReader 读 char <- byte 硬盘
        字符转字节: FileWriter 写 char -> byte 硬盘
    序列化流: ObjectInputStream / ObjectOutputStream
        序列化:   内存中的对象 写-> 硬盘上的文件中
        反序列化: 内存中的对象 <-读 硬盘上的文件中
    打印流: PrintStream
        可以自动换行, 原样输出  System.out.println();

基本流: FileXxx
包装流: 
    包装流只是在基本流的外面增加了一些便捷的功能, 最终进行读写的还是基本流
    但是包装流增强了基本流的功能
    BufferedReader br = new BufferedReader(new FileReader());
        

字节缓冲流
    |_ BufferedInputStream     # 缓冲字节输入流
    |_ BufferedOutputStream    # 缓冲字节输出流

字符缓冲流
    |_ BufferedReader          # 缓冲字符输入流
    |_ BufferedWriter          # 缓冲字符输出流
    
java.io.BufferedOutputStream类: 缓冲字节输出流
    // 构造方法
    BufferedOutputStream(OutputStream out): 使用基本流创建一个缓冲字节输出流
    BufferedOutputStream(OutputStream out, int size): 使用基本流创建一个缓冲字节输出流, 设置缓冲区大小
    
BufferedOutputStream使用步骤:
    1.创建FileOutputStream对象, 构造方法中绑定要输出的目的地
    2.创建BufferedOutputStream对象, 构造方法中传递FileOutputStream对象
    3.使用BufferedOutputStream对象中的方法 write(), 把数据写入到内部缓冲区中
    4.使用BufferedOutputStream对象中的方法 flush(), 把内部缓冲区中的数据,刷新到文件中
    5.释放资源(会先调用flush方法刷新数据, 第4步可以省略)
        
    FileOutputStream fos = new FileOutputStream("文件路径");
    BufferedOutputStream bos = new BufferedOutputStream(fos);
    bos.write("你好".getBytes());
    // bos.flush();  // 可以省略
    bos.close();

1.1使用BufferedOutputStream
需求:
使用BufferedOutputStream向当前模块的"testBufferedOutput1.txt", 写入"我把数据写入到内存缓冲区中"这个字符串

代码:
[Java] 纯文本查看 复制代码
public class Test {
    public static void main(String[] args) throws IOException {
        // 1. 创建缓冲字节输出流对象, 内部传入基本流对象
//        FileOutputStream fos = new FileOutputStream("testBufferedOutput1.txt");
//        BufferedOutputStream bos = new BufferedOutputStream(fos);
        // 以上代码可以合并为一行, 创建基本流使用匿名对象方式
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("day10\\testBufferedOutput1.txt"));

        // 2. 写数据
        bos.write("我把数据写入到内存缓冲区中".getBytes());

        // 刷新(可以省略, 直接使用close())
//        bos.flush();

        // 释放资源
        bos.close();
    }
}
1.2缓冲字节输入流:BufferedInputStream
总结:

java.io.BufferedInputStream: 缓冲字节输入流
    // 构造方法
    BufferedInputStream(InputStream in): 使用基本流创建一个缓冲字节输入流
    BufferedInputStream(InputStream in, int size): 使用基本流创建一个缓冲字节输入流, 设置缓冲区大小
   
使用步骤:
    1.创建FileInputStream对象, 构造方法中绑定要读取的数据源
    2.创建BufferedInputStream对象, 构造方法中传递FileInputStream对象
    3.使用BufferedInputStream对象中的方法 read(), 读取文件
    4.释放资源 close()
        
    FileInputStream fis = new FileInputStream("文件路径");
    BufferedInputStream bis = new BufferedInputStream(fis);
    byte[] bytes = new byte[1024];
    int len;
    while ((len = bis.read(bytes)) != -1) {
        
System.out.println(new String(bytes, 0, len));
   }
    bis.close();

1.3使用BufferedInputStream读取文件

需求:
使用BufferedInputStream读取刚才的"testBufferedOutput1.txt"文件, 打印到控制台


代码:

[Java] 纯文本查看 复制代码
public class Test {
    public static void main(String[] args) throws IOException {
        // 1. 创建缓冲字节输入流对象, 构造方法中传入基本流对象
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("day10\\testBufferedOutput1.txt"));

        // 读取数据方式1: 一次读一个字节
        /*int by;
        while ((by = bis.read()) != -1) {
            System.out.println(by);  // 这是int类型的byte数字
        }*/

        // 读取数据方式2: 一次读一个字节数组
        int len;
        byte[] bytes = new byte[1024];
        while ((len = bis.read(bytes)) != -1) {
            // 将读取到的字节转换为String, 并打印
            System.out.print(new String(bytes, 0, len));
        }

        // 释放资源 只需要调用缓冲流的close方法即可, 该方法内部会自动将基本流对象关闭
        bis.close();
    }
}
缓冲流的效率测试: 复制文件
知识点:

基本流 一次读写一个字节      一个字节
基本流 一次读写一个字节数组   一个字节数组
缓冲流 一次读写一个字节      一个字节数组
缓冲流 一次读写一个字节数组   两个字节数组
效率分别是怎样的, 哪种方式效率最高?

总结:

缓冲流 + 一次读写一个字节数组 效率最高

缓冲字符输出流: BufferedWriter
总结:

java.io.BufferedWriter:
    // 构造方法
    BufferedWriter(Writer out): 使用基本流创建一个缓冲字符输出流
    BufferedWriter(Writer out, int size): 使用基本流创建一个缓冲字符输出流, 设置缓冲区大小
    // 特有方法
    void newLine(): 写入一个换行符, 换行符自动根据当前系统确定

2.1使用BufferedWriter

需求:
使用BufferWriter向当前模块下的"testBufferedWriter1.txt"写入10"传智播客"

代码:
[Java] 纯文本查看 复制代码
public class Test {
    public static void main(String[] args) throws IOException {
        // 创建缓冲字符输出流对象, 构造方法内部传递基本流对象
        BufferedWriter bw = new BufferedWriter(new FileWriter("day10\\testBufferedWriter1.txt"));

        // 循环10次写入内容和换行
        for (int i = 0; i < 10; i++) {
            // 写入内容
            bw.write("传智播客");
            // 写入换行符
            bw.newLine();
        }
        // 刷新 (可以省略)
//        bw.flush();

        // 释放资源
        bw.close();
    }
}
2.2缓冲字符输入流: BufferedReader
知识点:

BufferedReader
如何创建对象
BufferedReader
特有的读取一行字符串的方法如何使用

总结:

java.io.BufferedReader: 缓冲字符输入流
    // 构造方法
    BufferedReader(Reader in): 使用基本流创建一个缓冲字符输入流
    BufferedReader(Reader in, int size): 使用基本流创建一个缓冲字符输入流, 设置缓冲区大小
    // 特有方法
    String readLine(): 一次读一行字符串, "不包含换行符". 读到文件末尾返回null


2.3使用BufferedReader

需求:
使用BufferedReader将当前模块下的"testBufferedWriter1.txt"中的内容读取出来, 打印到控制台

代码:
[Java] 纯文本查看 复制代码
public class Test {
    public static void main(String[] args) throws IOException {
        // 创建缓冲字符输入流对象, 构造方法中传递基本流对象
        BufferedReader br = new BufferedReader(new FileReader("day10\\testBufferedWriter1.txt"));

        // 循环读取
        String line;  // 定义String变量, 用于保存每次读到的一行字符串
        while ((line = br.readLine()) != null) {
            // 将读到的字符串打印出来, 因为字符串中不带换行符, 所以我们打印需要用println
            System.out.println(line);
        }

        // 释放资源
        br.close();
    }
}
练习: 文本排序
5分钟练习: 文本排序

需求:
3.侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必得裨补阙漏,有所广益。
8.愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏,臣不胜受恩感激。
4.将军向宠,性行淑均,晓畅军事,试用之于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。
2.宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。
1.先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。
9.今当远离,临表涕零,不知所言。
6.臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。
7.先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐付托不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。
5.亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。

将以上文本按照序号排序, 写入到当前模块下的out.txt


步骤分析:
    1. 创建ArrayList集合, 泛型用String
    2. 创建BufferedReader对象, 构造方法中传递FileReader对象, 指向模块下的in.txt
    3. 创建BufferedWriter对象, 构造方法中传递FileWriter对象, 指向模块下的out.txt
    4. 使用BufferedReader对象中的方法readLine, 以行的方式读取文本
    5. 把读取到的文本存储到ArrayList集合中
    6. 使用Collections集合工具类的方法sort, 对集合中的元素按照自定义规则排序
    7. 遍历ArrayList集合, 获取每一个元素
    8. 使用BufferedWriter对象中的方法write, 把遍历得到的元素写入到文本中(内存缓冲区)
   
9. 写换行
   
10. 释放资源

代码:
[Java] 纯文本查看 复制代码
public class Test {
    public static void main(String[] args) throws IOException {
        // 创建集合, 用来装每行字符串
        ArrayList<String> list = new ArrayList<>();
        // 创建流对象
        BufferedReader br = new BufferedReader(new FileReader("day10\\in.txt"));
        BufferedWriter bw = new BufferedWriter(new FileWriter("day10\\out.txt"));

        // 循环按行读取
        String line;
        while ((line = br.readLine()) != null) {
            // 添加到集合
            list.add(line);
        }

        // 排序
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                // 先获取每个字符串的第一个字符char, 按照索引获取.
                // char本身可以进行数学运算, 所以直接相减即可, 相当于按照 '1'  '2' 的对应数值49 50 来相减
                return o1.charAt(0) - o2.charAt(0);  // 升序
            }
        });

        // 遍历集合, 写到新文件中
        for (String s : list) {
            // 写字符串
            bw.write(s);
            // 写换行
            bw.newLine();
        }

        // 释放资源
        bw.close();
        br.close();
    }
}
3.0转换流

字符编码和字符集
总结:

编码: 字符 -> 字节  'a' -> 97
解码: 字节 -> 字符  97 -> 'a'

编码表: 字符和二进制数字的对应规则
   
字符集和编码表: 字符集包含编码表
    ASCII字符集
        ASCII编码表
        ASCII扩展编码表
    ISO-8859-1字符集: Tomcat Web服务器程序
        Latin-1: 拉丁字符. 没有中文. 每个字符由1byte组成
    GB字符集
        GB2312编码表: 每个字符由2byte组成
        GBK编码表: 每个字符由2byte组成
        GB18030编码表: 每个字符由1, 2, 4byte组成
    Unicode字符集
        UTF-8: ASCII字符占1byte, 拉丁字符占2byte, 中文占3byte, Unicode辅助字符占4byte
        UTF-16
        UTF-32
    ANSI: 表示使用系统默认编码表

乱码问题: FileReader读取GBK编码

总结:

乱码原因: 读写编码不一致
    GBK文件中存储的是"你好"GBK中对应的byte
    IDEA中使用FileReader读取文件时, 是将byte按照UTF-8编码表查找字符, 结果找不到, 就显示了问号

乱码:
    ???        找不到字符
    空格 看不见   找不到字符
    ρ        能找到字符, 但是找错了

转换流原理: 字符流和转换流的关系
知识点:
FileReaderInputStreamReader有什么关系
FileWriterOutputStreamWriter有什么关系
转换流有什么作用

总结:

java.io.Reader
    |_ InputStreamReader: 转换字符输入流      byte --查指定码表--> char, char[], String
        |_ FileReader                      byte --UTF-8码表--> char
java.io.Writer
    |_ OutputStreamWriter: 转换字符输出流      char, char[], String --查指定码表--> byte
        |_ FileWriter                       char --UTF-8码表--> byte

补充:


3.3OutputStreamWriter类介绍及使用
知识点:

创建OutputStreamWriter对象时, 如何指定使用的编码表

总结:
[Java] 纯文本查看 复制代码
java.io.OutputStreamWriter类: 输出转换流. 字符流通往字节流的桥梁
    // 构造方法
    OutputStreamWriter(OutputStream out): 使用默认编码表创建转换流
    OutputStreamWriter(OutputStream out, String charsetName): 使用指定编码表创建转换流

    
// 使用默认UTF-8
OutputStreamWriter o = new OutputStreamWriter(new FileOutputStream("a.txt"));
o.write("dsfdsfdsaf")

// 使用指定的GBK
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("a.txt"), "GBK");
        osw.write("你") -> 查"GBK"码表 -> -1,-2 -> FileOutputStream -> a.txt文件
         写数据: 字符流 --------------------------> 字节流
3.4 InputStreamReader类介绍及使用
知识点:
创建InputStreamReader对象时, 如何指定使用的编码表

总结:
[Java] 纯文本查看 复制代码
java.io.InputStreamReader类: 输入转换流. 字节流通往字符流的桥梁
    // 构造方法
    InputStreamReader(InputStream in): 使用默认编码表创建转换流
    InputStreamReader(InputStream in, String charsetName): 使用指定编码表创建转换流
    
// 使用默认UTF-8
InputStreamReader r = new InputStreamReader(new FileInputStream("a.txt"));

// 使用指定的GBK
InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"), "GBK");
     '你' <- 查"GBK"码表 <- isr.read() <- -1,-2 <- FileInputStream <- a.txt文件
                         读数据: 字符流 <---------- 字节流   
练习: 转换文件编码
5分钟练习: 转换文件编码

需求:
使用转换流, 读取GBK编码文件"我是GBK文件.txt"中的"你好", 转写到UTF-8编码文件"我是UTF8文件.txt", 保证UTF-8文件打开也能看到正确的中文

分析:
    GBK编码文件中保存的字符, 是根据GBK查询到的byte. UTF-8文件中, 要写入根据UTF-8查到的byte
        GBK"你好"byte --> GBK --> "你好" --> UTF-8 --> UTF-8"你好"byte
                      InputStreamReader      OutputStreamWriter
                          read()                write()
        
    使用InputStreamReader读取GBK编码文件时, 需要指定编码为GBK
    使用OutputStreamWriter将读取到的字符, 按照UTF-8写入到UTF-8编码文件
    边读边写类似于复制文件
    释放资源

代码:
[Java] 纯文本查看 复制代码
public class Test {
    public static void main(String[] args) throws IOException {
        // 创建转换输入流对象, 指向GBK文件, 同时指定按照GBK来读取
        InputStreamReader isr = new InputStreamReader(new FileInputStream("day10\\我是GBK.txt"), "GBK");
        // 创建转换输出流对象, 路径填写utf8文件, 同时指定按照UTF-8来写
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("day10\\我是UTF8文件.txt"), "UTF-8");

        // 循环读写: 类似于文件复制, 一次读写一个字符
        int ch;
        while ((ch = isr.read()) != -1) {
            // 读到一个写一个
            osw.write(ch);
        }

        // 刷新缓冲区并释放资源
        osw.close();
        isr.close();
    }
}
转换流小结:

FileReader = InputStreamReader + FileInputStream, 按照IDEAUTF-8将读取的字节转换为字符
FileWriter = OutputStreamWriter + FileOutputStream, 按照IDEAUTF-8将写出的字符转换为字节

转换流InputStreamReader, OutputStreamWriter在读写时, 可以指定按照哪个编码表来进行转换

所以:
字符流 = 编码表 + 字节流

转换流主要用于解决Web开发中的乱码问题

4.0 序列化流(对象流)

序列化和反序列化概述
总结:

序列化: 内存中的对象转换为字节序列, 以流的方式写入到磁盘的文件中
    对象 -> 字节
反序列化: 磁盘文件中的字节序列, 以流的方式读取到内存中变成对象
    字节 -> 对象

通过序列化流, 我们可以将内存中的数据方便的存储到磁盘上, 下次程序启动后也能从磁盘读取恢复之前的对象状态

OutputStream
    |_ ObjectOutputStream: 对象字节输出流
InputStream
    |_ ObjectInputStream: 对象字节输入流

4.1 对象序列化流:ObjectOutputStream
知识点:

ObjectOutputStream如何创建对象
调用什么方法将对象写入到文件
[
重要!] 被序列化的对象所属的类, 有什么特殊的要求

总结:
[Java] 纯文本查看 复制代码
java.io.ObjectOutputStream类: 对象字节输出流
    // 构造方法
    ObjectOutputStream(OutputStream out)
    // 特有成员方法
    void writeObject(Object obj): 将对象写出
    
// 创建对象输出流
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("student.txt"));
// 写对象
Student s = new Student("小美女", 18);
oos.writeObject(s);
// 释放资源
oos.close();

注意:
    被读写的对象的类必须实现"java.io.Serializable"接口, 否则会抛出"NotSerializableException"
4.2 对象反序列化流:ObjectInputStream
知识点:

ObjectInputStream如何创建对象
ObjectInputStream如何将对象从文件中读取到程序中

总结:
[Java] 纯文本查看 复制代码
java.io.ObjectInputStream类: 对象字节输入流
    // 构造方法
    ObjectInputStream(InputStream in)
    // 特有成员方法
    Object readObject(): 读取对象
    
// 创建对象输入流
ObjectInputStream oos = new ObjectInputStream(new FileInputStream("student.txt"));
// 读对象
Object o = oos.readObject();
Student s = (Student)o;
System.out.println(s);
// 释放资源
oos.close();
5.0 transient瞬态关键字: 避免属性序列化
总结:

static 修饰的成员变量属于类不属于对象, 所以不能序列化
transient 修饰的成员变量, 不能被序列化

transient 应用场景:
    如果对象的某个属性不希望被序列化, 可以使用 transient 修饰, 这样就不会被对象流写到文件中

5.1 InvalidClassException异常: 原因和解决方案
知识点:
[重要!]"InvalidClassException"什么情况下发生, 如何避免
[Java] 纯文本查看 复制代码
public class Person {[/align]    int age;
}
​
oos.writeObject(new Person("张三", 13));
Object p = ois.readObject();
总结:

serialVersionUID序列号的作用:
    序列化操作时, 会根据类生成一个默认的 serialVersionUID 属性, 写入到文件中.
    该版本号是根据类中成员计算出来的一个数值. 当类的成员发生改变时, 序列版本号也会发生变化
    当代码中的类和读取的对象序列版本号不一致时, 就会抛出InvalidClassException

为了避免这种问题, 我们可以手动写死这个序列号, 这样无论成员如何变化, 序列版本号都是一样的

练习: 序列化集合
5分钟练习: 序列化集合

注意:
被序列化的对象Person, 所属的类的所有属性也都必须是可序列化的. (实现 java.io.Serializable 接口)
    比如Person类中有 String name; 那么String也必须实现Serializable.
如果要将集合序列化, 那么集合中存储的对象也必须是可序列化的
    比如ArrayList<Person>存储的Person, ArrayList对象需要实现Serializable, Person也需
需求:
定义Person, 实现Serializable接口
    私有成员变量: String name, int age
    生成空参/有参构造, set/get方法, toString方法
定义测试类:
    创建ArrayList集合, 存储3Person对象:
        张三, 18
        李四, 19
        王五, 20
    使用序列化流将集合写入当前模块的list.txt文件中, 再反序列化并遍历集合打印元素

代码:
[Java] 纯文本查看 复制代码
public class Person implements Serializable {  // 实现序列化接口

    private static final long serialVersionUID = 5608846017542335980L;  // 定义序列版本号

    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

public class Test {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        // 创建集合
        ArrayList<Person> list = new ArrayList<>();
        list.add(new Person("张三", 18));
        list.add(new Person("李四", 19));
        list.add(new Person("王五", 20));

        // 创建对象输出流(序列化流)
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("day10\\list.txt"));
        // 写集合对象
        oos.writeObject(list);

        // 创建对象输入流(反序列化流)
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("day10\\list.txt"));
        // 读对象
        Object o = ois.readObject();
        // 将读取到的对象强转为集合
        ArrayList<Person> list2 = (ArrayList<Person>)o;

        // 遍历集合, 打印元素
        for (Person person : list2) {
            System.out.println(person);
        }
    }
}
补充:

序列化流的应用场景:
    以后我们会用到"缓存", 缓存就是一些数据, 是存储在内存中的, 比如存储某个用户登录的状态
   
而内存中的数据, 服务器一重启, 数据就没了, 所以我们需要在服务器重启前, 将内存中的数据写入到磁盘保存
   
这时就可以用 序列化流
   
服务器重启后, 先通过 反序列化流 读取到内存, 这样可以保持之前的状态

6.0 打印流
打印流PrintStream: 概述和使用
总结:
[Java] 纯文本查看 复制代码
PrintStream特点:
    1. 只有输出流, 没有输入流
    2. PrintStream不会抛出IOException
    3. 有特殊方法 print(), println(), 可以输出任意类型的值, 原样输出

java.io.PrintStream类: 字节打印流
    // 构造方法
    PrintStream(File file): 创建字节打印流, 输出到一个文件
    PrintStream(OutputStream out): 创建字节打印流, 输出到一个字节输出流
    PrintStream(String fileName): 创建字节打印流, 输出到一个文件路径
    
注意事项:
    如果用 write(97) 方法, 会查编码表   97 -> a
    如果用 print(97), println(97), 则原样输出  97 int -> '9''7' -> byte -> 文件 97
    System.out.println();
    PrintStream out;
    
java.lang.System类:
    // 静态方法
    static void setOut(PrintStream out): 设置System.out的输出目的地为参数的打印流
IO框架体系结构
[Java] 纯文本查看 复制代码
// 体系结构:
字节流
    |_ InputStream                 # 字节输入流
    |   |_ FileInputStream         # 专门操作文件的字节输入流
    |   |_ BufferedInputStream     # 带有缓冲区的字节输入流, 效率高
    |   |_ ObjectInputStream       # 对象输入流
    |
    |_ OutputStream                # 字节输出流
        |_ FileOutputStream        # 专门操作文件的字节输出流
        |_ BufferedOutputStream    # 带有缓冲区的字节输出流, 效率高
        |_ ObjectOutputStream      # 对象输出流 
        |_ PrintStream             # 字节打印流
字符流
    |_ Reader                      # 字符输入流
    |   |_ BufferedReader          # 带有缓冲区的字符输入流, 效率高
    |   |_ InputStreamReader       # 将字节流转换为字符流输入的转换输入流
    |       |_ FileReader          # 专门操作文件的字符输入流   
    |
    |_ Writer                      # 字符输出流
        |_ BufferedWriter          # 带有缓冲区的字符输出流, 效率高
        |_ OutputStreamWriter      # 将字符流转换为字节流输出的转换输出流
        |     |_ FileWriter         # 专门操作文件的字符输出流
今日API
[Java] 纯文本查看 复制代码
java.io.BufferedOutputStream类: 缓冲字节输出流
    // 构造方法
    BufferedOutputStream(OutputStream out): 使用基本流创建一个缓冲字节输出流
    BufferedOutputStream(OutputStream out, int size): 使用基本流创建一个缓冲字节输出流, 设置缓冲区大小

java.io.BufferedInputStream类: 缓冲字节输入流
    // 构造方法
    BufferedInputStream(InputStream in): 使用基本流创建一个缓冲字节输入流
    BufferedInputStream(InputStream in, int size): 使用基本流创建一个缓冲字节输入流, 设置缓冲区大小
    
java.io.BufferedWriter类:
    // 构造方法
    BufferedWriter(Writer out): 使用基本流创建一个缓冲字符输出流
    BufferedWriter(Writer out, int size): 使用基本流创建一个缓冲字符输出流, 设置缓冲区大小
    // 特有方法
    void newLine(): 写入一个换行符, 换行符自动根据当前系统确定
    
java.io.BufferedReader类: 缓冲字符输入流
    // 构造方法
    BufferedReader(Reader in): 使用基本流创建一个缓冲字符输入流
    BufferedReader(Reader in, int size): 使用基本流创建一个缓冲字符输入流, 设置缓冲区大小
    // 特有方法
    String readLine(): 一次读一行字符串, "不包含换行符". 读到文件末尾返回null
    
java.io.OutputStreamWriter类: 输出转换流. 字符流通往字节流的桥梁
    // 构造方法
    OutputStreamWriter(OutputStream out): 使用默认编码表创建转换流
    OutputStreamWriter(OutputStream out, String charsetName): 使用指定编码表创建转换流
    
java.io.InputStreamReader类: 输入转换流. 字节流通往字符流的桥梁
    // 构造方法
    InputStreamReader(InputStream in): 使用默认编码表创建转换流
    InputStreamReader(InputStream in, String charsetName): 使用指定编码表创建转换流
    
java.io.ObjectOutputStream类: 对象字节输出流
    // 构造方法
    ObjectOutputStream(OutputStream out)
    // 特有成员方法
    void writeObject(Object obj): 将对象写出
    
java.io.ObjectInputStream类: 对象字节输入流
    // 构造方法
    ObjectInputStream(InputStream in)
    // 特有成员方法
    Object readObject(): 读取对象
    
java.io.PrintStream类: 字节打印流
    // 构造方法
    PrintStream(File file): 创建字节打印流, 输出到一个文件
    PrintStream(OutputStream out): 创建字节打印流, 输出到一个字节输出流
    PrintStream(String fileName): 创建字节打印流, 输出到一个文件路径
    
java.lang.System类:
    // 静态方法
    static void setOut(PrintStream out): 设置System.out的输出目的地为参数的打印流









0 个回复

您需要登录后才可以回帖 登录 | 加入黑马