IO流IO流体系
文件输入输出流
|_ 字节流
|_ FileInputStream
|_ FileOutputStream
|_ 字符流
|_ FileReader
|_ FileWriter
缓冲输入输出流
|_ 字节流
|_ BufferedInputStream
|_ BufferedOutputStream
|_ 字符流
|_ BufferedReader
|_ BufferedWriter
对象输入输出流
|_ 字节流
|_ ObjectInputStream
|_ ObjectOutputStream
打印输出流
|_ 字节流
|_ PrintStream
|_ 字符流
|_ PrintWriter
转换流
|_ 字符流
|_ InputStreamReader
|_ OutputStreamWriter
字节流
|_ InputStream # 字节输入流
| |_ FileInputStream # 专门操作文件的字节输入流
| |_ BufferedInputStream # 带有缓冲区的字节输入流, 效率高
| |_ ObjectInputStream # 对象输入流
|
|_ OutputStream # 字节输出流
|_ FileOutputStream # 专门操作文件的字节输出流
|_ BufferedOutputStream # 带有缓冲区的字节输出流, 效率高
|_ ObjectOutputStream # 对象输出流
|_ PrintStream # 字节打印流
字符流
|_ Reader # 字符输入流
| |_ BufferedReader # 带有缓冲区的字符输入流, 效率高
| |_ InputStreamReader # 将字节流转换为字符流输入的转换输入流
| |_ FileReader # 专门操作文件的字符输入流
|
|_ Writer # 字符输出流
|_ BufferedWriter # 带有缓冲区的字符输出流, 效率高
|_ OutputStreamWriter # 将字符流转换为字节流输出的转换输出流
|_ FileWriter # 专门操作文件的字符输出流
|_ PrintWriter # 字符打印流File类构造方法
File File(String pathname)
File File(String parent, String child)
File File(File parent, String child)
常用成员方法
创建
boolean createNewFile():创建一个新文件. 返回是否创建成功
boolean mkdir():创建目录, 返回是否创建成功
boolean mkdirs():创建多层目录, 包括指定路径中缺少的父级目录. 返回是否创建成功
删除
获取
String getPath(): 获取创建File对象时使用的路径(创建时是相对路径则返回相对路径, 是绝对路径则返回绝对路径)
String getAbsolutePath(): 获取File对象的绝对路径字符串
File getAbsoluteFile(): 获取包含绝对路径的File对象
String getParent(): 获取File对象的父路径字符串
File getParentFile(): 获取File对象的父路径的File对象
String getName(): 获取File对象代表的文件名或目录名(不含上层目录)
long length(): 获取File对象所表示的文件的大小, 单位byte
long lastModified(): 获取文件上次修改时间
判断
boolean exists(): 判断文件或目录是否存在
boolean isAbsolute(): 判断File中保存的是否是绝对路径
boolean isDirectory(): 判断该File对象是否为目录
boolean isFile(): 判断该File对象是否为文件
boolean isHidden(): 判断该文件或目录是否为隐藏的
修改
重要的获取功能
String[] list(): 获取当前路径下所有文件和目录名称(不包括父路径). File对象必须是目录, 否则会报错
File[] listFiles(): 获取当前路径下的所有文件和目录的File对象. File对象必须是目录
static File[] listRoots(): 返回系统的所有根路径. windows系统就是各种盘符
字节流
标准流
转换流
打印流
PrintStream: 字节打印流
PrintWriter: 字符打印流
PrintWriter打印流的特点
可以自动换行, println(). 会根据系统自动确定换行符
不能输出字节, 可以输出其他任意类型(要输出字节需要使用PrintStream)
通过构造方法的配置可以实现自动刷新(flush)(只在调用println, printf, format时有用)
也是包装流, 自身没有写出功能
可以把字节输出流转换为字符输出流
关流不会抛出异常(此类中的方法不会抛出 I/O 异常,尽管其某些构造方法可能抛出异常)
构造方法
PrintWriter PrintWriter(String filepath)
PrintWriter PrintWriter(Writer out, boolean autoFlush): 创建对象, 同时设置是否自动刷新
PrintWriter(OutputStream out, boolean autoFlush): 创建对象, 同时设置是否自动刷新
成员方法
void write(String s): 写一个字符串
void print(String s): 输出字符串, 没有换行
void println(String s): 输出字符串并换行. 如果启动了自动刷新, 则会执行自动刷新写入数据
void printf(Locale l, String format, Object... args): 使用指定格式字符串和参数将格式化的字符串写入输出流. 如果启动了自动刷新, 则会执行自动刷新写入数据
void format(Locale l, String format, Object... args): 使用指定格式字符串和参数将格式化的字符串写入输出流. 如果启动了自动刷新, 则会执行自动刷新写入数据
对象操作流
ObjectInputStream
OutputStream
注意
Serializable接口
构造方法
方法
构造方法:
成员方法
void writeObject(Object o): 将对象写入对象输出流
Object readObject(): 从对象输入流读取对象, 一次只读取一个对象. 当读不到时抛出EOFException
Properties
编码表
常见编码表
ASCII: 美国标准码. 包含26个英文字母的大写和小写, 数字, 符号
ISO-8859-1: 西方语言编码
GB2312: 国标码
GBK: 国标扩展码
Unicode: 万国码. 支持多国语言字符.
UTF-8: Unicode的一种实现方式, 长度可变的码表, 一个字符占用1个或2个字节
ANSI: 本地编码表. 根据系统设置决定编码表
Java String类对于字节和编码的操作
byte[] getBytes(): 获取字符串的byte数组, 使用默认编码
byte[] getBytes(String charsetName): 获取字符串的byte数组, 使用指定编码
String String(byte[] bytes): 将byte数组转化为字符串, 使用默认编码
String String(byte[] bytes, String charsetName): 将byte数组转换为字符串, 使用指定编码
String String(byte[] bytes, int offset, int len, String charsetName): 将byte数组的一部分转换为字符串, 使用指定编码
乱码
原因: 读的编码与写的编码不一致
解决方法: 保证读和写的编码一致, 即可解决
处理乱码的2种方式:
String通过指定编码转为byte数组, 然后再创建String: (GBK字符串转UTF-8字符串写入文件)
OutputStreamWriter可以指定编码写入文件, 免去使用String通过编码转换为byte数组的步骤