Java文件过滤器与字节的输入输出流

一、Java文件过滤器(是个接口)
1.FileFilter 接口,过滤器接口
2.格式:将这个接口的实例传递给File类的listFiles(FileFilter)方法
3.过滤器中的方法 boolean accept(File pathiname)测试路径名是佛包含在某个路径名里
4.例题
a.
public static void fun1() {
    File file = new File("/Users/lanou/Desktop/leveldir");
     File[] listFiles = file.listFiles(new MyFileFilter());
        for (File subFile : listFiles) {
            System.out.println(subFile.getName());
结果:
a
b
sss.txt
//由于MyFileFilter过滤器 里返回true所以不执行过滤,如果执行,为空
        }
}
//过滤器实现类
//注:编写过滤器规则,实现过滤器接口,
//a.返回 fals就是执行过滤规则,不将路径添加到数据
//b.返回true的时候保留路径并添加到数组
class MyFileFilter implements FileFilter{
    @Override
    public boolean accept(File pathname) {
    //注意:如果这里,我的leveldir文件夹下有{文件夹a,文件夹b,文件sss.txt
        return true;
结果:true不执行过滤        
    }

}

b.
//封装的方法
 public static void getTxtFile(File file) {
       File[] listFiles = file.listFiles(new MyFilerTXT());
       for (File subListFile : listFiles) {
           if (subListFile.isDirectory()) {
            getTxtFile(subListFile);
        }else {

            System.out.println(subListFile.getName());
        }
    }
 }
//过滤器----过滤txt文件
class MyFilerTXT implements FileFilter{

    @Override
    public boolean accept(File pathname) {
    //相当一第一级的文件都判断了一下,后缀是不是txt文件,如果是就取反过滤
         //判断是文件夹,直接返回
         if (pathname.isDirectory()) {
            return true;
        }
        return  !pathname.getName().endsWith("txt");
    }

}
c.测试接口方法的作用--FilmenameFilter接口
 //注:参数dir:传进来的文件夹根路径
      参数name:传进来的是该路径下文件的名字和文件夹的名字
    //在这里我们可以利用这两个参数,来创建一个文件对象出来
class MyFilenameFilter implements FilenameFilter
{

    public boolean accept(File dir, String name) {  
        File file = new File(dir, name);
        System.out.println(file);
        结果:是文件对象的路径
        return true;
    }

}

二、字节流的输出流与输入流

1.字节流:总体参照物是自己的程序
 a.输出:从程序到文件
 b.输入:从文件到程序
