【Java IO 学习总结】 Java IO 是 Java 平台中用于处理输入和输出的核心库,它提供了丰富的类和接口,使得程序能够与各种设备、文件系统以及网络进行交互。IO 操作通常涉及数据的传输,Java 中所有的数据传输都是通过流(Stream)的方式进行的。流可以分为两大类:输入流(Input Stream)和输出流(Output Stream),它们分别负责数据的读取和写入。根据数据单位的不同,流又可以分为字节流(Byte Stream)和字符流(Character Stream)。 1. **流的分类** - 输入流和输出流:这是按照数据流动的方向来划分的,输入流是从外部源(如文件、网络连接)向程序内部读取数据,而输出流则是将数据从程序内部写入到外部目标。 - 字节流和字符流:字节流操作的是字节序列,适用于所有类型的数据,如图像、音频等非文本数据。字符流则处理字符序列,主要用于文本数据,它内部包含了对字符编码的支持。 2. **IO 流体系** - 字节流的顶级父类是 `InputStream` 和 `OutputStream`。常见的字节输入流包括 `FileInputStream`(文件字节输入流)和 `BufferedInputStream`(缓冲字节输入流),后者可以提高读取效率。字节输出流的常见类有 `FileOutputStream`(文件字节输出流)和 `BufferedOutputStream`(缓冲字节输出流)。 - 字符流的父类是 `Reader` 和 `Writer`。`Reader` 常见的子类有 `InputStreamReader`(转换流,用于将字节流转化为字符流,可指定编码)和 `FileReader`(文件字符读取流,使用系统默认编码)。`Writer` 的常见子类包括 `OutputStreamWriter`(转换流,字符到字节)和 `FileWriter`(文件字符写出流)。`BufferedReader` 和 `BufferedWriter` 是字符流的缓冲类,提高读写效率,其中 `BufferedReader` 提供了 `readLine()` 方法用于读取文本行。 3. **字符流的由来和作用** - 字符流是为了应对不同国家和地区使用的多种字符编码而产生的。字符流在处理文本数据时,会先查找指定的字符编码表(如 ASCII、ISO8859-1、GBK 或 Unicode),获取对应的二进制数据,然后再进行操作。这样可以避免因编码不一致导致的乱码问题。对于纯文本数据,推荐使用字符流;而对于非文本数据(如图片、音频),应使用字节流。 4. **代码示例** - **字符流写入**:使用 `FileWriter` 可以将字符串写入到文件中。例如: ```java FileWriter fw = null; try { fw = new FileWriter("Test.txt"); fw.write("text"); } catch (IOException e) { System.out.println(e.toString()); } finally { if (fw != null) { try { fw.close(); } catch (IOException e) { System.out.println(e.toString()); } } } ``` - **字符流读取**:使用 `FileReader` 可以读取文件中的字符数据。例如: ```java FileReader fr = null; try { fr = new FileReader("c:\\test.txt"); char[] buf = new char[1024]; int len = 0; while ((len = fr.read(buf)) != -1) { System.out.println(new String(buf, 0, len)); } } catch (IOException e) { System.out.println("read-Exception :" + e.toString()); } finally { if (fr != null) { try { fr.close(); } catch (IOException e) { System.out.println("close-Exception :" + e.toString()); } } } ``` - **字节流操作**:例如,使用字节流复制文件(从 C 盘到 D 盘): ```java FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream("C:\\image.jpg"); fos = new FileOutputStream("D:\\image.jpg"); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = fis.read(buffer)) != -1) { fos.write(buffer, 0, bytesRead); } } catch (IOException e) { e.printStackTrace(); } finally { if (fis != null) { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 5. **装饰模式的应用** - 在 Java IO 中,`BufferedInputStream`、`BufferedOutputStream`、`BufferedReader` 和 `BufferedWriter` 都是装饰模式的实例,它们在原有流的基础上增加了缓冲功能,提高了性能。此外,`LineNumberReader` 是一个扩展 `BufferedReader` 的类,增加了获取和设置当前行号的功能。 Java IO 系统提供了一套完整的框架,涵盖了从基本的输入输出操作到复杂的文件复制、网络通信等功能。理解并熟练掌握这些概念和类,对于进行任何 Java 应用开发都至关重要。在实际编程中,根据数据类型选择合适的流类型,并利用装饰模式增强流的功能,能够有效地优化代码性能和可维护性。
剩余15页未读,继续阅读
- 粉丝: 0
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C语言-leetcode题解之61-rotate-list.c
- C语言-leetcode题解之59-spiral-matrix-ii.c
- C语言-leetcode题解之58-length-of-last-word.c
- 计算机编程课程设计基础教程
- (源码)基于C语言的系统服务框架.zip
- (源码)基于Spring MVC和MyBatis的选课管理系统.zip
- (源码)基于ArcEngine的GIS数据处理系统.zip
- (源码)基于JavaFX和MySQL的医院挂号管理系统.zip
- (源码)基于IdentityServer4和Finbuckle.MultiTenant的多租户身份认证系统.zip
- (源码)基于Spring Boot和Vue3+ElementPlus的后台管理系统.zip