1 File
- File可以将程序和电脑的文件夹或者文件关联起来
相对路径
绝对路径
2 基本概念
分类
- 流向
输入流,输出流
- 数据
字节流:二进制,可以使一切文件包括文件,文本音视频
字符流:文本文件,只可以处理纯文本
- 功能
节点流:包裹源头
处理流:增强功能,提供性能
字节流和字符流
- 字节流
- 输入流
InputStream;read(byte[] b)read(byte[] b,int off,int len);close();
- 输出流
OutputStream;write(byte[] b) + flush() + close()
- 字符流
- 输入流:Reader
read(char[] buffer)
- 输出流:Writer
write(byte[] buffer)+flush()+close()
2 字节流
步骤:
- 建立与文件的联系
- 选择对应流
- 读取|写出
- 数组大小读取或者写出
- 释放资源
读取文件与写出文件与拷贝
- 读取
// 建立联系 File file = new File("F://zhao.txt"); // 选择流 InputStream inputStream = new FileInputStream(file); // 读取的大小每次 byte[] b = new byte[10]; int len = 0;// 实际读取的字节数 while((len = inputStream.read(b)) != -1){ System.out.println(len); } inputStream.close();
- 写入文件
FileOutputStream(File file) // 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。FileOutputStream(File file, boolean append) //创建一个向指定 File 对象表示的文件中写入数据的文件输出流。FileOutputStream(String name) // 创建一个向具有指定名称的文件中写入数据的输出文件流。FileOutputStream(String name, boolean append) // 创建一个向具有指定 name 的文件中写入数据的输出文件流。// f://zhaodi.txt在写的时候自动创建这个文件 OutputStream os = new FileOutputStream(new File("f://zhaodi.txt"),true); String info ="zhaodi is 赵迪"; // 字符串转字节 byte[] data = info.getBytes(); os.write(data); os.flush();
- 拷贝文件
就是先读取一个文件,然后写到另一个文件
InputStream is = null; OutputStream os = null; os = new FileOutputStream("f://zhaodiishao.txt",true); is = new FileInputStream(new File("f://zhao.txt")); byte[] car = new byte[1024]; int len = 0; while((len = is.read(car)) != -1){ os.write(car); } os.flush(); is.close(); os.close();
- 拷贝文件夹
3 字符流
只可以操作纯文本
步骤:
- 建立联系
- 选择流 Writer、Reader
- 读取|写出 ==char[] data = new char[10]== 注意这里是字符数组!!
- 关闭
原理同字节流,此处省略
4 处理流
- 节点流处于io操作的第一线,所有操作必须通过他们进行;处理流可以对其它流进行处理(提高效率或者操作灵活性)
- 记住处理流是对其它流的处理哦
- 提高性能,增强功能
字节缓冲流
- 字节缓冲流
没有加入新的方法
InputStream is = null; OutputStream os = null; os = new BufferedOutputStream(new FileOutputStream("f://zhaodiishao.txt",true)); is = new BufferedInputStream(new FileInputStream(new File("f://zhao.txt"))); byte[] car = new byte[1024]; int len = 0; while((len = is.read(car)) != -1){ os.write(car); } os.flush(); is.close(); os.close();
字符缓冲流
加入新的重要的方法
readLine() //读取一个文本行,包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 nullnewLine() // 写入一个行分隔符
// 选择流 BufferedReader bufferedReader = null;// 多态是不可以访问新增加的方法的所以这里不可以使用多态 BufferedWriter bufferedWriter = null; try { // 包装节点流 bufferedReader = new BufferedReader(new FileReader(new File("f://zhao.txt"))); bufferedWriter = new BufferedWriter(new FileWriter(new File("f://zhaozhao.txt"))); String line_info = null; // 读取 写入 while((line_info=bufferedReader.readLine())!=null){ bufferedWriter.write(line_info); bufferedWriter.newLine(); } bufferedWriter.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { // 关闭 bufferedReader.close(); bufferedWriter.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
转换流
作用
- 字节流转换为字符流
- 处理乱码编码集
- 解码
编码
graph LR字符-->二进制
解码
graph LR二进制-->字符
乱码出现原因
- 编码与解码的字符集不统一
String user_name = "zhaodi 赵迪"; // 编码 byte[] data = user_name.getBytes("utf-8"); // 解码 String user_name1 = new String(data,"utf-8"); System.out.println(user_name1);
- 字节缺少,长度丢失
5 序列化,反序列化
程序运行时,只要需要,对象可以一直存在,并且我们可以随时访问对象的一些状态信息,如果程序终止,那么对象是肯定不会存在的,但是有时候,我们需要再程序终止时保存对象的状态信息,之后程序再次运行时可以重新恢复到之前的状态,如,玩家玩游戏退出时,需要保存玩家的状态信息(如等级、装备等等),之后玩家再此登入时,必须要恢复这些状态信息。我们可以通过数据库手段来达到这个保存状态的目的,在Java中,我们有更简便的方法进行处理,那就是序列化与反序列化。序列化是一种对象持久化的手段,反序列化与序列化相反,其是通过序列化后的信息重新组装成对象。
-序列化 需要实现Serializable 接口,反序列化不需要