当前位置: 首页 > news >正文

Java知识复习(三)Java IO

1、IO流

IO流:数据传输过程类似于水流,故称IO流
IO流的的40多个类都是从4个抽象类基类中派生出来的,前者是字节,后者是字符

  1. InputStream/Reader:所有的输入流的基类
  2. OutputStream/Writer:所有输出流的基类

2、字符流和字节流的区别

  1. 字符流是由Java虚拟机将字节转换得到的,这个过程比较耗时
  2. 如果我们不知道编码类型就很容易出现问题
  3. 根据实际应用中操作对象的不同选用合适的方法
  4. Reader 用于读取文本, InputStream 用于读取原始字节
  5. 字符和字节的编码转换:utf8 :英文占 1 字节,中文占 3 字节,unicode:任何字符都占 2 个字节,gbk:英文占 1 字节,中文占 2 字节

3、字节流

1、InputStream(字节输入流)

1、InputStream: 用于从源头(通常是文件)读取数据(字节信息)到内存中

2、常用方法

  1. read():返回输入流中下一个字节的数据
  2. skip():忽略输入流的n个字节
  3. available():返回输入流中可以读取的字节数
  4. close():关闭输入流,释放相关的系统资源
  5. readAllBytes():读取输入流中的所有字节,返回字节数组
  6. transferTo(OutputStream out):将所有字节从一个输入流传递到一个输出流

3、常用子类

  1. FileInputStream:和文件相关的字节输入流类
//新建一个字节文件输入流对象
InputStream fis = new FileInputStream("input.txt")
  1. BufferedInputStream:字节缓存输入流
// 新建一个 BufferedInputStream 对象
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("input.txt"));
// 读取文件的内容并复制到 String 对象中
String result = new String(bufferedInputStream.readAllBytes());
System.out.println(result);
  1. DataInputStream:用于读取指定类型数据,不能单独使用,必须结合 FileInputStream
FileInputStream fileInputStream = new FileInputStream("input.txt");
//必须将fileInputStream作为构造参数才能使用
DataInputStream dataInputStream = new DataInputStream(fileInputStream);
//可以读取任意具体的类型数据
dataInputStream.readBoolean();
dataInputStream.readInt();
dataInputStream.readUTF();
  1. ObjectInputStream:用于从输入流中读取Java对象(反序列化)
ObjectInputStream input = new ObjectInputStream(new FileInputStream("object.data"));
MyClass object = (MyClass) input.readObject();
input.close();

2、OutputStream(字节输出流)

1、OutputStream: 用于将数据(字节信息)写入到目的地(通常是文件)

2、常用方法

  1. write(int b) :将特定字节写入输出流。
  2. flush() :刷新此输出流并强制写出所有缓冲的输出字节。
  3. close() :关闭输出流释放相关的系统资源。

3、常用子类

  1. FileOutputStream:最常用的字节输出流对象,可直接指定文件路径,可以直接输出单字节数据,也可以输出指定的字节数组
  2. BufferedOutputStream:字节缓冲输出流
FileOutputStream fileOutputStream = new FileOutputStream("output.txt");
BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream)
  1. DataOutputStream :用于写入指定类型数据,不能单独使用,必须结合 FileOutputStream
  2. ObjectOutputStream:将对象写入到输出流(序列化)

4、字符流

字符流默认采用的是 Unicode 编码,我们可以通过构造方法自定义编码

1、Reader(字符输入流)

**1、Reader:**用于从源头(通常是文件)读取数据(字符信息)到内存中

2、常用方法:

  1. read() : 从输入流读取一个字符
  2. skip(long n) :忽略输入流中的 n 个字符 ,返回实际忽略的字符数。
  3. close() : 关闭输入流并释放相关的系统资源

3、常用子类

  1. FileReader:InputStreamReader 是字节流转换为字符流的桥梁,其子类 FileReader 是基于该基础上的封装,可以直接操作字符文件
FileReader fileReader = new FileReader("input.txt");

