Java笔记6(IO)

只是一些自己认为重点和易错点的笔记

I/O框架相关笔记

1. 分类:

  • 按方向:输入输出流,是以内存为参考;

  • 按单位

    字节流:字节为单位,可读取所有数据;

    字符流:字符为单位,只能读写文本数据;

  • 功能

    节点流:传输实际数据的读写功能;

    过滤流: 在节点流基础上增强功能。

2. 字节流

    1. 字节流的父类(抽象类)

      1.1 InputStream抽象类:字节输入流的超类;

      1.2 OutputStream抽象类:字节输出流的超类。

    2. 子类:

      输入流:

      public static void main(String[] args) throws Exception {
              //创建输入流
              FileInputStream fis = new FileInputStream("d:\\aaa.txt");
              //1.1每次读取一个字节,读取完返回-1
      //        int date;
      //        while((date = fis.read()) != -1){
      //            System.out.print((char)date);
      //        }
          
          
      //    read()一个一个字节读,返回的就是这个字节的int表示
      //    read(byte[] b)返回数组字节个数,若数组未满,则返回真实字节个数
      
              
              
              //1.2 读取数值存到数组中
              byte[] bt = new byte[2];
              int count = 0;
              while((count = fis.read(bt)) != -1){
                  System.out.println(new String(bt,0,count));
      
              }
      
              //关闭
              fis.close();
      

      输出流:

      public static void main(String[] args) throws Exception {
              //创建输出流,有true参数表示在文件后追加,否则为覆盖
              FileOutputStream fos = new FileOutputStream("d:\\bbb.txt",true);
      
              fos.write(97);
              fos.write('b');
              fos.write('c');
              String s ="helloword";
              fos.write(s.getBytes());
      
      
              fos.close();
              System.out.println("执行完毕");
      
          }
      

      用字节输入输出流复制图片:

      public static void main(String[] args) throws Exception {
          //创建流
              FileInputStream fis = new FileInputStream("d:\\aaa.jpg");
              FileOutputStream fos = new FileOutputStream("d:\\bbb.jpg");
      	//一边读取一边写入
              byte[] bu = new byte[1024];
              int count=0;
              while((count = fis.read(bu)) != -1){
                  fos.write(bu,0,count);
              }
      	//关闭
              fis.close();
              fos.close();
              System.out.println("复制完毕");
          }
      

      字节缓冲流

      • 输入BufferedInputStream

        使用flush()刷新内容;

        public static void main(String[] args) throws Exception {
                //创建字节输入流
                FileInputStream fis = new FileInputStream("d:\\aaa.txt");
                //创建字节缓冲流
                BufferedInputStream bis = new BufferedInputStream(fis);
        
                int date = 0;
                while ((date = bis.read()) != -1){
                    System.out.println((char)date);
                }
                bis.close();
        

      }

      
      
      
      * 输出BufferedOutStream
      
      ```java
      public static void main(String[] args) throws Exception {
              //创建字符输出流
              FileOutputStream fos = new FileOutputStream("d:\\buffer.txt");
              BufferedOutputStream bos = new BufferedOutputStream(fos);
      
              for (int i = 0; i < 10; i++) {
                  bos.write("helloword".getBytes());
                  bos.flush();
              }
      
              //关闭
              bos.close();
      
          }
      

对象流

   * ObjectInputStream/ObjectOutputStream
   
   * 序列化(写入)时被创建对象的类需要实现Serializable接口,标记类的对象可被序列化;
   
   * 在被创建对象的类(Student)中添加**序列化版本号ID**,保证序列化的类和反序列化的类是同一个;
   
   * 添加**transient**修饰属性,此属性不可被序列化;
   
   * 静态属性不可被序列化;
   
   * 一次序列化多个,可将对象放入集合中。
   
     ```
     //序列化
     public static void main(String[] args) throws Exception {
             //创建对象流
             FileOutputStream fos = new FileOutputStream("d:\\stu.bin");
             ObjectOutputStream oos = new ObjectOutputStream(fos);
             //序列化(写入操作)
             Student st = new Student("zhangsan",33);
             oos.writeObject(st);
             //关闭
             oos.close();
         }
     ```
   
     ```java
     //反序列化
     public static void main(String[] args) throws Exception {
             //创建流
             FileInputStream fis = new FileInputStream("d:\\stu.bin");
             ObjectInputStream ois = new ObjectInputStream(fis);
     
             Student stu = (Student)ois.readObject();
     
             ois.close();
             System.out.println(stu.toString());
         }
     ```

3. 字符流

    1. 字符流父类(抽象类)

      Reader/Writer

    1. 子类:

    FileReader文件字符输入流

    public static void main(String[] args) throws Exception {
            FileReader fr = new FileReader("d:\\aaa.txt");
    
            //读取一个字符
    //        int data = 0;
    //        while((data = fr.read()) != -1){
    //            System.out.println((char)data);
    //        }
    
            //读取多个字符
            char[] ch = new char[10];
            int count = 0;
            while ((count = fr.read(ch)) != -1){
                System.out.println(new String(ch,0,count));
            }
            fr.close();
        }
    

    FileWriter文件字符输出流

    public static void main(String[] args) throws Exception {
            FileWriter fw = new FileWriter("d:\\bbb.txt");
    
            fw.write("好好学习java");
            fw.flush();
            fw.close();
        }
    
    //字符流复制文本文件
    
    public static void main(String[] args) throws Exception {
            FileReader fi = new FileReader("d:\\aaa.txt");
            FileWriter fw = new FileWriter("d:\\bbb.txt",true);
    
            char[] ch = new char[1024];
            int count = 0;
            while((count = fi.read(ch)) != -1){
                fw.write(new String(ch,0,count));
                fw.flush();
            }
    
            fi.close();
            fw.close();
            System.out.println("复制完毕");
    
        }
    

    ​ * 字符流不能用来复制图片或二进制文件,

    ​ * 字节流可复制任意文件

    字符缓冲流

    • 支持输入换行符;
    • 读一行,写一行。
    //字符输入缓冲流
    
    public static void main(String[] args) throws Exception {
            //创建对象
            FileReader fr = new FileReader("d:\\aaa.txt");
            BufferedReader br =new BufferedReader(fr);
            //读取一行
            String st = null;
            while((st = br.readLine()) != null){
                System.out.println(st);
            }
            br.close();
    
    //字符输出缓冲流
    
    public static void main(String[] args) throws Exception {
            FileWriter fw = new FileWriter("d:\\bbb.txt",true);
            BufferedWriter bw = new BufferedWriter(fw);
    
            for (int i = 0; i < 10; i++) {
                bw.write("可太菜了");
                bw.newLine();          //相当于换行符
                bw.flush();
            }
            bw.close();
    
        }
    

    打印流

    • PrintWriter类

    • 封装了print()和println()方法,支持写入后换行;

    • 支持数据原样打印。

      public static void main(String[] args) throws Exception {
              PrintWriter pw = new PrintWriter("d:\\print.txt");
      
              pw.println(97);
              pw.println(true);
              pw.println('a');
              pw.println(3.14);
      
              pw.close();
              System.out.println("执行完毕");
      
          }
      
      97
      true
      a
      3.14
      

4.转换流

  • InputStreamReader,字节转换为字符;

  • 可指定使用的编码。

    public static void main(String[] args) throws Exception {
            FileInputStream fis = new FileInputStream("d:\\aaa.txt");
            InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
    
            int date = 0;
            while((date = isr.read()) != -1)
                System.out.print((char)date);
    
            isr.close();
        }
    
  • OutputStreamWriter,字符转换为字节;

    public static void main(String[] args) throws Exception {
            FileOutputStream fos = new FileOutputStream("d:\\out.txt",true);
          OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
    
            for (int i = 0; i < 10; i++) {
                osw.write("java是最好的语言");
                osw.flush();
            }
    
    
            osw.close();
        }
    

File类

  • 代表物理盘符下的文件或文件夹

    文件操作

    public class FileTest {
        public static void main(String[] args) throws Exception {
            //测试分隔符
    //        separator();
            //测试文件操作
              fileOpe();
        }
    
        //分隔符
        public static void separator(){
            System.out.println("路径分隔符:" + File.pathSeparator);   //输出为;
            System.out.println("名字分隔符:" + File.separator);       //输出为\
        }
    
        //文件操作
        public static void fileOpe() throws Exception{
            //1、创建文件
            File file = new File("d:\\file.txt");
            if(!file.exists()){
                boolean newf = file.createNewFile();
                System.out.println("创建结果:" + newf);
            }
            //2、删除文件
    //        boolean delete = file.delete();
    //        System.out.println("删除结果:" + delete);
    
            //2.1 当JVM 退出时删除
    //        file.deleteOnExit();
    ////        Thread.sleep(5000);
    
            //3、获取文件绝对路径
            System.out.println("绝对路径:" + file.getAbsolutePath());
            System.out.println("路径:" + file.getPath());
            System.out.println("文件名称:" + file.getName());
            System.out.println("父目录:" + file.getParent());
            System.out.println("文件长度:" + file.length());
            System.out.println("文件创建时间:" + new Date(file.lastModified()).toLocaleString());
    
            //4、判断
            System.out.println("是否可写:" + file.canWrite());
            System.out.println("是否是文件:" + file.isFile());
            System.out.println("是否隐藏:" + file.isHidden());
    
    
        }
    

    文件夹操作

    public static void directoryOpe() throws Exception{
            //1.创建文件夹
            File dir = new File("d:\\aaa\\bbb\\ccc");
            if(!dir.exists()){
             //   dir.mkdir();    //只能创建单级目录
                System.out.println("创建结果:" + dir.mkdirs());
            }
            //2.删除文件夹
            //2.1直接删除
    //        System.out.println("删除结果:" + dir.delete());      //只删除ccc,且ccc必须为空
    
            //2.2通过JVM删除
    //        dir.deleteOnExit();
    //        Thread.sleep(5000);
            //3.获取文件夹信息
            System.out.println("文件夹绝对路径:" + dir.getAbsolutePath());
            System.out.println("路径:" + dir.getPath());
            System.out.println("名字:" + dir.getName());
            System.out.println("父目录:" + dir.getParent());
            System.out.println("创建时间:" + new Date(dir.lastModified()).toLocaleString() );
            //4.判断
            System.out.println("是否为文件夹:" + dir.isDirectory());
            System.out.println("是否隐藏::" + dir.isHidden());
    
            //5.遍历文件夹
            File dir1 = new File("d:\\java");
            String[] str = dir1.list();       //遍历文件夹名
            for (String s : str) {            //dir.listFiles() 遍历文件夹路径
                System.out.println(s);
            }
    
            //6.过滤,选择想要的文件类型
            File[] files = dir1.listFiles(new FileFilter() {
                @Override
                public boolean accept(File pathname) {
                    if(pathname.getName().endsWith(".jpg")){
                        return true;
                    }else {
                        return false;
                    }
    
                }
            });
            for (File file : files) {
                System.out.println(file);
            }
        }
    

    递归遍历和删除多级文件夹

    public static void main(String[] args) {
            listDir(new File("d:\\aaa"));
            deleteDir(new File("d:\\aaa"));
            System.out.println("执行成功");
        }
        //递归遍历文件夹
        public static void listDir(File dir) {
            File[] files = dir.listFiles();
    
            if(files!=null&&files.length>0){
                for (File file : files) {
                    if(file.isDirectory()){
                        listDir(file);
                    }else {
                        System.out.println(file);
                    }
                }
            }
        }
        //递归删除文件夹
        public static void deleteDir(File dir){
            File[] files = dir.listFiles();
            if(files!=null&&files.length>0){
                for (File file : files) {
                    if(file.isDirectory()){
                        deleteDir(file);
                    }else{
                        file.delete();
                    }
                }
            }
            dir.delete();
    
        }
    
posted @ 2021-02-27 11:18  一个菜菜的boy  阅读(38)  评论(0)    收藏  举报