Day14

转换流

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cR0ummfV-1613780423964)(C:\Users\lcj\AppData\Roaming\Typora\typora-user-images\image-20210218110017045.png)]

package com.ioText.zhuanHuanLiu;

import java.io.*;

/*
    java.io.OutputStreamWriter extends Writer
    OutputStreamWriter; 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。(编码:把把能看得懂的变成看不懂的)

    继承自父类的共性成员方法:
        void write(int c)写入单个字符。
        void write(char[] cbuf)写入字符数组
        abstract void write(char[] cbuf,int off,int len)写入字符数组的某一部分,off,数组开始索引,len 写的字符个数。
        void write (String str)写入字符串
        void write (String str,int off,int len)写入字符串的额一部分,off字符串开始索引,len写的字符个数
        void write()刷新该流的缓冲
        void close()关闭此流,但要先刷新
   构造方法:
    OutputStreamWriter(OutputStream out) 创建使用默认字符编码的 OutputStreamWriter。
    OutputStreamWriter(OutputStream out, String charsetName)创建使用指定字符集的 OutputStreamWriter。
    参数:
        OutputStream out:字节输出流,可以用来写转换之后的字节到文件中
        String charsetName:指定编码表名称,不区分大小写,可以是utf-8/UTF-8/gbk/GBK 不指定默认使用UTF-8
   使用步骤:
    1.创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称
    2.使用OutputStreamWriter对象中的方法write,把字符转换为字节存储在缓冲区中(编码)
    3.使用OutputStreamWriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写节的过程)
    4.释放资源

 */
public class Demo01 {
    public static void main(String[] args) throws IOException {
        write_utf_8();
        
    }

    private static void write_utf_8() throws IOException {
        //1.创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("基础语法\\utf_8.txt"),"utjavf-8");
        //2.使用OutputStreamWriter对象中的方法write,把字符转换为字节存储在缓冲区中(编码)
        osw.write("你好");
        //3.使用OutputStreamWriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写节的过程)
        osw.flush();
        //4.释放资源
        osw.close();
    }
}
package com.ioText.zhuanHuanLiu;

import java.io.FileInputStream;

import java.io.IOException;
import java.io.InputStreamReader;

/*
    java.io.InputStreamReader extends Reader
    InputStreamReader:是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。(看不懂的转换为看得懂的)

    继承自父类的成员方法:
        int read() 读取单个字符并返回
        int read(char[] cbuf) 一次读取多个字符,将字符读入数组
        void close()关闭资源并释放与之关联的所有资源
   构造方法:
    InputStreamReader(InputStream in) 创建一个使用默认字符集的 InputStreamReader。
    InputStreamReader(InputStream in, String charsetName) 创建使用指定字符集的 InputStreamReader。
    参数:
        InputStream in:字节输入流:读取文件中保存的字节
        String charsetName:指定编码表名称,不区分大小写,不指定默认使用utf-8
   使用步骤:
    1.创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称
    2.使用InputStreamReader对象中的方法reader,读取文件
    3.释放资源

   注意事项:
    构造方法指定的编码表名称要和我呢见的编码相同,否则会发生乱码
 */
public class Demo02 {
    public static void main(String[] args) throws IOException {
        reader_utf_8();
    }

    private static void reader_utf_8() throws IOException {
            //1.创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称
            InputStreamReader isr = new InputStreamReader(new FileInputStream("基础语法\\utf_8.txt"), "utf-8");
            //2.使用InputStreamReader对象中的方法reader,读取文件
            int len=0;
            while((len= isr.read())!=-1){
                System.out.print((char)len);
            }
            //3.释放资源
            isr.close();
        }
        }

序列化与反序列化流

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XA0d7Iql-1613780423966)(C:\Users\lcj\AppData\Roaming\Typora\typora-user-images\image-20210218160531010.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oBTiJGVz-1613780423967)(C:\Users\lcj\AppData\Roaming\Typora\typora-user-images\image-20210218160604033.png)]

对象的序列化流

package com.ioText.xuLieHua;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;

/*
    java.io.ObjectOutputStream extends OutputStream
    ObjectOutputStream:对象的序列化流
    作用:把对象以流的方式写入到问价中保存

    构造方法:
        ObjectOutputStream(OutputStream out)创建写入指定 OutputStream 的 ObjectOutputStream。
        参数:
            OutputStream out:字节输出流
    特有的成员方法:
        writeObject(Object obj) 将指定的对象写入 ObjectOutputStream。
    使用步骤:
        1.创建ObjectOutputStream对象,构造方法中传递字节输出流
        2.使用ObjectOutputStream对象中的方法writeObject,把对象写入文件中
        3.释放资源
 */
/*
    序列化和反序列化的时候会抛出NotSerializableException没有序列化异常
    类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。
    Serializable接口也叫标记型接口
        要进行序列化和反序列化的类必须实现Serializable接口,就会给类添加一个标记
        当我们进行序列化和反序列化的时候就会检测类上是否有这标记
        有:可以序列化和反序列化
        没有:就抛出NotSerializableException异常
 */
