• 4.java的IO流技术(2/2)


    23常用流_ 对象流_将对象反序列化到内存中

    public class TestObjectInputStream {
        public static void main(String[] args) {
            //创建对象输入字节流与文件字节输入流对象
            try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:/data3"))){
                //将对象反序列化到内存中
                Users users = (Users) ois.readObject();
                System.out.println(users);
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    24File类在IO中的作用

    当以文件作为数据源或目标时,除了可以使用字符串作为文件以及位置的指定以外,我们也可以使用File类指定。

    public class TestFile {
        public static void main(String[] args) {
            //创建字符缓冲流与文件字符输入流对象
            try(BufferedReader br =  new BufferedReader(new FileReader(new File("d:/sxt.txt")));
                //创建字符输出流对象
                PrintWriter pw = new PrintWriter(new File("d:/sxt8.txt"))){
    
    
                //操作流
                String temp = "";
                int i=1;
                while((temp = br.readLine()) != null){
                    pw.println(i+","+temp);
                    i++;
                }
                pw.flush();
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    25装饰器模式构建IO流体系

    装饰器模式简介

    装饰器模式是GOF23种设计模式中较为常用的一种模式。它可以实现对原有类的包装和装饰,使新的类具有更强的功能。

    装饰器模式

    class Iphone {
        private String name;
        public Iphone(String name) {
            this.name = name;
        }
        public void show() {
            System.out.println("我是" + name + ",可以在屏幕上显示");
        }
    }
    
    
    class TouyingPhone {
        public Iphone phone;
        public TouyingPhone(Iphone p) {
            this.phone = p;
        }
        // 功能更强的方法
        public void show() {
            phone.show();
            System.out.println("还可以投影,在墙壁上显示");
        }
    }
    
    
    public class TestDecoration {
        public static void main(String[] args) {
            Iphone phone = new Iphone("iphone30");
            phone.show();
            System.out.println("===============装饰后");
            TouyingPhone typhone = new TouyingPhone(phone);
            typhone.show();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    IO流体系中的装饰器模式

    IO流体系中大量使用了装饰器模式,让流具有更强的功能、更强的灵活性。比如:

    FileInputStream  fis = new FileInputStream(src);
    BufferedInputStream  bis = new BufferedInputStream(fis);
    
    
    • 1
    • 2
    • 3

    显然BufferedInputStream装饰了原有的FileInputStream,让普通的FileInputStream也具备了缓存功能,提高了效率。

    26ApacheIO包_介绍

    Apache基金会介绍

    Apache软件基金会(也就是Apache Software Foundation,简称为ASF),是专门为支持开源软件项目而办的一个非盈利性组织。在它所支持的Apache项目与子项目中,所发行的软件产品都遵循Apache许可证(Apache License)。 官方网址为:www.apache.org

    很多著名的Java开源项目都来源于这个组织。比如:commons、kafka、lucene、maven、shiro、struts等技术,以及大数据技术中的:hadoop(大数据第一技术)、hbase、spark、storm、mahout等。

    commons-io工具包

    Apache的commons-io工具包中提供了IOUtils/FileUtils,为我们提供了更加简单、功能更加强大的文件操作和IO流操作功能。非常值得大家学习和使用。

    下载与添加commons-io包

    下载地址

    https://commons.apache.org/proper/commons-io/download_io.cgi

    添加jar包

    27ApacheIO包_FileUtils的使用一

    FileUtils类中常用方法的介绍

    打开FileUtils的api文档,我们抽出一些工作中比较常用的方法,进行总结和讲解。总结如下:

    方法名使用说明
    cleanDirectory清空目录,但不删除目录
    contentEquals比较两个文件的内容是否相同
    copyDirectory将一个目录内容拷贝到另一个目录。可以通过FileFilter过滤需要拷贝的文件
    copyFile将一个文件拷贝到一个新的地址
    copyFileToDirectory将一个文件拷贝到某个目录下
    copyInputStreamToFile将一个输入流中的内容拷贝到某个文件
    deleteDirectory删除目录
    deleteQuietly删除文件
    listFiles列出指定目录下的所有文件
    openInputSteam打开指定文件的输入流
    readFileToString将文件内容作为字符串返回
    readLines将文件内容按行返回到一个字符串数组中
    size返回文件或目录的大小
    write将字符串内容直接写到文件中
    writeByteArrayToFile将字节数组内容写到文件中
    writeLines将容器中的元素的toString方法返回的内容依次写入文件中
    writeStringToFile将字符串内容写到文件中

    读取文件内容,并输出到控制台上(只需一行代码!)

    import java.io.File;
    import org.apache.commons.io.FileUtils;
    public class TestUtils1 {
        public static void main(String[] args) throws Exception {
            String content = FileUtils.readFileToString(new File("d:/a.txt"), "gbk");
            System.out.println(content);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    28ApacheIO包_FileUtils的目录拷贝

    我们可以使用FileUtils完成目录拷贝,在拷贝过程中可以通过文件过滤器(FileFilter)选择拷贝内容。

    import java.io.File;
    import java.io.FileFilter;
    import org.apache.commons.io.FileUtils;
    
    
    public class TestFileUtilsDemo2 {
        public static void main(String[] args) throws Exception {
            FileUtils.copyDirectory(new File("d:/aaa"), new File("d:/bbb"), new FileFilter() {
                @Override
                public boolean accept(File pathname) {
                    // 使用FileFilter过滤目录和以html结尾的文件
                    if (pathname.isDirectory() || pathname.getName().endsWith("html")) {
                        return true;
                    } else {
                        return false;
                    }
                }
            });
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    29ApacheIO包_IOUtils的使用

    打开IOUtils的api文档,我们发现它的方法大部分都是重载的。所以,我们理解它的方法并不是难事。因此,对于方法的用法总结如下:

    方法名使用说明
    buffer将传入的流进行包装,变成缓冲流。并可以通过参数指定缓冲大小
    closeQueitly关闭流
    contentEquals比较两个流中的内容是否一致
    copy将输入流中的内容拷贝到输出流中,并可以指定字符编码
    copyLarge将输入流中的内容拷贝到输出流中,适合大于2G内容的拷贝
    lineIterator返回可以迭代每一行内容的迭代器
    read将输入流中的部分内容读入到字节数组中
    readFully将输入流中的所有内容读入到字节数组中
    readLine读入输入流内容中的一行
    toBufferedInputStream,toBufferedReader将输入转为带缓存的输入流
    toByteArray,toCharArray将输入流的内容转为字节数组、字符数组
    toString将输入流或数组中的内容转化为字符串
    write向流里面写入内容
    writeLine向流里面写入一行内容

    我们没有必要对每个方法做测试,只是演示一下读入d:/sxt.txt文件内容到程序中,并转成String对象,打印出来。

    IOUtils的使用

    import java.io.*;
    import org.apache.commons.io.IOUtils;
    public class TestIOUtilsDemo {
        public static void main(String[] args) throws Exception {
            String content = IOUtils.toString(new FileInputStream("d:/sxt.txt"),"utf-8");
            System.out.println(content);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    30.本章总结

    • 按流的方向分类:

      • 输入流:数据源到程序(InputStream、Reader读进来)。
      • 输出流:程序到目的地(OutputStream、Writer写出去)。
    • 按流的处理数据单元分类:

      • 字节流:按照字节读取数据(InputStream、OutputStream)。
      • 字符流:按照字符读取数据(Reader、Writer)。
    • 按流的功能分类:

      • 节点流:可以直接从数据源或目的地读写数据。
      • 处理流:不直接连接到数据源或目的地,是处理流的流。通过对其他流的处理提高程序的性能。
    • IO的四个基本抽象类:InputStream、OutputStream、Reader、Writer

    • InputStream的实现类:

      • FileInputStream
      • BufferedInputStream
      • DataInputStream
      • ObjectInputStream
    • OutputStream的实现类:

      • FileOutputStream
      • BufferedOutputStream
      • DataOutputStream
      • ObjectOutputStream
    • Reader的实现类

      • FileReader
      • BufferedReader
      • InputStreamReader
    • Writer的实现类

      • FileWriter
      • BufferedWriter
      • OutputStreamWriter
      • PrintWriter
    • 把Java对象转换为字节序列的过程称为对象的序列化。

    • 把字节序列恢复为Java对象的过程称为对象的反序列化。

  • 相关阅读:
    千访 | “霸总”人设揽粉近十万!小红书企业号还能这么玩?
    前端体验优化(4)——数据
    数据提取的艺术:如何通过数据治理提高效率
    算法随笔:各种经典最短路算法的简要比较总结
    每天一个注解之@Async
    MSF暴力破解SID和检测Oracle漏洞
    Redis学习笔记(四)Redis订阅发布&主从复制&哨兵模式
    我在Linux开发板上跑的第一个Qt程序
    【毕业设计】实现Python浏览器在线运行
    java预备知识
  • 原文地址:https://blog.csdn.net/ZXG20000/article/details/126329631