2、Writer(字符输出流)

**1、Writer:**用于将数据(字符信息)写入到目的地(通常是文件)

2、常用方法:

  1. write(int c) : 写入单个字符
  2. write(String str) :写入字符串
  3. append(char c) :将指定的字符附加到指定的 Writer 对象并返回该 Writer 对象
  4. flush() :刷新此输出流并强制写出所有缓冲的输出字符。
  5. close():关闭输出流释放相关的系统资源

3、常用子类

  1. FileWriter:OutputStreamWriter 是字符流转换为字节流的桥梁,其子类 FileWriter 是基于该基础上的封装,可以直接将字符写入到文件
try (Writer output = new FileWriter("output.txt")) {output.write("你好,我是Guide。");
} catch (IOException e) {e.printStackTrace();
}

5、字节缓冲流

1、字节缓冲流: IO 操作是很消耗性能的,缓冲流将数据加载至缓冲区,一次性读取/写入多个字节,从而避免频繁的 IO 操作,提高流的传输效率

**2、和字节流的性能差别:**字节流和字节缓冲流的性能差别主要体现在我们使用两者的时候都是调用 write(int b) 和 read() 这两个一次只读取一个字节的方法的时候。由于字节缓冲流内部有缓冲区(字节数组),因此,字节缓冲流会先将读取到的字节存放在缓存区,大幅减少 IO 次数,提高读取效率

3、常用类: BufferedInputStream(字节缓冲输入流)和BurreredOutputStream(字节缓冲输出流)

6、字符缓冲流

BufferedReader (字符缓冲输入流)和 BufferedWriter(字符缓冲输出流): 类似于 BufferedInputStream(字节缓冲输入流)和BufferedOutputStream(字节缓冲输入流),内部都维护了一个字节数组作为缓冲区

7、打印流

  1. System.out 实际是用于获取一个 PrintStream 对象,print方法实际调用的是 PrintStream 对象的
    write 方法。
System.out.println("Hello!");
  1. PrintStream 属于字节打印流,与之对应的是 PrintWriter (字符打印流)。

参考

  1. https://javaguide.cn/java/io/io-basis.html
http://www.lryc.cn/news/19865.html

相关文章:

  • Java版分布式微服务云开发架构 Spring Cloud+Spring Boot+Mybatis 电子招标采购系统功能清单
  • 2023年全国最新会计专业技术资格精选真题及答案5
  • 软工个人作业 -- 分析与提问
  • C++类和对象到底是什么意思?
  • 【电路设计】常见电路及相关解释
  • 【一天一门编程语言】Linux 实用命令大全
  • 【汇编】二、预备知识(一只 Assember 的成长史)
  • Java多线程面试题:描述一下线程安全活跃态问题,竞态条件?
  • ZZNUOJ_用C语言编写程序实现1193:单科成绩排序(结构体专题)(附完整源码)
  • expect 使用方法
  • Spring AOP详解-Spring官方原版
  • 链表习题精选(持续更新中)
  • 【log】操作类日志处理 与 报错类日志处理logback
  • 百度网盘好友发来的文件手动输入JS选择代码批量保存
  • 【CS224W】(task6)Google的PageRank算法
  • Python安装拓展库及常用的pip命令及其用法
  • 这9道软件测试面试题,就能刷掉90%的软件测试员
  • 【大数据】大数据Hadoop生态圈
  • python读取tif图像+经纬度
  • Kali安装配置vulhub
  • 【进击的算法】动态规划——不同维度的背包问题
  • udiMagic 导入 Excel to Tally ERP Crack
  • Redis实现分页和多条件模糊查询方案
  • 【H5 | CSS | JS】如何实现网页打字机效果?快收下这份超详细指南(附源码)
  • Airbyte,数据集成的未来
  • 00.内容安排
  • FreeRTOS任务基础知识
  • JDBC-API详解、SQL注入演示、连接池
  • C 学习笔记 —— 动态分配内存(malloc)
  • RK3588通用布线设计指南