IO

IO

File

  • 概念:

    • 代表物理盘符中的一个文件或者文件夹。
  • 方法:

    • createNewFile()//创建一个新文件
    • mkdir()//创建一个新目录
    • delete()//删除文件或空目录
    • exists()//判断File对象所对象所代表的对象是否存在
    • getAbsolutePath()//获取文件的绝对路径
    • getName()//取得名字
    • getParent()//获取文件/目录所在的目录
    • isDirectory()//是否是目录
    • isFile()//是否是文件
    • length()//获得文件的长度
    • listFiles()//列出目录中的所有内容
    • renameTo()//修改文件名为
  • 方法

    • 文件

      • 创建: boolean b=file.createNewFile();

      • 直接删除: boolean b2=file.delete();

      • JVM直接删除file.deleteOnExit();

      • “文件长度:”+file.length());

      • “文件名称:”+file.getName());

      • “文件绝对路径:”+file.getAbsolutePath());

      • “规范路径:”+file.getCanonicalPath());

      • “文件路径:”+file.getPath());

      • “文件父目录:”+file.getParent());

      • “文件最后一次修改:”+new Date(file.lastModified()).toLocaleString());

      • “是否存在:”+file.exists());

      • “是否只读:”+file.canWrite());

      • “是否隐藏:”+file.isHidden());

      • “是不是文件:”+file.isFile());

      • “是不是绝对路径:”+file.isAbsolute());

      • 修改名称: (具有剪切的功能)

        • file.renameTo(new File(“zhangsan.txt”));
    • 文件夹

      • dir.mkdir();//创建单级目录

      • boolean b=dir.mkdirs();//创建多级目录

      • boolean b2=dir.delete();直接删除:只删除最里层空目录

      • dir.deleteOnExit();JVM删除

      • “获取路径:”+dir.getPath());

      • “获取绝对路径:”+dir.getAbsolutePath());

      • “获取名称:”+dir.getName());

      • “规范名称:”+dir.getCanonicalPath());

      • “是否存在:”+dir.exists());

      • “是否隐藏:”+dir.isHidden());

      • “是不是文件夹:”+dir.isDirectory());

      • boolean b3=dir.renameTo(new File(“d:\aaa\bbb\hello”));重命名

      • 获取目录的子目录和文件

      • File[] roots = File.listRoots();获取根目录

  • FileFilter接口

    • 当调用File类中的listFiles()方法时,支持传入FileFilter接口接口实现类,对获取文件进行过滤,只有满足条件的文件的才可出现在listFiles()的返回值中。
    • public interface FileFilter
    • boolean accept(File pathname)

  • 概念:

    • 内存与存储设备之间传输数据的通道。
  • 分类

    • 按方向

      • 输入流:将<存储设备>中的内容读入到<内存>中。
      • 输出流:将<内存>中的内容写入到<存储设备>中。
    • 按单位

      • 字节流:以字节为单位,可以读写所有数据 。
      • 字符流:以字符为单位,只能读写文本数据 。
    • 按功能:

      • 节点流:具有实际传输数据的读写功能。
      • 过滤流:在节点流的基础之上增强功能。
  • 字节流

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

      • InputStream:字节输入流

        • 方法:

          • public int read(){}
          • public int read(byte[] b){}
          • public int read(byte[] b,int off,int len){}
        • 子类: 字节节点流FileInputStream

          • public int read(byte[] b) //从流中读取多个字节,将读到内容存入b数组,返回实际读到的字节数;如果达到文件的尾部,则返回-1。
          • System.in
        • 字节过滤流: FilterInputStream

          • 字节缓冲流: BufferedInputStream

            • 提高IO效率,减少访问磁盘的次数;
            • 数据存储在缓冲区中,flush是将缓存区的内容写入文件中,也可以直接close。
        • 字节对象流: ObjectInputStream

          • 增强了缓冲区功能

          • 增强了读写8种基本数据类型和字符串功能

          • 增强了读写对象的功能:

            • eadObject() 从流中读取一个对象
      • OutputStream:字节输出流

        • 方法:

          • public void write(int n){}
          • public void write(byte[] b){}
          • public void write(byte[] b,int off,int len){}
        • 子类: 字节节点流FileOutputStream

          • public void write(byte[] b) //一次写多个字节,将b数组中所有字节,写入输出流。
        • 字节过滤流: FilterOutputStream

          • 字节缓冲流: BufferedOutputStream

            • 提高IO效率,减少访问磁盘的次数;
            • 数据存储在缓冲区中,flush是将缓存区的内容写入文件中,也可以直接close。
          • 字节打印流: PrintStream

            • System.out

              • PrintStream类型

              • 默认打印到控制台

              • 重定向标准输出流

                • System.setOut(new PrintStream(“d:\console.txt”));
            • 原样打印

        • 字节对象流: ObjectOutputStream

          • 增强了缓冲区功能

          • 增强了读写8种基本数据类型和字符串功能

          • 增强了读写对象的功能:

            • writeObject(Object obj) 向流中写入一个对象
    • 使用流传输对象的过程称为序列化、反序列化。

      • 序列化:把对象写入到硬盘或网络中的过程

      • 反序列化:把硬盘或网络的二进制文件读取到内存形成对象的过程。

      • 对象序列化的细节:

        • 序列化的类必须实现Serializable(自动序列化, 标记接口)、Externalizable(手动序列化接口)

        • transient修饰为临时属性,不参与序列化。

        • 读取到文件尾部的标志:java.io.EOFException。

        • 使用serialVersionUID属性保证序列化的类和反序列化的类是同一个类。

        • (非必须,系统会自动生成)序列化的类要添加一个私有的Long类型静态常量:serverVersionUID, 保证序列化的类反序列化的类是同一个类

        • 静态属性不可以被序列化

      • 面试题: 使用transient的属性一定不能序列化吗?

        • 能 使用手动序列化接口Externalizable
  • 字符流

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

      • Reader:字符输入流

        • 方法

          • public int read(){}
          • public int read(char[] c){}
          • public int read(char[] b,int off,int len){}
        • 字符转换流: InputStreamReader

          • 文件字符流: FileReader

            • public int read(char[] c) //从流中读取多个字符,将读到内容存入c数组,返回实际读到的字符数;如果达到文件的尾部,则返回-1。
          • 可将字节流转换为字符流。

          • 可设置字符的编码方式。

        • 字符缓冲流:

          • BufferedReader

            • 支持输入换行符。
            • 可一次写一行
      • Writer:字符输出流

        • 方法

          • public void write(int n){}
          • public void write(String str){}
          • public void write(char[] c){}
        • 字符转换流: OutputStreamWriter

          • 文件字符流: FileWriter

            • public void write(String str) //一次写多个字符,将b数组中所有字符,写入输出流。
          • 可将字节流转换为字符流。

          • 可设置字符的编码方式。

        • 字符缓冲流:

          • BufferedWriter

            • 支持输入换行符。
            • 可一次读一行
        • 字符打印流: PrintWriter

          • 封装了print() 和 println()方法,
          • 支持写入后换行
          • 支持数据原样打印
      • 注意事项: 中文汉字 用字符 两个字节 因为在系统中存放的是Uncode编码两个字节 用字节打印出来是三个字节

  • System.in 控制台输入流

    • int data=System.in.read();

    • //System.in转成字符流

      • InputStreamReader isr=new InputStreamReader(System.in);
      • int data=isr.read();
    • 缓冲流

      • BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
      • String data=br.readLine();
      • System.out.println(data);
  • System.out 控制台输出流

  • 随机访问文件夹类: RandomAccessFile

    • RandomAccessFile即可以读取文件内容,也可以向文件中写入内容。

    • 但是和其他输入/输入流不同的是,程序可以直接跳到文件的任意位置来读写数据。

    • 读写模式

      • r:只读
      • rw:读写
    • 作用

      • 快速定位数据,支持并发读写
      • 方便的获取二进制文件
    • 方法

      • randomAccessFile.seek(21)

        • seek()从文件开头位置设置文件指针的偏移量
      • randomAccessFile.skipBytes(21);

        • 跳过指定字节个数
    • 代码演示

  • Properties集合

    • 属性集合。

    • 特点:

      • 存储属性名和属性值。
      • 属性名和属性值都是字符串类型。
      • 没有泛型。
      • 和流有关。
    • 代码演示

  • 继承关系图

IO