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类的常用方法
- exists(): 判断文件(夹)是否存在
- isFile(): 判断是否是文件
- isDirectory(): 判断是否是文件夹
- getAbsolutePath():获取到文件的绝对路径字符串
- getAbsoluteFile():获取到文件绝对路径对应的File对象
- String[] list(): 获取到一个文件夹下所有的直接子文件(夹)名组成的字符串数组
- 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文件未找到的异常
字节流的访问过程:
- 打开流
- 操作流(输入流执行读取操作,输出流执行写入操作)
- 关闭流
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类里原因
- 如果程序没有出现未处理的异常,finally代码块写不写,关闭流的代码都会执行!
- 如果出现了一个未处理的异常,程序会异常终止,程序都已经异常终止了, 程序运行时使用的资源也会自动释放,手动调用close方法关闭流的代码可执行可不执行!
- 在多线程里可能出现一个现象: 程序出现了未处理的异常,但是程序没有终止,还在继续执行,一个进程至少有一个线程,这个线程称之为主线程。如果主线出现未处理的异常,会导致程序异常终止!!!如果主线程没有出现异常,只是子线程出现了异常,此时程序不会异常终止,还会继续执行!
- 作者:tacjin
- 链接:http://jin.wiki/article/7d138d04-5c9d-4249-80c4-4bb2191eff63
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。