javaIO流总结

File类的使用

  1. java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关

  2. 想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。

  3. File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。

  4. 常用构造器:

    • public File(String pathname) 以pathname为路径创建File对象,可以是绝对路径或者相对路径,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。

    • File file=new File("hello.txt"); //相对于module
      File file2=new File("F:hello.txt");//相对于根目录
      
      • 绝对路径:是一个固定的路径,从盘符开始
      • 相对路径:是相对于某个位置开始
    • public File(String parent,String child) 以parent为父路径,child为子路径创建File对象。

    • public File(File parent,String child) 根据一个父File对象和子文件路径创建File对象

  5. 常用方法:

    • File类的获取功能:
      • public String getAbsolutePath():获取绝对路径
      • public String getPath() :获取路径
      • public String getName() :获取名称
      • public String getParent():获取上层文件目录路径。若无,返回null
      • public long length() :获取文件长度(即:字节数)。不能获取目录的长度。
      • public long lastModified() :获取最后一次的修改时间,毫秒值
      • public String[] list() :获取指定目录下的所有文件或者文件目录的名称数组
      • public File[] listFiles() :获取指定目录下的所有文件或者文件目录的File数组
    • File类重命名功能:
      • public boolean renameTo(File dest):把文件重命名为指定的文件路径
    • File类的判断功能:
      • public boolean isDirectory():判断是否是文件目录
      • public boolean isFile() :判断是否是文件
      • public boolean exists() :判断是否存在
      • public boolean canRead() :判断是否可读
      • public boolean canWrite() :判断是否可写
      • public boolean isHidden() :判断是否隐藏
    • File的创建功能
      • public boolean createNewFile() :创建文件。若文件存在,则不创建,返回false
      • public boolean mkdir() :创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
      • public boolean mkdirs() :创建文件目录。如果上层文件目录不存在,一并创建
    • File类的删除功能
      • public boolean delete():删除文件或者文件夹
  6. File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO流来完成

  7. 后续File类的对象长会作为参数传递到流的构造器中,指明读取或写入的“终点”。