2.字节输出流--写文件
OutputStream是抽象类,并且是所有输出流所有类的父类
注:这里写入一次只写一个字节,一个字节8个二进制
3.例题
a.写文件的流程
1)绑定要写入的文件 或文件路径
2)使用write方法写入
3)关闭资源 close();
public static void fun1() throws FileNotFoundException, IOException {
  //注:a.绑定数据的目的地,绑定要写入的文件
      //b.该路径写没有该文件,会帮你创建出这个文件
     // c.如果已经有了该文件,文件会被覆盖
     File file = new File("/Users/lanou/Desktop/Test 2/wang.txt");
     FileOutputStream oStream = new FileOutputStream(file);
     //写入数据
     //按ASCII码表输入的
     oStream.write(48);
     oStream.write(48);
     oStream.write(49);

     //用字节数组写入
      byte [] bs = {65,66,67,68};
      oStream.write(bs);
     //按字节数组的索引和长度写入
      oStream.write(bs, 1,2);
      //简单写法
      oStream.write("Hello".getBytes());
      oStream.write("World".getBytes());

     //关闭资源
     oStream.close();
}
b.方法的续写和换行
public static void fun2() throws FileNotFoundException, IOException {
     File file = new File("/Users/lanou/Desktop/Test 2/long.txt");
     FileOutputStream oStream = new FileOutputStream(file, true);
     //windows /r/n
     oStream.write("Hello\n".getBytes());

      oStream.close();
}
c.写入文件--异常处理
public static void fun() {
     //异常处理
    File file = new File("/Users/lanou/Desktop/Test 2/so.txt");
    FileOutputStream oStream = null;
     try {
         //创建输出流
         //这里我们像FileOutputStream()传入file参数--这里的参数我们传入
         //File实例对象 file,但是我们并不知道,所传入的路径是否存在
         //所以这里要进行异常处理,try{}catch{}异常处理
         oStream  = new  FileOutputStream(file);
        //创建流后我们执行向文件里写入内容,
        //这里我们将使用"hello".getBytes()
        //意思是,将"hello"走位字符串对象,调用字符串里的getBytes()方法
        //返回值是byte[] b 字节数组--即"hello".getBytes()== byte [h,e,l,l,o] b;
        //这里面也会异常:因为,我们是向文件里面写入内容的,如果一些因素导致(比如:储存空间已满,只读。。)
        //这些都会导致,我们写入失败,所以我们在手动处理异常,添加一个catch
        //再想想,无法写入,我们无论怎么写,都写不进去,那我们还写干嘛,就算了,直接让停止程序,提示个就gg了

        oStream.write("hello".getBytes());
    } catch (FileNotFoundException e) {
        //文件找不到异常,找不到也就是我们创建流失败了
        //我们也就结束程序提示下,路径不存在,就不用再继续下去了
        //写入流都没创建成功,继续干毛
        //直接抛出运行时运行异常,结束程序
        throw new RuntimeException("文件找不到");
    } catch (IOException e) {
        //写不进去,就不写了,让程序结束
      //即就直接抛出运行时异常,结束程序就OK
        throw new RuntimeException("写入失败");
    }//这里必定执行,因为我们建立了一个写入流,所以我们就要关闭
     finally {
        //关闭流

         try {
             //在这里,我们要进行非空判断
             //因为,如果创建流失败,流的对象-oStream就为空,会报错
             //为空,上面也说了,就是流创建失败,创建失败,就为空,就不需要关闭
             //关闭流失败,这里我们关闭失败,还关闭它干嘛,直接停止程序,报运行时异常
             if (oStream != null) {
                 oStream.close();
            }

        } catch (IOException e) {
            throw new RuntimeException("关闭失败");
        }
    }
 }
}
4.字节输入流(读取文件)
1).InputStream ---所有输入流的父类
注:字节流写入的是一个字节一个字节写入得,读取也一样
2)读取流程
a.绑定数据源--我们要读取的那个文件
b.使用read方法读取
c.关闭资源
3)例题1//注:当读取到文件末尾的时候,会返回-1,相当于,你读到-1,就读完了
public static void fun1() throws IOException {
    File file = new File("/Users/lanou/Desktop/Test 2/znb.txt");
    FileInputStream iStream = new FileInputStream(file);
    int i1 = iStream.read();
    System.out.println((char)i1);
    i1 = iStream.read();
    System.out.println((char)i1);
    i1 = iStream.read();
    System.out.println((char)i1);
    i1 = iStream.read();
    System.out.println((char)i1);
    i1 = iStream.read();
    System.out.println((char)i1);

    i1 = iStream.read();
    System.out.println(i1);
    i1 = iStream.read();
    System.out.println(i1);
    iStream.close();
}
}
例题2:循环读取
public static void fun2() throws FileNotFoundException, IOException {

        File file = new File("/Users/lanou/Desktop/Test 2/znb.txt");
     FileInputStream iStream = new FileInputStream(file);
     //read 方法 每调用一次 就读取一个字节
     //循环的时候 read 方法只能出现一次
     //声明一个变量保存,读出来结果
     int i1 = 0;
     while(i1 != -1) {
         i1 = iStream.read();
         System.out.println(i1);

     }
}
例题3:使用字节数组读取文件
public static void fun3() throws FileNotFoundException, IOException {
     File file = new File("/Users/lanou/Desktop/Test 2/znb.txt");
     FileInputStream iStream = new FileInputStream(file);
     //声明了长度为2的空的字节数组
     //读取时,会把读出来的内容,放进字节数组中进行存储
     byte[]b = new byte[2];
     int i1 = iStream.read(b); 
     System.out.println(i1);//2
      //利用字符串的构造方法直接打印字符串
     System.out.println(new String(b));//ab

     i1 = iStream.read(b); 
     System.out.println(i1);//2
      //利用字符串的构造方法直接打印字符串
     System.out.println(new String(b));//cd

     i1 = iStream.read(b); 
     System.out.println(i1);//1
      //利用字符串的构造方法直接打印字符串
     System.out.println(new String(b));//ed

     i1 = iStream.read(b); 
     System.out.println(i1);//-1
      //利用字符串的构造方法直接打印字符串
     System.out.println(new String(b));//ed

     iStream.close();
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值