public class Demo01 {
    public static void main(String[] args) throws IOException {

        //1.创建ObjectOutputStream对象,构造方法中传递字节输出流
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("基础语法\\person.txt"));
        //2.使用ObjectOutputStream对象中的方法writeObject,把对象写入文件中
        oos.writeObject(new Person("小美女",18));
        //3.释放资源
        oos.close();
    }
}

对象的反序列化流

package com.ioText.xuLieHua;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

/*
    java.io.ObjectInputStream extends InputStream
    ObjectInputStream:对象的反序列化流
    作用:把文件中保存的对象,以流的方式读取出来

    构造方法:
        ObjectInputStream(InputStream in) 创建从指定 InputStream 读取的 ObjectInputStream。
        参数:
            InputStream in:字节输入流
    特有的成员方法:
        readObject()从 ObjectInputStream 读取对象。
    使用步骤:
        1.创建ObjectInputStream对象,构造方法中传递字节输入流
        2.使用ObjectInputStream对象中的方法readerObject,读取保存对象的文件
        3.释放资源
        4.使用读取出来的对象(打印)

        ClassNotFoundException(文件找不到异常)
        当不存在对象的class文件时抛出异常
        反序列化的前提:
            1.类必须实现Serializable
            2.必须存在类对应的class文件
 */
public class Demo02 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //1.创建ObjectInputStream对象,构造方法中传递字节输入流
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("基础语法\\person.txt"));
        //2.使用ObjectInputStream对象中的方法readerObject,读取保存对象的文件
        Object o = ois.readObject();
        //3.释放资源
        ois.close();
        //4.使用读取出来的对象(打印)
        System.out.println(o);
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fFyOf9Wb-1613780423971)(C:\Users\lcj\AppData\Roaming\Typora\typora-user-images\image-20210218165850516.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nzyLd4Pm-1613780423973)(C:\Users\lcj\AppData\Roaming\Typora\typora-user-images\image-20210218170012685.png)]

序列练习

package com.ioText.xuLieHua;

import java.io.*;
import java.util.ArrayList;

/*
    练习:序列化集合
        当我们想在文件中保存多个对象的时候
        可以把多个对象存储在一个集合中
        对集合进行序列化和反序列化

    分析:
        1.定义一个存储Person对象的ArrayList集合
        2.往ArrayList集合存储Person对象
        3.创建一个序列化流ObjectOutputStream对象
        4.使用ObjectOutputStream对象中的方法writeObject,对集合进行序列化
        5.创建一个反序列化ObjectInputStream对象
        6.使用ObjectInputStream对象中的方法readObject读取文件中保存的集合
        7.把Object类型的集合转换为ArrayList类型
        8.遍历ArrayList集合
        9释放资源
 */
public class Text {
    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("基础语法\\text.txt"));
        oos.writeObject(list);
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("基础语法\\text.txt"));
        Object object = ois.readObject();
        ArrayList<Person> list1=(ArrayList)object;
        for (Person person : list1) {
            System.out.println(person);
        }
        ois.close();
        oos.close();
    }
}

打印流

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LtwGFo1y-1613780423974)(C:\Users\lcj\AppData\Roaming\Typora\typora-user-images\image-20210218184412827.png)]

package com.ioText.daYinLiu;

import java.io.FileNotFoundException;
import java.io.PrintStream;

/*
    java.io.printStream:打印流
        PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。
    PrintStream特点:
        1.只负责数据的输出,不负责数据的读取
        2.与其他输出流不同,PrintStream 永远不会抛出 IOException
        3.有特有的方法print println
            void print(输出任意的值)
            void println(输出任意的值并换行)
   构造方法:
    PrintStream(File file) 创建具有指定文件且不带自动行刷新的新打印流。 //输出的目的地是一个文件
    PrintStream(OutputStream out) 创建新的打印流。  //输出的目的地是一个字节输出流
    PrintStream(String fileName) 创建具有指定文件名称且不带自动行刷新的新打印流。  //输出的目的地是一个文件路径
  PrintStream extends OutputStream
  继承自父类的成员方法:
    -public void close():关闭此输出流并释放与此相关联的任何资源
    -public void flush():刷新此输出流并强制任何缓冲的输出字节被写入
    -public void write(byte[] b):将b.length字节从指定的字节数组写入此输出流
    -public void write(byte[] b,int off,int len):从指定字节数组len字节,从偏移量off开始输出到此输出流
    -public abstract void write(byte[] b)从指定的字节输出流
  注意:
        如果使用继承自父类的write方法写数据,那么查看数据的时候会查询编码表97->a
        如果使用自己特有的方法print/println方法写数据,写的数据鸳鸯输出97->97
 */
public class Demo01 {
    public static void main(String[] args) throws FileNotFoundException {
        //创建打印流PrintStream对象,构造方法中绑定要输出的目的地
        PrintStream ps = new PrintStream("基础语法\\print.txt");//抛出文件找不到异常
        ps.write(97);
        ps.println(97);
        ps.close();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值