IO流原理及流的分类

  1. IO流原理:

    • I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等。
    • Java程序中,对于数据的输入/输出操作以**“流****(stream)****”** 的方式进行。
    • java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据
  2. 流的分类

    • 按操作数据单位不同分为:字节流 (8 bit),字符流(16 bit)

    • 按数据流的流向**不同分为:**输入流,输出流

    • 按流的角色的不同分为: 节点流,处理流

    • (抽象基本类)字节流字符流
      输入流InputStreamReader
      输出流OutputStreamWriter
  3. 字符流:

    • 读hello.txt文件下的内容

      1. 实例化File类的对象,指向要读取的文件

      2. 提供具体的流

      3. 数据的读入

      4. 关闭流

      5. public static void main(String[] args) {
            //1. 实例化File的对象,指向需要读的文件的位置
            File file=new File("IO\\hello.txt");
            System.out.println(file.getAbsolutePath());
            //2.实例化具体的流
            try {
                FileReader read=new FileReader(file);
                //3.数据的读入
                int data = read.read(); //read();返回一个读入的字符如果到达文件末尾返回-1;
                while(data!=-1){
                    System.out.print((char)data);
                    data=read.read();
                }
                read.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
    • 从内存中写出数据到硬盘的文件里

      1. 实例化File类的对象,指向要读取的文件

      2. 提供具体的流

      3. 数据的写入

      4. 关闭流

      5. public static void main(String[] args) {
            FileWriter fileWriter=null;
            //1.实例化File类,指明文件位置
            File file=new File("IO\\hello1.txt");
            //2.提供FileWrite的对象,用于数据的写入
            try {
                fileWriter=new FileWriter(file);
                fileWriter.write("I have a dream\n");
                fileWriter.write("I also have a dream");
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                if(fileWriter!=null){
                    try {
                        fileWriter.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        
      6. 输出操作,对应的File可以不存在的。

        • 如果不存在,在输出的过程中,会自动创建此文件

        • fileWriter=new FileWriter(file,false);//覆盖
          fileWriter=new FileWriter(file,true);//追加
          

字节流

  • 对于文本文件(.txt,.java,.c,.cpp),使用字符流处理

  • 对于非文本文件使用字节流处理

  • 使用字节流处理文本文件可能出现乱码

  • 读取文件

    • //1.建立一个流对象,将已存在的一个文件加载进流。
       FileReader fr = new FileReader(new File(Test.txt”));
      //2.创建一个临时存放数据的数组。
      char[] ch = new char[1024];
      //3.调用流对象的读取方法将流中的数据读入到数组中。
      fr.read(ch);
      //4. 关闭资源。
      fr.close();
      
  • 写入文件:

    • //1.创建流对象,建立数据存放文件
      FileWriter fw = new FileWriter(new File(Test.txt”));
      //2.调用流对象的写入方法,将数据写入流
      fw.write(“atguigu-songhongkang”);
      //3.关闭流资源,并将流中的数据清空到文件中。
      fw.close();
      

缓冲流

  1. 缓冲流
    • BufferedInputStream
    • BufferedOutputStream
    • BufferedReader
    • BufferedWriter
  2. 作用:提供流的读取、写入的速度 提高读写速度的原因,内部包含一个缓冲区
  3. 当使用BufferedInputStream读取字节文件时,BufferedInputStream会一次性从文件中读取8192个(8Kb),存在缓冲区中,直到缓冲区装满了,才重新从文件中读取下一个8192个字节数组。
  4. 向流中写入字节时,不会直接写到文件,先写到缓冲区中直到缓冲区写满BufferedOutputStream才会把缓冲区中的数据一次性写到文件里。使用方法flush()可以强制将缓冲区的内容全部写入输出流
  5. 如果是带缓冲区的流对象的close()方法,不但会关闭流,还会在关闭流之前刷新缓冲区,关闭后不能再写出

转换流

  1. 转换流:

    • InputStreamReader:将一个字节输入流转换为字符的输入流
    • OutputStreamWriter:一个字符的输出流转换为字节的输出流
  2. public static void main(String[] args) {
        FileInputStream file=null;
        InputStreamReader trans=null;
    
        try {
            file=new FileInputStream("IO\\hello.txt");
            trans=new InputStreamReader(file,"UTF-8");
    
            char[] chars=new char[5];
            int len;
            while((len=trans.read(chars))!=-1){
                String str=new String(chars,0,len);
                System.out.print(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            if(trans!=null){
                try {
                    trans.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(file!=null){
                try {
                    file.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

标准输入输出流

  1. System.in和System.out分别代表了系统标准的输入和输出设备
  2. 默认输入设备是:键盘,输出设备是:显示器
  3. System.in的类型是InputStream
  4. System.out的类型是PrintStream,其是OutputStream的子类
  5. FilterOutputStream 的子类
    • 重定向:通过System类的setIn,setOut方法对默认设备进行改变。
      • public static void setIn(InputStream in)
      • public static void setOut(PrintStream out)

打印流

  1. 实现将基本数据类型的数据格式转化为字符串输出
  2. 打印流:PrintStreamPrintWriter
    • 提供了一系列重载的print()和println()方法,用于多种数据类型的输出
    • PrintStream和PrintWriter的输出不会抛出IOException异常
    • PrintStream和PrintWriter有自动flush功能
    • PrintStream 打印的所有字符都使用平台的默认字符编码转换为字节。
    • 在需要写入字符而不是写入字节的情况下,应该使用 PrintWriter 类。
    • System.out返回的是PrintStream的实例

数据流

  1. 为了方便地操作Java语言的基本数据类型和String的数据,可以使用数据流。
  2. 数据流有两个类:(用于读取和写出基本数据类型、String类的数据
    • DataInputStreamDataOutputStream
    • 分别“套接”在* InputStream OutputStream 子类的流上
  3. DataInputStream****中的方法
    • boolean readBoolean()
    • byte readByte()
    • char readChar()
    • float readFloat()
    • double readDouble()
    • short readShort()
    • long readLong()
    • int readInt()
    • String readUTF() void readFully(byte[] b)
  4. DataOutputStream****中的方法
    • 将上述的方法的read改为相应的write即可。
  5. 注意点:读取不同类型的数据的顺序要与当初写入文件时,保存的数据的顺序一致

对象流

  1. 对象流:ObjectInputStream和ObjectOutputStream
  2. 作用:用于存储和读取基本数据类型数据或对象的处理流。它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。
  3. 序列化:
    • 序列化:用ObjectOutputStream类保存基本类型数据或对象的机制
    • 反序列化:用ObjectInputStream类读取基本类型数据或对象的机制
    • ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量
  4. 序列化的要求
    • 需要实现接口:Serializable
    • 当前类提供一个全局常量:serialVersionUID
    • 除了当前类需要实现Serializable接口之外,还必须保证其内部所有属性也必须是可序列化的。(默认情况下,基本数据类型可序列化)

随机存取文件流

  1. RandomAccessFile
    • 构造器
      • public RandomAccessFile(File file, String mode)
      • public RandomAccessFile(String name, String mode)
    • 创建 RandomAccessFile 类实例需要指定一个 mode 参数,该参数指定 RandomAccessFile 的访问模式:
      • r: 以只读方式打开
      • rw:打开以便读取和写入
      • rwd:打开以便读取和写入;同步文件内容的更新
      • rws:打开以便读取和写入;同步文件内容和元数据的更新
    • 如果模式为只读r。则不会创建文件,而是会去读取一个已经存在的文件,如果读取的文件不存在则会出现异常。 如果模式为rw读写。如果文件不存在则会去创建文件,如果存在则不会创建。
  2. RandomAccessFile直接继承于java.lang.Object类,实现了DataInput和DataOutput接口
  3. RandomAccessFile既可以作为一个输入流,又可以作为一个输出流
  4. 如果RandomAccessFile作为输出流时,谢楚道的文件如果不存在,则在执行过程中自动创建,如果写出到文件存在,则会对原有文件进行覆盖。默认情况下,从头覆盖
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BayMin0520

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值