Lazy loaded image
编程
📙Day18-IO(字节流、缓冲流、转化流、对象流)
字数 3817阅读时长 10 分钟
2019-1-29
2025-8-13
type
status
date
slug
summary
tags
category
icon
password

InputOutput

输入输出流 硬盘和内存之间交换数据 输入流: 从硬盘或者网卡里的数据读入到内存里 输出流: 从内存里将数据写入到硬盘

File类的使用

File表示的是硬盘上的一个文件或者文件夹
构造方法:File(String path): 创建File对象,在指定path下找到硬盘的对应文件(夹)

路径分隔符

在windows操作系统里,使用的是 \,由于 \ 在字符串里表示转义字符,如果想要表示一个字符串,应该使用 \\。但是在非windows操作系统类,使用 / 作为路径分隔符,这个/ 也能被windows 识别 。
故推荐使用更加通用的 / 作为路径分隔符

路径分隔符

  • 绝对路径: 从电脑盘符开始的路径,称为绝对路径(不要使用)
    • C:\Users\70794\Desktop\0409\Day17-Map和IO流\note
  • 相对路径: 从所在项目的根目录开始查找
    • ../ 表示上一级文件夹
    • ./ 表示当前文件夹,可以省略,建议省略
    • "error.txt" 等价于 "./error.txt"
    • 不要使用 / 开头

File类的常用方法

  1. exists(): 判断文件(夹)是否存在
  1. isFile(): 判断是否是文件
  1. isDirectory(): 判断是否是文件夹
  1. getAbsolutePath():获取到文件的绝对路径字符串
  1. getAbsoluteFile():获取到文件绝对路径对应的File对象
  1. String[] list(): 获取到一个文件夹下所有的直接子文件(夹)名组成的字符串数组
  1. File[] listFiles(): 获取到一个文件夹下所有的直接子文件(夹)组成的File对象数组

list和listFiles方法的介绍

使用代码列出一个文件夹下的所有子文件

IO“流派”

字节流
FileInputStream
FileOutputStream
字符流
FileReader
FileWriter
缓冲流-字节缓冲流
BufferedInputStream
BufferedOutputStream
缓冲流-字符缓冲流
BufferedReader
BufferedWriter
转化流
InputStreamReader
OutputStreamWriter
对象流
ObjectInputStream
ObjectOutputStream
打印流
PrintStream
 

字节流

字节流用来操作二进制数据,又分为输入流和输出流 输入流 FileInputStream: 将硬盘里的数据加载到内存中 输出流 FileOutputStream: 将内存里的数据写入到硬盘中

FileInputStream字节流

字节输入流使用的是 FileInputStream 类 FileInputStream(String path): 传入一个路径,创建一个输入流 FileInputStream(File file): 传入一个File对象,创建一个输入流 这两个构造方法本质上是同一个构造方法。
如果路径对应的文件不存在,会抛出 FileNotFoundException文件未找到的异常
字节流的访问过程:
  1. 打开流
  1. 操作流(输入流执行读取操作,输出流执行写入操作)
  1. 关闭流

read 方法

字节输入流读取内容
read(): 读取纯文本文件,是将纯文本文件按照编码方式转换成为二进制,就是调用字符串的 getBytes(String charset) 转换成为二进制然后一次读取一个字节,再将读取到的字节转换成为对应的 int 值,如果读完了,返回 -1. 这种读取的方式几乎不使用,因为每次读取的字节太少,效率太低
read(byte[] bytes): 一次读取指定个数的字节数据,返回的结果是读取到的字节长度,如果读取完成,返回 -1 读取到的内容在 bytes数组里保存 注意:可以使用字节流读取纯文本文件,但是不要将读取到纯文本文件转换成为字符串,有可能会乱码,如果要查看纯文本文件里的内容,推荐使用字符流读取!

FileOutputStream字节流

输出流使用的是 FileOutputStream类 如果对应的文件不存在,会创建一个新的文件; 如果文件已经存在,会覆盖原来的文件 以下两种情况,会抛出FileNotFoundException异常的场景: 1. 如果文件的父文件夹不存在 ddd/2.txt,ddd文件夹不存在 2. 如果文件不存在会创建文档,当文件名不合法时,会抛出异常 3?+:/.txt
构造方法: FileOutputStream(String path): FileOutputStream(String path,boolean append): FileOutputStream(File file): FileOutputStream(File file,boolean append):
💡
append参数用来表示是否是追加模式 默认值是false,表示不追加,如果文件已经存在,会覆盖原来的文件 如果这个值设置为true,表示追加,如果文件已经存在,不再覆盖了,而是在最后追加
write(int b): 写入一个字节,不是Unicode编码,在写入时,会将 int类型的参数b转换成为byte 类型 write(byte []bytes): 写入一个byte类型的数组 write(byte[] bytes,int offset,int length): 使用最多

使用字节流拷贝文件

FileReader字符流

字符流只能读取纯文本文件,不能用来读取非文本文件 read():每次读取一个字符,得到的结果是 unicode码点,读完以后返回 -1 read(char[] chars):读取指定长度的数据写入到char数组里,返回读取到的长度

FileWriter字符流

字符流调用write方法写入数据时,并没有直接写入到硬盘,而是在内存里先缓存 需要调用 close() 或者 flush()方法将内存里的数据写入到硬盘

字节缓冲流

字节缓冲流: BufferedInputStream BufferedOutputStream 字节缓冲流是一种包装流,就是传入一个基本流,把它包装成为一个缓冲流BufferedInputStream 字节输入缓冲流,在它内部维护了一个默认为8K的缓冲区

字符缓冲流

转化流

转换流: InputStreamReader OutputStreamWriter 用来将字节流转换成为字符流

序列化与反序列化

Java对象 转换成为 字符串或者二进制 用来传输或存储 的过程,我们称之为序列化 Java对象变成字符串用来跨平台传输数据(JSON字符串,很重要) Java对象变成二进制用来保存数据(对象流,几乎不使用) 字符串或者二进制 加载成为 Java对象 用来使用 的过程,我们称之为反序列化
对象流就是用来实现 Java对象和二进制 之间的 序列化 和 反序列化 ObjectOutputStream 用来将Java对象转换成为二进制并写入 ObjectInputStream 用来将二进制读取并加载成为 Java对象

关闭流简述

finally

finally表示 "一定" 会执行的代码: 如果没有异常,或者有异常但是都被解决了,finally代码块写不写都会执行。 如果有异常没有处理,当JVM接收到了未处理的异常以后,执行finally代码块里的内容,然后再让程序终止!
如果在 finally执行之前,程序就已经终止了,此时 finally代码块不会被执行!
finally的注意项: 1. 如果finally代码块里也有异常,finally里的异常会覆盖try语句里崩出的异常 2. 如果方法里finally代码块有return语句,finally里的return会覆盖之前的return

关闭流的代码必须写在finally类里原因

  1. 如果程序没有出现未处理的异常,finally代码块写不写,关闭流的代码都会执行!
  1. 如果出现了一个未处理的异常,程序会异常终止,程序都已经异常终止了, 程序运行时使用的资源也会自动释放,手动调用close方法关闭流的代码可执行可不执行!
  1. 在多线程里可能出现一个现象: 程序出现了未处理的异常,但是程序没有终止,还在继续执行,一个进程至少有一个线程,这个线程称之为主线程。如果主线出现未处理的异常,会导致程序异常终止!!!如果主线程没有出现异常,只是子线程出现了异常,此时程序不会异常终止,还会继续执行!
上一篇
Day17-Map、IO流基础
下一篇
Day19-IO流与多线程