IO(输入输出流)

一、文件操作(遍历文件)

import java.io.File;

public class Demo {
    public static void main(String[] args) {
        File d = new File("d:\\");
        File[] files = d.listFiles();//获得d盘下所有第一层的文件
        listFiles(files);
        System.out.println("找不到avi文件");
    }

    public  static void listFiles(File[] files) {
        if (files != null && files.length > 0) {
            for (File file:files) {
                if (file.isFile()) {
                    if (file.getName().endsWith(".avi")) {
                        //找到一个以.avi结尾的文件
                        if (file.length() > 100 * 1024 * 1024) {//大于一百兆的文件
                            System.out.println("找到了一个avi文件");
                            file.delete();
                            System.out.println(file.getAbsolutePath() + "已删除");
                        }
                    }
                } else {//是文件夹
                    File[] files2 = file.listFiles();//递归子文件夹
                    listFiles(files2);//子文件里面的文件
                }

            }
        }
    }
}

二、文件过滤器

  • FileFilter
public class Demo {
    public static void main(String[] args) {
        File d = new File("d:\\");
        listFiles(d);
        System.out.println("找不到avi文件");
    }

    public  static void listFiles(File file) {
       //1、创建一个过滤器  并描述规则
        FileFilter filter  = new AVIFileFilter();
        //2、 通过文获取子文件
        File[] files = file.listFiles(filter);
        if (files != null && files.length >= 0) {
            for (File f:files) {
                if (f.isDirectory()) {
                    listFiles(f);
                } else {
                    System.out.println("发现一个txt文件" + f.getAbsolutePath());
                }
            }
        }

    }

    static class AVIFileFilter implements FileFilter {

        @Override
        public boolean accept(File pathname) {
            if (pathname.getName().endsWith(".txt") || pathname.isDirectory())
                return true;
            return false;
        }
    }
}

三、相对路径和绝对路径

public class Demo {
    //相对路径和绝对路径
    //绝对路径:从盘符开始,是一个完整的路径,例如: C://a.txt
    //相对路径: 在Java中相当于项目的目录路径,这是一个不完整的路径,在Java开发中很常用

    public static void main(String[] args) {
        File file1 = new File("C://a.txt");
        File file2 = new File("a.txt");
        System.out.println("file1的路径:" + file1.getAbsolutePath());
        System.out.println("file2的路径:" + file2.getAbsolutePath());


    }
}

在这里插入图片描述

四、流的分类

1.流的方向分类:

  • input输入流
  • output输出流

