JAVA :IO流

本文介绍了Java中的文件和File类,讲解了如何通过File类创建文件并进行读写操作。同时,深入探讨了IO流的概念,包括字节流和字符流的分类,以及常见的流类型如FileInputStream和FileOutputStream。文章还提到了缓冲流的作用,对象序列化流的使用,以及标准输入输出流和转换流在数据传输中的应用。
摘要由CSDN通过智能技术生成

一、文件和File

1.1 文件和文件流

  • 文件就是保存数据的地方。可以简单分为文本文件和非文本文件。

  • 在程序中,通过流的形式读取操作文件·

    输出流
    输入流
    java程序
    文件
  • IO流(Stream):数据在数据源(文件、网络、数据库、屏幕、键盘等)和程序(内存)之间经历的路径。

  • file类:public class Fileextends Object implements Serializable, Comparable<File>

    文件名目录的抽象表示。

1.2 常用的文件操作

1.2.1 创建文件对象

  • 构造器

    构造器描述
    File(File parent, String child)从父抽象路径名和子路径名字符串创建新的 File实例。
    File(String pathname)通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
    File(String parent, String child)从父路径名字符串和子路径名字符串创建新的 File实例。
    File(URI uri)通过将给定的 file: URI转换为抽象路径名来创建新的 File实例。
  • 创建文件

    public boolean createNewFile() throws IOException
    

    当且仅当具有此名称的文件尚不存在时,以原子方式创建由此抽象路径名命名的新空文件。 检查文件是否存在以及文件的创建(如果不存在)是针对可能影响文件的所有其他文件系统活动的原子操作。

    • 结果

      true:指定的文件不存在且已成功创建;

      false指定的文件已存在

    • 异常

      IOException - 如果发生I / O错误

      SecurityException - 如果存在安全管理器且其 SecurityManager.checkWrite(java.lang.String)方法拒绝对文件的写访问权限

    File file = new File("src/file.txt");
    if (file.createNewFile()) {
      System.out.println("文件创建成功!");
    } else {
      System.out.println("文件创建失败!");
    }
    

1.2.2 获取文件相关信息和操作文件

返回值方法名介绍
booleanisAbsolute()测试此抽象路径名是否为绝对路径。
booleanisDirectory()测试此抽象路径名表示的文件是否为目录。
booleanisFile()测试此抽象路径名表示的文件是否为普通文件。
booleanisHidden()测试此抽象路径名指定的文件是否为隐藏文件。
longlastModified()返回上次修改此抽象路径名表示的文件的时间。
longlength()返回此抽象路径名表示的文件的长度。

对于其他方法,可以查询相关的API文档。

二、IO

2.1 IO流的分类和体系

  • 按照操作数据单位不同:字节流(一个字节一个字节的传)和字符流(一个字符一个字符的传,一个字符多少个字节取决于编码)
  • 按照流向不同:输入流和输出流

根据以上两种分类方式,可以划分4个抽象基类,由此派生的子类名称都以父类名称作为后缀

抽象基类字节流字符流
输入流InputStreamReader
输出流OutputStreamWriter
  • 此外根据角色的不同还分为节点流和包装流/处理流(辅助节点流)

2.2 字节流

主要以以文件流为例介绍两个字节流基类中中封装的方法。

2.2.1 基类的解析

在这里插入图片描述

image-20220409210031612

在这里插入图片描述

image-20220409213756209

关于方法的详细信息参考[api](InputStream - Java 11中文版 - API参考文档 (apiref.com)

2.2.2 FileInputStream

  • 构造方法

    构造器描述
    FileInputStream(File file)通过打开与实际文件的连接来创建 FileInputStream ,该文件由文件系统中的 File对象 file命名。
    FileInputStream(FileDescriptor fdObj)使用文件描述符 fdObj创建 FileInputStream ,该文件描述符表示与文件系统中实际文件的现有连接。
    FileInputStream(String name)通过打开与实际文件的连接来创建 FileInputStream ,该文件由文件系统中的路径名 name命名。
  • 用例(忽略异常声明):

    File file = new File("src/file.txt");
    FileInputStream fileInputStream =  new FileInputStream(file);
    byte[] bytes = new byte[3];
    int len;
    while ((len = fileInputStream.read(bytes)) != -1) {
      System.out.println(new String(bytes, 0, len));
    }
    fileInputStream.close();
    

2.2.3 FileOutputStream

image-20220409214027172

File file = new File("src/file.txt");
FileOutputStream fileOutputStream = new FileOutputStream(file);
fileOutputStream.write("helloworld".getBytes(StandardCharsets.UTF_8));
fileOutputStream.close();

2.3 字符流

主要以以文件流为例介绍两个字符流基类中中封装的方法。

2.3.1 基类的解析

image-20220410151019976

image-20220410150955694

image-20220410151049536

image-20220410151113719

2.3.2 FileReader

image-20220410151251409

2.3.3 FileWriter

image-20220410151759850

2.4 缓冲流

  • 节点流和处理流

    1. 节点流是一种从特定的数据源读写数据的流,如文件流
    2. 处理流(也叫包装流)是辅助已经存在的流(节点流活处理流),让其功能更加强大的流,如缓冲流
    3. 处理流对节点流进行了包装,使用了修饰器模式(参考BufferedReader源码),不会直接与数据源相连
  • 缓冲流

    缓冲流把数据从原始流成块读入或把数据积累到一个大数据块后再成批写出,通过减少资源的读写次数来加快程序的执行。

  • 针对4个抽象基类,分别有4个缓冲流

    缓冲流字节流字符流
    输入流BufferedInputStreamBufferedReader
    输出流BufferedOutputStreamBufferedWriter
  • BufferedReader为例,

    File file = new File("src/file.txt");
    FileReader reader = new FileReader(file);
    BufferedReader bufferedReader = new BufferedReader(reader);
    String line=BufferedReader.readerLine();
    bufferedReader.close();
    

3.5 对象序列化流

  • 序列化 ;在保存数据时,要保存数据的值和**数据类型****

  • 反序列化:在恢复数据时,恢复数据的值和类型

  • 要想让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类可序列化,该类必须实现以下两个接口之一:

    Serializable//推荐选择,这是一个标记接口(里面没有方法)

    Externalizable

  • 序列化对象时,要求里面的属性的类型也要实现序列化

  • 用例

    import java.io.*;
    
    public class Main {
      public static void main(String[] args) throws IOException {
        File file = new File("src/file.txt");
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
        // 序列化写入 write+类型()
        oos.writeInt(100); // 基本数据类型会转化为包装类
        oos.writeChar('a');
        oos.writeUTF("abcdefg");
        oos.writeObject(new A(111, "aa"));
        oos.close();
    
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
        // 读取顺序要和写入顺序一致
        System.out.println(ois.readInt());
        System.out.println(ois.readChar());
        System.out.println(ois.readUTF());
        System.out.println(ois.readObject().getClass());//在使用对象时,要注意向下转型
        ois.close();
      }
    }
    
    class A implements Serializable {
      int id;
      String name;
    
      public A(int id, String name) {
        this.id = id;
        this.name = name;
      }
    }
    
    

3.6 标准输入输出流

  • System中定义了两个流对象,分别表示标准输入(键盘)和标准输出(屏幕)
    image-20220410164454147

3.7 转换流

java IO流中提供了两种用于将字节流转换为字符流的转换流。其中InputStreamReader用于将字节输入流转换为字符输入流,其中OutputStreamWriter用于将字节输出流转换为字符输出流。使用转换流可以在一定程度上避免乱码,还可以指定输入输出所使用的字符集。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

bestwangyulu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值