• IO流与File类


    IO流

    概念:内存与存储设备之间传输数据的通道。

    流的分类

    • 按方向分:
      • 输入流:将【存储设备】中的内容读入到【内存】中。
      • 输出流:将【内存】中的内容写入到【存储设备】中。
    • 按单位分:
      • 字节流:以字节为单位,可以读写所有数据。
      • 字符流:以字符为单位,只能读写文本数据。
    • 按功能分:
      • 节点流:具有实际传输数据的读写功能。
      • 过滤流:在节点流的基础之上增强功能。

    字节流

    字节流的父类(抽象类):

    • InputStream(抽象类):字节输入流
    • OutputStream(抽象类):字节输出流

    字节流的实现类:FileInputStream的使用

     public static void main(String[] args) throws IOException {
            //1.创建FileInputStream对象,并指定文件路径
            FileInputStream inputStream = new FileInputStream("d:\aaa.txt");
            //2读取文件
            //第一种方法读取文件
            int data=0;
            while ((data=inputStream.read())!=-1){
                System.out.println(data);
            }
            //第二种方法读取文件
           byte[] bytes=new byte[100];
           int count=0;
           while((count=inputStream.read(bytes))!=-1){
               System.out.println(new String(bytes,0,count));
           }
            //3.关闭
            inputStream.close();
            System.out.println("执行完毕");
        }
    

    FileOutputStream的使用

     public static void main(String[] args) throws IOException{
            //1创建文件字节输出流
            //如果为false,则直接覆盖该文件上的内容,如果为true,则在文件内容的后面追加添加的字节。
            FileOutputStream outputStream = new FileOutputStream("d:\bbb.txt",true);
            //2写入文件
            //单个字节的写入
            outputStream.write(97);
            outputStream.write('b');
            outputStream.write('e');
            outputStream.write('q');
           //多个字节的写入
            String s="hello io";
            outputStream.write(s.getBytes());
            //关闭
            outputStream.close();
            System.out.println("执行完毕");
        }
    

    字节流文件的复制:(可以复制图片,以及二进制文件)

    public static void main(String[] args) throws Exception {
            FileInputStream fi = new FileInputStream("d:\aaa.txt");
            FileOutputStream fo=new FileOutputStream("d:\ccc.txt");
            byte[] bytes=new byte[1024];
            int count=0;
            while ((count=fi.read(bytes))!=-1){
                fo.write(bytes,0,count);
            }
            fi.close();
            fo.close();
        }
    

    字节缓冲流

    • BufferedInputStream/BufferedOutputStream
      • 提高IO效率,减少访问磁盘的次数。
      • 数据存储在缓冲区中,flush是将缓冲区的内容写入文件中,也可以直接close。
    BufferedInputStream和BufferedOutputStream的使用
     public static void main(String[] args) throws Exception {
            FileInputStream fi = new FileInputStream("d:\aaa.txt");
            //创建字节缓冲流,bi作为缓冲区
            BufferedInputStream bi = new BufferedInputStream(fi);
            int data=0;
            while((data=bi.read())!=-1){
                System.out.print((char)data);
            }
            bi.close();
        }
    ------------------------------------------------------------------
    public static void main(String[] args) throws Exception {
            FileOutputStream fo = new FileOutputStream("d:\ccc.txt");
            BufferedOutputStream bo = new BufferedOutputStream(fo);
            for (int i=0;i<10;i++){
                bo.write("hello
    ".getBytes());
                bo.flush();   //将缓冲区内容刷新到磁盘中
            }
            bo.close();    //直接调用close时,同样将内容刷新到磁盘中了
        }
    

    对象流:ObjectOutputStream/ObjectInputStream

    • 增强了缓冲区功能。
    • 增强了读写8种基本数据类型和字符串功能。
    • 增强了读写对象的功能:
      • readObject() :从流中读取一个对象(反序列化)
      • writeObject() :向流中写入一个对象(序列化)
     public static void main(String[] args) throws Exception {
            //1创建对象流
            FileOutputStream fo = new FileOutputStream("d:\ddd.txt");
            ObjectOutputStream oo = new ObjectOutputStream(fo);
            //写入对象(序列化)
            Student student = new Student("张三",18);
            oo.writeObject(student);
            //3.关闭
            oo.close();
            System.out.println("序列化完成");
        }
    
     public static void main(String[] args) throws Exception {
            //1创建对象流
            FileInputStream fi = new FileInputStream("d:\ddd.txt");
            ObjectInputStream oi = new ObjectInputStream(fi);
            //2读取文件(反序列化)
            Student student=(Student)oi.readObject();
            //3关闭
            oi.close();
            System.out.println("反序列化");
            System.out.println(student);
        }
    

    注意点:

    • 序列化的类必须实现Serializable接口。
    • 序列化类中对象属性要求实现Serializable接口。
    • 序列化版本号ID serialVersionUID,保证序列化的类和反序列化的类是同一个类。
    • 使用transient修饰类属性,则这个属性不能被序列化了。
    • 静态属性不能被序列化。
    • 序列化多个对象,可以借助集合实现。

    字符流的父类(抽象类):

    • Reader:字符输入流(抽象类)
    • Writer:字符输出流(抽象类)

    文件字符流

    • FileReader
    • FileWriter

    文件字符流的复制(只能复制文本文件,不能复制图片,以及二进制文件)

    图片是二进制文件,没有字符编码。不能使用字符流复制。

     public static void main(String[] args) throws Exception {
            //1创建字符流的输入、输出
            FileReader fr = new FileReader("d:\write.txt");
            FileWriter fw = new FileWriter("d:\write2.txt");
            //2复制
            int data=0;
            while((data=fr.read())!=-1){
                fw.write(data);
                fw.flush();
            }
            //3关闭
            fr.close();
            fw.close();
        }
    

    字符缓冲流BufferedReaderBufferedWriter

    • 高效读写
    • 支持输入换行符
    • 可一次写一行,读一行

    打印流PrintWriter

    • 封装了print()/println()方法,支持写入后换行。
    • 支持数据的原样打印。

    转换流 InputStreamReaderOutputStreamWriter

    • 可将字节流转换为字符流
    • 可设置字符的编码方式
    public static void main(String[] args) throws Exception {
            FileInputStream fi = new FileInputStream("d:\write.txt");
            InputStreamReader is = new InputStreamReader(fi, "utf-8");  //可设置编码方式
            int data=0;
            while((data=is.read())!=-1){
                System.out.print((char)data);
            }
            is.close();
        }
     public static void main(String[] args) throws Exception {
            FileOutputStream fo = new FileOutputStream("d:\write2.txt");
            OutputStreamWriter ow = new OutputStreamWriter(fo, "utf-8");//可设置编码方式
            for (int i=0;i<10;i++){
                ow.write("好好学习,天天向上
    ");
                ow.flush();
            }
            ow.close();
        }
    

    File类

    概念:代表物理盘符中的一个文件或者文件夹。

    调用路径分隔符; File.pathSeparator

    调用名称分隔符 File.separator

     //文件操作
    public static void main(String[] args) throws IOException, InterruptedException {
           // separator();
            file();
        }
        public static void separator(){
            System.out.println("路径分隔符"+ File.pathSeparator);
            System.out.println("名称分隔符"+File.separator);
        }
        public static void file() throws IOException, InterruptedException {
            //创建文件
            File file = new File("d:\file.txt");
            //System.out.println(file.toString());
            //判断文件是否存在
            if (!file.exists()){
                boolean newFile = file.createNewFile();
                System.out.println("创建结果为"+newFile);
            }
          //1直接删除
          //  System.out.println("删除结果为"+file.delete());
            //2使用JVM退出的时候删除
         //   file.deleteOnExit();
         //   Thread.sleep(5000);
            //获取文件信息
            System.out.println("获取绝对路径"+file.getAbsolutePath());
            System.out.println("获取路径"+file.getPath());
            System.out.println("获取父目录"+file.getParent());
            System.out.println("获取文件长度"+file.length());
            System.out.println("获取文件生成时间"+new Date(file.lastModified()).toLocaleString());
            //判断
            System.out.println("是否可写"+file.canWrite());
            System.out.println("是否是文件"+file.isFile());
            System.out.println("是否隐藏"+file.isHidden());
        }
    
    //文件夹操作
    public static void dir(){
            //创建文件夹
            File dir = new File("d:\aaa\bbb");
            if (!dir.exists()){
               // dir.mkdir();  只能生成单级目录
                System.out.println("创建结果"+dir.mkdirs());
            }
            //删除文件夹
            //dir.delete();   (只能删除空目录)
            //dir.deleteOnExit();
            //获取文件信息
            System.out.println("获取绝对路径"+dir.getAbsolutePath());
            System.out.println("获取路径"+dir.getPath());
            System.out.println("获取父目录"+dir.getParent());
            System.out.println("获取文件夹长度"+dir.length());
            System.out.println("获取文件夹生成时间"+new Date(dir.lastModified()).toLocaleString());
            //判断
            System.out.println("是否是文件夹"+dir.isDirectory());
            System.out.println("是否隐藏"+dir.isHidden());
        //获取文件夹中的所有内容
            String[] list = dir.list();
            for (String s : list) {
                System.out.println(s);
            }
        }
    
    • FileFilter接口:当调用File类中的listFiles()方法时,支持传入FileFilter接口接口实现类,对获取文件进行过滤,只有满足条件的文件的才 可出现listFiles()的返回值中。

      //FileFilter接口的使用,过滤一些文件
              File[] files = dir.listFiles(new FileFilter() {
                  public boolean accept(File pathname) {
                      if (pathname.getName().endsWith(".jpg")){
                          return true;
                      }
                      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"));
          }
          //递归遍历文件夹
          public static void listDir(File dir){
              File[] files = dir.listFiles();
              System.out.println(dir.getAbsolutePath());
              if(files!=null&&files.length>0){
                  for (File file : files) {
                      if (file.isDirectory()){  //如果file是文件夹,则进行递归。
                          listDir(file);
                      }else{
                          System.out.println(file.getAbsolutePath());
                      }
                  }
              }
          }
      //递归删除文件夹及里面的文件
          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{
                          System.out.println(file.getAbsolutePath()+"删除"+file.delete());
                      }
                  }
              }
              System.out.println(dir.getAbsolutePath()+"删除"+dir.delete());
          }
      
  • 相关阅读:
    cpu时钟周期
    调参学习
    力扣:堆
    学习率衰减问题
    力扣:图之并查集问题
    Java判断空字符串
    python读取文件通过正则过滤需要信息然后保存到新文件里
    python换行写入文件
    Robotium solo.goBack();不起作用,解决方案
    Android清除本地数据缓存代码
  • 原文地址:https://www.cnblogs.com/xiaopanjava/p/13783411.html
Copyright © 2020-2023  润新知