[java进阶]——高级IO流家族,序列化流、打印流、压缩流、转换流

键盘敲烂,年薪30万

目录

一、序列化流 (对象操作流)

二、打印流

三、压缩流(zip文件)

四、转换流


一、序列化流 (对象操作流)

序列化的概念:

当不想让他人读懂文件里的数据时,可以将数据序列化

创建一个自定义对象时,会根据所有成员计算出一个序列号。

存储数据时,会先根据序列号序列化内容,然后把序列号和被序列内容一同存到文件里面。

//序列化流
Studen s = new Studen("xiaohong", 14);
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("10_16\\a.txt"));
oos.writeObject(s);
oos.close();
//反序列化输入流
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("10_16\\a.txt"));
Object o = ois.readObject();
ois.close();
System.out.println(((Studen) o));

代码解析:

要关联基本流

别忘了关流

细节:

①要序列化的类必须实现Serializable接口,该接口是标记性接口,里面没有抽象方法,作用就是标识这个类可被序列化和反序列化

②如果我们存完该类后,又修改了该类的成员,序列号就会变,序列号变也就意味着以前的序列号没用了,你在反序列化就会报错,在该类中添加以下代码。

private static final long serialVersionUID = -1326719789726226251L;

③反序列化出来的数据类型是Object,我们要强转为需要的类型

用集合序列化多个对象

如果我们在存储一个类的多个对象是,在反序列化时读取到最后一个就会错,EOFExpection异常,所以 一般我们用集合存储多个对象,直接序列化和反序列化集合

二、打印流

PrintStream ps = new PrintStream(new FileOutputStream("10_16\\a.txt"));
ps.println("BBB");
ps.close();

代码分析:

关联基本流

使用print、printfln等方法向文件写数据

关流

标准输出流

System.out.printfln就是标准输出流,输出到控制台。

System是系统的一个类.out一个静态的输出流,默认指向控制台,所以这也是为什么我们每次打印都能在控制台看到数据

三、压缩流(zip文件)

解压缩本质:从压缩文件读取数据,每一个ZipEntery对象代表一个压缩文件或文件夹

File src = new File("10_16\\a.zip");
File dest = new File("10_16\\");
unzip(src, dest);
private static void unzip(File src, File dest) throws IOException {
ZipInputStream zip = new ZipInputStream(new FileInputStream(src), Charset.forName("GBK"));
        //nextEntry表示压缩包里面的每一个文件,读取完返回null
        ZipEntry ze = null;
        while((ze = zip.getNextEntry()) != null){
            //如果是文件夹 创建文件夹
            if(ze.isDirectory()){
                new File(dest, ze.toString()).mkdir();
            }else{
                int tmp = 0;
                FileOutputStream fos = new FileOutputStream(new File(ze.toString()));
                while((tmp = zip.read()) != -1){
                    fos.write(tmp);
                }
                fos.close();
            }

        }
        zip.close();
    }

压缩实际:将数据写入到压缩文件,将压缩文件对象放到压缩包里

//压缩文件流
        File src = new File("10_16\\a");
        File dest = new File(src.getParent(), src.getName()+".zip");
        //将文件写入压缩文件流
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(dest));
        //第三个参数代表压缩包里面的路径
        //注意第三个参数
        toZip(src, zos, src.getName());

        zos.close();
 private static void toZip(File src, ZipOutputStream zos, String dest) throws IOException {
        //files是绝对路径
        File[] files = src.listFiles();
        for (File file : files) {
            if(file.isDirectory()){
                toZip(file, zos, dest+"\\"+file.getName());
            }else{
                //将文件写入到entryzip对象里,将此对象put到压缩包里
                ZipEntry ze = new ZipEntry(dest+"\\"+file.getName());
                zos.putNextEntry(ze);
                FileInputStream fis = new FileInputStream(file);
                int tmp = 0;
                while((tmp = fis.read()) != -1){
                    zos.write(tmp);
                }
                fis.close();
                zos.closeEntry();
            }
        }

    }

四、转换流

是字符流与字节流之间的桥梁

InputStreamReader:将一个输入字节流转换为字符流(读数据的时候可以读一个字符)

OutputSreamWriter:将一个输出字符流转为字节流(写数据的时候写一个字节)

        //将字节流转换为字符流
        File newfile = new File("IOTest1\\a.txt");
        InputStreamReader isr = new InputStreamReader(new FileInputStream(newfile));
        int tmp = 0;
        while ((tmp = isr.read()) != -1){
            System.out.print((char)tmp);
        }
        isr.close();
        File newfile = new File("IOTest1\\a.txt");
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(newfile));
        osw.write("我是通过转换流写入的");
        osw.close();

你可能感兴趣的:(Java开发基础,java,开发语言)