Java复习第十一天学习笔记(IO流),附有道云笔记链接

【有道云笔记】十一 3.27 IO流

https://note.youdao.com/s/PeEdd3Zo

一、IO介绍以及分类

IO: Input Output

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

IO流的分类:

1、 根据处理的数据类型不同可以分为:字符流和字节流。

2、根据数据的流向不同可以分为:输入流和输出流。

字节流(Byte Stream):

  1. 字节流以字节为单位进行读取和写入操作,适合处理二进制数据(如图片、视频、音频等)或者文本文件。
  2. 字节流类通常以 InputStream 和 OutputStream 结尾,例如 FileInputStream、FileOutputStream。
  3. 字节流可以用于读写任何类型的文件,但对于文本文件的处理可能需要做字符编码转换。

字符流(Character Stream):

  1. 字符流以字符为单位进行读取和写入操作,适合处理文本数据。字符流会自动处理字符编码转换,避免了字节流在处理文本时可能出现的乱码问题。
  2. 字符流类通常以 Reader 和 Writer 结尾,例如 FileReader、FileWriter。
  3. 字符流适合处理文本文件,能够更方便地读写文本中的字符数据。

选择建议:

  1. 如果你需要处理文本文件,推荐使用字符流,因为它们能够更好地处理字符编码和文本数据。
  2. 如果需要处理二进制文件或者未经处理的数据,应该使用字节流。

二、字符流

@Test public void test1() { try { FileReader fileReader = new FileReader("io.txt"); int ch1 = fileReader.read(); System.out.println((char)ch1);//a int ch2 = fileReader.read(); System.out.println((char)ch2);//b int ch3 = fileReader.read(); System.out.println((char)ch3);//c int ch4 = fileReader.read(); System.out.println(ch4);//-1 } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } @Test public void test2() { try { FileReader fileReader = new FileReader("io.txt"); int ch = -1; //while循环去读,直到ch的值等于-1,就退出循环 while ((ch = fileReader.read()) != -1) { System.out.println((char)ch); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } @Test public void test3() { FileReader fileReader = null; try { fileReader = new FileReader("io.txt"); char\[\] buffer = new char10; int length = -1; //public int read(char\[\] cbuf) //将字符读入数组 //返回:读取的字符数,如果已到达流的末尾,则返回 -1 while ((length = fileReader.read(buffer)) != -1) { System.out.println(length); System.out.println(buffer); } System.out.println(length); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (fileReader != null) { try { fileReader.close(); } catch (IOException e) { e.printStackTrace(); } } } } @Test public void test4() { FileReader fileReader = null; FileWriter fileWriter = null; try { fileReader = new FileReader("io.txt"); fileWriter = new FileWriter("io_back.txt"); char\[\] buffer = new char10; int length = -1; while ((length = fileReader.read(buffer)) != -1) { System.out.println(length); System.out.println(buffer); //读出多少就写多少,最后一次读出的数据很有可能不够buffer数组长度的数据 fileWriter.write(buffer, 0, length); } System.out.println(length); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (fileWriter != null) { try { fileWriter.close(); } catch (IOException e) { e.printStackTrace(); } } if (fileReader != null) { try { fileReader.close(); } catch (IOException e) { e.printStackTrace(); } } } }

三、字节流

@Test public void testFileInputStreamFileOutputStram() { FileInputStream fileInputStream = null; FileOutputStream fileOutputStream = null; try { fileInputStream = new FileInputStream("bd.png"); fileOutputStream = new FileOutputStream("bd_back.png"); byte\[\] buffer = new byte1024; int length = -1; while ((length = fileInputStream.read(buffer)) != -1) { fileOutputStream.write(buffer, 0, length); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (fileOutputStream != null) { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (fileInputStream != null) { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }

四、对象流

ObjectInputStream、ObjectOutputStream

将对象写入文件的操作流ObjectOutputStream,称为序列化。

从流中读取对象的操作流程ObjectInputStream,称为反序列化。

java.io.NotSerializableException: com.situ.day13.Student

Serialize序列化

@Test public void testObjectOutputStream() { Student student = new Student(); student.setId(1); student.setName("zhangsan"); student.setAge(23); student.setGender("男"); ObjectOutputStream objectOutputStream = null; FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream("stu"); objectOutputStream = new ObjectOutputStream(fileOutputStream); objectOutputStream.writeObject(student); } catch (IOException e) { e.printStackTrace(); } finally { if (objectOutputStream != null) { try { objectOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (fileOutputStream != null) { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } @Test public void testObjectInputStream() { ObjectInputStream objectInputStream = null; FileInputStream fileInputStream = null; try { fileInputStream = new FileInputStream("stu"); objectInputStream = new ObjectInputStream(fileInputStream); Student student = (Student) objectInputStream.readObject(); System.out.println(student); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { if (objectInputStream != null) { try { objectInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (fileInputStream != null) { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }

一般情况下:先打开的后关闭,后打开的先关闭。

另一种情况:看依赖关系,如果流A依赖于流B,先关闭流A,再关闭流B。

五、IO异常的原因

在使用字节流读取文件时,可能会遇到各种 I/O 异常情况。以下是一些常见的导致 I/O 异常的情况:

  1. 文件不存在:尝试读取一个不存在的文件会导致 FileNotFoundException。
  2. 无法访问文件:权限不足或文件被其他程序占用可能导致 AccessDeniedException。
  3. 文件路径错误:如果提供的文件路径有误,会导致 InvalidPathException 或 InvalidParameterException。
  4. 磁盘空间不足:在写入文件时,磁盘空间不足会导致 DiskFullException。
  5. 网络异常:当从网络位置读取文件时,网络连接中断或超时会导致 SocketTimeoutException 或 IOException。
相关推荐
腻害兔6 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社7 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
克里斯蒂亚诺更新7 小时前
ruoyi角色权限的对应关系
笔记
萧瑟余晖8 小时前
JDK 26 新特性详解
java·开发语言
马优晨9 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
a11177610 小时前
2FA 验证码生成器(github登录验证 app)
笔记·学习
我的xiaodoujiao10 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2
python·学习·测试工具·pytest
维天说11 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
破碎的南瓜11 小时前
sqli--sql注入过关笔记(1,2,3,4,5,9)
数据库·笔记·sql
Zane199412 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端