IO流
- 不要忘记释放资源 close()
1. File
1. File类概述和构造方法
- File:他是文件和目录路径名的抽象表示
- 文件和目录是可以通过File封装成对象得到
- 对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。
2. 构造方法
1. File(String pathname) ;
2. File(String parent, String child);
3. File(File parend, String child);
3. File类功能创建
1. public boolean createNewFile() //创建新空文件(非文件夹)
2. public boolean mkdir() //创建新空目录
3. public boolean mkdirs() //创建新空目录,包括父目录
4. File类判断 和 获取功能
1. public boolean isDirectory() //判断是否为目录
2. public boolean isFile() //判断是否为文件
3. public boolean exists() //判断文件是否存在
4. public String getAbsolutePath() //返回绝对路径名 (最全)
5. public String getPath() //返回路径名 (返回值取决于构造参数)
6. public String getName() //返回最终文件和目录的名称 (最终)
7. public String[] list() //返回此目录中的文件和目录的名称
8. public File[] listFiles() //返回此目录中的文件和目录名称
5. File类删除功能
public boolean delete() //删除文件或目录
- 删除目录注意事项:如果一个目录中由内容(目录,文件),不能直接删除,先删除内容
2. IO流
1. IO流的概述和分类:
1. IO流概述:
- 硬盘 —> 内存 写数据 输出
- 硬盘 <— 内存 读数据 输入
- 内存上的内容放到硬盘上(输出,写数据(内存数据写到硬盘上))
- 硬盘中的内容加载到内存(输入,读数据(硬盘读数据到内存))
- GPT解释(:
- 将内存上的数据写入硬盘中被称为输出操作,而将硬盘上的数据加载到内存中被称为输入操作。在编程中,输出通常意味着将数据从内存写入到硬盘上的文件或其他存储设备中,而输入则是将文件或其他存储设备中的数据读取到内存中进行处理。
2. IO流分类:
- 按照数据的流向:
- 输入流:读数据
- 输出流:写数据
- 按照数据类型来分:
- 字节流:
- 字节输入流,字节输出流
- 字符流
- 字符输入流,字符输出流
- 字节流:
3. 字节流
1. 字节流抽象基类
1. InputStream: //这个抽象类是表示字节输入流的所有类的超类
2. OutputStream: //这个抽象类是表示字节输出流的所有类的超类
2. 子类名的特定:
- 子类名称都是以父类民作为子类名的后缀
3. 使用字节输出流 写数据的步骤
- 创建字节输出流对象 (调用系统资源创建文件,创建字节输出流对象,让字节输出流指向对象文件)
- 调用字节输出流的写数据方法
- 释放资源 (关闭此文件输出流,并释放与此相关联的任何系统资源)
4. 常用方法:
1. 构造方法
1. FileOutputStream (String name)
2. FileOutputStream (File file)
2. 写数据的三种方法
1. void write (int b)
2. void write (byte[] b) "hanyue.getbytes()" --> 将字符串快速转化为byte数组
3. void write (byte[] b, int off, int len)
5. 两个小问题:
- txt 里面自带换行,读入时会读入换行。
字节流读入换行数据
- windows: \r\n
- linux: \n
- mac: \r
字节流写数据如何实现追加写入
public FileOutputStream (String name, boolean append) //如果第二个参数是true,那么字节写入文件的末尾而不是开头
6. 字节流写数据异常处理
finally : 在异常处理中使用finally来执行所有清楚操作。比如 IO 流中的释放资源
特点:被finally 控制的语句一定会执行,除非JVM退出
格式:
try{ //可能出现的异常; } catch (异常类名,变量名) { //异常的处理代码; } finally { //执行所有清除操作; }
7. 字节流读数据
- 概念定义:
- FileInputStream: 从文件系统中的文件读取字节
- FileInputStream (String name)
- 使用字节输入流读数据的步骤
- 创建字节输入流对象
- 调用字节输入流对象的读数据方法
- 释放资源 (不要忘记)
8. 字节缓冲流
构造方法:
1. 字节缓冲输出流:BufferedOutputStream (OutputStream) 2. 字节缓冲输入流:BufferedInputStream (InputStream in)
为什么构造方法需要的是字节流:
- 因为字节缓冲流仅仅提供缓冲区,而真正读写数据还得依靠基本的字节流对象进行操作
4. 字符流
- flush()
- 由于字符与字节的处理方式不同,在底层进行数据存储和读取时可能存在差异。
1. 为什么会出现字符流
- 字符流 = 字节流 + 编码表
- 汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数
2. 编码表
- 计算机存储的信息都是二进制表示的(
- ASCII字符集
- GBXXX字符集 GBK:最常用的中文码表
- Unicode字符集 UTF - 8编码
3. 字符串中的编码解码及问题
1. 编码
1. byte[] getbytes(); //使用平台默认的字符集将该String编码为一系列字节
2. byte[] getbytes(String charseName); //自定义...
2. 解码
1. String(byte[] bytes); //通过平台默认的字符集解码指定的字节数组来构造新的String
2. String(byte[] bytes, String charseName); //自定义...
3. 字符串中的编码解码问题
1. 字符流抽象基类
- Reader : 字符流入类的抽象类
- Writer : 字符流出类的抽象类
2. 字符流中的编码解码问题相关的两个类
1. InputStreamReader
public InputStreamReader(InputStream in)
public InputStreamReader(InputStream in, String charsetName)
2. OutputStreamWriter
public OutputStreamWriter(OutputStream out)
public OUtputStreamWriter(OutputStream out, String charsetName)
4. 字符流写数据的五种方式:
1. void write(int c) //写一个字符
2. void write(char[] cbuf) //写入一个字符数组
3. void write(char[] cbuf, int off, int len) //写入字符数组的一部分
4. void write(String str) //写入一个字符串
5. void write(String str, int off, int len) //写入一个字符串的一部分
- flush() //刷新流,还可以继续写数据
- close() //关闭流,释放资源,但是在关闭之前会先刷新流。 一旦关闭,不能再写数据。
5. 字符流读数据的两种方式
- int read() //一次读一个字符数据
- int read(char[] cbuf) //一次读一个字符数组数据
6. 改进
1. FileReader(String Filename) //用于读取字符文件的便捷类
2. FileWriter(String Filename) //用于写入字符文件的便捷类
7. 字符缓冲流
1. BufferedWriter(Writer out)
2. BufferedReader(Reader in)
8. 字符缓冲流特有的功能
1. BufferedWriter
void newLine() //写一行分隔符,行分隔符字符串由系统定义
2. BufferedReader
void String readLine() //读一行文字。不包括终止内容(例如:换行符),如果流已到达结尾,则为null
9. IO流小结
(in read) (out write)
三件套
- bw.write(data);
- bw.newLine();
- bw.flush(); 方法用于将缓冲区中的数据立即写入目标流。具体来说,他会强制刷新输出缓冲区,并将缓冲区中的数据推送到底层流。
5.特殊操作流
1. 标准输入输出流
- 略
2. 打印流
- 字节打印流 printStream
- 字符打印流 printWriter
1. 打印流特点
- 只负责输出数据,不负责读取数据
- 有自己的特有方法
2. 字节打印流
- PrintStream(String fileName) : 使用指定的文件名创建打印流
- 使用特有方法写数据,查看的数据原样输出
3. 字符打印流
1. PrintWriter(String fileName) //不会自动刷新
2. PrintWriter(Writer out, boolean autoFlush) //如果为true,则会自动刷新出缓冲区
3. 对象序列化流
- 构造方法: ObjectOutputStream(OutputStream out)
- 序列化对象的方法:void writeObject(Object obj)
- 注意:
- 一个对象想要序列化,该对象所属的类必须实现Serializable接口
- Serializable是一个标记接口,实现该接口,不需要重写任何方法
- 其他
- 给对象序列化流序列化一个对象后,修改对象所属的类文件,如何解决:
- 给所属对象加一个serialVersionUID: private static final long serialVersionUID = 42L;
- 成员变量值不被初始化:
- 给成员变量加transient关键字,该关键字标记的成员变量不参与序列化过程
- 给对象序列化流序列化一个对象后,修改对象所属的类文件,如何解决:
4. 对象反序列化流
- 构造方法: ObjectInputStream(InputStream in)
- 反序列化对象的方法: Object readObject()
5. Properties
概述:
- 是一个Map体系的集合类 (Properties类继承自Hashtable类)
- Properties可以保存到流中或从流中加载
Properties 作为集合特有的方法
Properties和IO流集合的方法:
字节流
- void load(InputStream Instream)
- void store(OutputStream out, String comments)
字符流
1. void load(Reader reader) //输入字符流 (也存入了表中) 2. void store(Writer writer, String comments) //写入Properties 表中