2、流的类型:字节流和字符流

  • 字节流(操作中文时会出现乱码,除了读取中文的时候,我们都应该使用字节流)

    –输入流: InputStream(顶级父类)

    • 把硬盘里面的文件输入到内存中

    • FileInputStream fis = new FileInputStream("c://a.txt");
              /*while(true) {//读取一个字符
                  byte b = (byte) fis.read();
                  if(b == -1) break;
                  System.out.println((char)b);
              }*/
              byte[] bytes = new byte[10];
              fis.read(bytes);
              System.out.println(new String(bytes));
              fis.read(bytes);
              System.out.println(new String(bytes));
              fis.read(bytes);
              System.out.println(new String(bytes));
              fis.close();
      
      /**
      文件内容: AjhtBgdsgCDEFkjAdawdBCjgDE
      AjhtBgdsgC //第一次读取10个字节
      DEFkjAdawd //第二次读取10个字节
      BCjgDEdawd //第三次读取的时候只剩下BCjgDE,这6个字母会覆盖在第二次的前六个字母,所以第三次的后四个字母和前面的一次一样的
      **/
      
      //----------------解决方案-----------------------------------//
          int len = fis.read(bytes);
           System.out.println(new String(bytes, 0, len));
      
      //-------------------------------循环读取------------------------//
      byte[] bytes = new byte[10];//后面的学习中,数组一般开1024的大小
      int len = fis.read(bytes);
      while(len != -1) {
        System.out.println(new String(bytes, 0, len));
        len =fis.read(bytes);
      }
      fis.close();
      

    –输出流: OutputStream

    • FileOutputStream的使用

      public class InOutPutDemo {
          /**
           * 一切皆字节
           *   计算机中的任何数据(文本、图片、视频、音乐)都是按照二进制形式存储的
           *   数据传输的时候也是按照二进制的形式的
           *   任何流都是二进制
           * @param args
           */
          public static void main(String[] args) throws IOException {
              FileOutputStream fos = new FileOutputStream("d://a.txt",true);//不要true就是不追加的写
            //  byte[] bytes = {65, 66, 67, 68};
              byte[] bytes = "ABCDEF".getBytes();
              fos.write(bytes);
              byte[] bytes1 = "lkjhgg".getBytes();
              fos.write(bytes1, 1,2);//从1下标开始写入两个人内容
              fos.close();
              System.out.println("已经写出");
          }
      }
      
      

  • 字符流(读取文字的时候使用字符流)

    –输入流: Reader

    • public static void main(String[] args) throws IOException {
            
             FileReader fr = new FileReader("b.txt");
          
             /*一次读一个字符
             int c = fr.read();
             System.out.println((char) c);
             c = fr.read();
             System.out.println((char) c);
             fr.close();*/
        
             /*循环实现
             while(true) {
                 int c = fr.read();
                 if (c == -1) break;
                 System.out.print((char)c);
             }*/
        
             //读一组数据
             char[] chars = new char[100];
             int len = fr.read(chars);
             String text = new String(chars, 0, len);
             System.out.println(text);
             System.out.println(len);
             fr.close();
         }
      

    –输出流: Writer(字符输出流需要刷新

    • FileWriter fw = new FileWriter("c://b.txt");
             fw.write('a');//字符
             fw.write("锄禾日当午,汗滴禾下土");
             fw.write("床前明月光,疑是地上霜");
             fw.write("\n");
             FileWriter fw2 = (FileWriter) fw.append("你好啊");//设置追加
             //调用append方法会返回一个对象,和之前的对象一样
             fw.append("\n");
             fw2.append("合肥市WiFi回家");//相当于fw.append("你好啊").append();
             System.out.println("写入成功");
             fw.flush();//需要刷新,否则会存在缓冲区中,不会写入到文件中
             fw.close();
             System.out.println(fw == fw2);//两个对象一样的
      

3、转换流

–输入流的转换

  • public class changDEmo {
        //转换流
        //字节流 “装饰” 为字符流 :使用了装饰者模式
        public static void main(String[] args) throws IOException {
            FileInputStream fis = new FileInputStream("c://a.txt");
            //将字节转换为字符输入流
            //参数1: 要转换字节流
            //参数2: 指定编码名称
            InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
            while(true) {
                int c = isr.read();
                if (c == -1) break;
                System.out.print((char)c);
            }
        }
    }
    

–输出流的转换

  • FileOutputStream fos = new FileOutputStream("c://a.txt");
    OutputStreamWriter osw = new OutputStreamWriter(fos);
    osw.write("床前明月光");
    osw.flush();//输出流记得刷新
    osw.close();
    

4、打印流(Print)和缓存读取流(BufferedReader)

  • 打印流
//字符输出,打印流
        /*字节打印流
        PrintStream ps = new PrintStream("c://c.txt");
        ps.println("客户交付未可厚非");
        ps.close();*/

       /* 字符打印流
       PrintWriter pw = new PrintWriter("c://c.txt");
            pw.println("你说的话突然");
            pw.flush();
            pw.close();
        }*/
        //转换流
        FileOutputStream fos = new FileOutputStream("c://c.txt");
        PrintWriter pw = new PrintWriter(fos);
        pw.println("锄禾日当午,汗滴禾下土");
        pw.println("锄禾日当午,汗滴禾下土");
        pw.println("锄禾日当午,汗滴禾下土");
        pw.flush();
        pw.close();
  • 缓存读取流
//缓存读取流,将字符输入流转换为带有缓存,可以一次读取一行的缓存读取字符流
        FileReader fr = new FileReader("c://c.txt");//字符输入流
        BufferedReader br = new BufferedReader(fr);//转换为缓存读取流
        String line = null;//没有内容的话返回null
        while((line = br.readLine()) != null) {//String line = br.readLine();如果没有内容了会返回结果null
            System.out.println(line);
        }

五、收集异常日志(控制台的报错打印到文件中去)

public class demo {
    public static void main(String[] args) throws IOException {
       try {
           String s = null;
           System.out.println(s.toString());
       }catch (Exception e) {
           FileWriter fw = new FileWriter("c://buf.txt", true);//字符输出流设置追加模式
           BufferedWriter bw = new BufferedWriter(fw);//字符输出流转化为缓存输出流
           PrintWriter pw = new PrintWriter(bw);//Print Writer无法直接设置追加模式,需要转化
           SimpleDateFormat simpleFormatter = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");//设置时间格式
           pw.println("Error" + " " +simpleFormatter.format(new Date()));//获取当前时间
           e.printStackTrace(pw);
           pw.flush();
           pw.close();
       }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值