java IO 操作的类在java.io 包中,大概可以分为以下几组:

基于字节操作的接口:InputStream 和 OutputStream

基于字符操作的接口:Writer 和 Reader

基于磁盘操作的接口:File 相关

基于网络操作的接口:Socket 相关

前两个是数据格式区分,后两个是传输方式区分。IO 只是人机交互的手段,除了完成交互功能,我们关注的就是如何提高他的运行效率了,而数据格式和传输方式是影响效率的最关键的因素。

基于字节操作的接口

以下是 InputStream 的类层次关系图

其实还有很多子类没有展示出来,每个子类对应处理不同的操作类型。

以下是 OutputStream 的类层次关系图

两个要点:

1、操作数据的方式可以组合使用

2、必须制定流最终写到什么地方:要么是磁盘,要么是网络中。其实写网络也是写磁盘,只是需要让操作系统再将数据传送到其他地方,而不是本地磁盘。

基于字符操作的接口

不管是磁盘还是网络传输,最小的存储单元都是字节,而不是字符,所以IO操作的都是字节而不是字符,但是为什么有操作字符的IO接口呢?

这是因为我们程序操作的数据都是字符形式的,为了方便操作当然要提供直接写字符的IO接口。

Writer 类层次结构

Reader 类层次结构

Reader 和 Writer 接口都只定义了读取或写入数据字符的方式,也就是怎么读或写,但是没有指明数据要写到哪里,这里就涉及到磁盘或网络的工作机制。

字节和字符转化接口

前面说过,数据持久化或网络传输都是以字节为单位进行,所以必须有字符字节转化工具。

字符编码类结构如图,解码有类似的结构;

从InputStream 到 Reader 的过程要指定编码字符集,否则使用系统默认的字符集,很可能会出现乱码问题。StreamDecoder 正是完成从字节到字符的解码的实现类。

try {

StringBuffer buffer = new StringBuffer();

char[] buf = new char[1024];

FileReader reader = new FileReader("file");

while (reader.read(buf) > 0) {

buffer.append(buf);

}

buffer.toString();

} catch (Exception e) {

}

FileReader 就是按照上面的工作方式读取文件的,FileReader 继承了 InputStreamReader ,实际上是读取文件流,然后通过StreamDecoder 解码成 char,只不过这里的解码字符集是默认字符集。

通过 OutputStreamWriter 类完成了从字符到字节的编码过程,由 StreamEncoder 完成编码过程。

java io 结构_java 的IO类库的基本架构相关推荐

  1. java 流压缩_java之IO流:压缩文件

    在java的学习中,IO流是一个避不开的话题.在java日常的学习和使用中,为了给不同的场景提供不同的用途,IO流拥有一个庞大的方法集合.虽然给使用者提供了极大的便利,但此同时也带来了学习时的异常冗杂 ...

  2. java io处理_java之IO处理

    一.Java的 IO 处理 1. input output 输入和输出 2. 输入? --学习对于学生来说 -- 由外面的信息到大脑 -- 由外存到内存 3. 输出? -- 授课对于老师来说 -- 由 ...

  3. java写入简介_Java关于IO流的介绍

    2.InputStream 和 OutputStream 是两个 abstact 类,对于字节为导向的 stream 都扩展这两个基类; inputStream中的关键方法: read():方法是读取 ...

  4. java io操作_Java 的IO操作(文件的读,写操作)

    /*  * FileEditor.java  *  * Created on 2006年9月13日, 下午2:22  *  * To change this template, choose Tool ...

  5. java io顺序_Java顺序IO性能

    java io顺序 许多应用程序将一系列事件记录到基于文件的存储中,以供以后使用. 从日志记录和审核,直到在事件源设计或其紧密相关的CQRS中保留事务重做日志,这都可以是任何东西. Java具有多种方 ...

  6. java音频剪切_Java使用IO流实现音频的剪切和拼接

    需求:使用IO流将指定目录下的若干个音频文件的高潮部分,进行剪切,并重新拼接成一首新的音频文件 思路(以两首歌为例): 第一首歌有一个输入流对象bis1.第二首歌有一个输入流对象bis2,他们公用一条 ...

  7. java 文件io操作_java文件IO操作。

    public static void main(String[] args) { String filename = "F:/zhangming_test/test.txt"; S ...

  8. java list 结构_Java中常见数据结构List之ArrayList

    这里主要包含ArrayList和LinkedList. 关于Java中的集合内容, 感觉都已经被写烂了, 我这里主要是做个复习, 再从扒下源代码, 尽量用最直白的语言把里面的核心内容记录下来.仅此而已 ...

  9. java单根结构_Java语言程序设计中的单根结构

    在面向对象的程序设计中,由于C++的引入而显得尤为突出的一个问题是:所有类最终是否都应从单独一个基础类继承.在java中(与其他几乎所有OOP语言一样),对这个问题的答案都是肯定的,而且这个终级基础类 ...

最新文章

  1. Java-ReentrantLock初探
  2. 为什么使用消息队列? 消息队列有什么优点和缺点? Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,以及适合哪些场景?...
  3. 怎么获取web开发怎么获取手机的唯一标识_PYTHON实现北京住宅小区数据抓取-(Web服务API-地点检索服务)
  4. C语言指定编译对齐方式
  5. 2017蓝桥杯省赛---java---B---10(k倍区间)
  6. python制作表格的语句_python根据Excel自动生成创建表sql语句
  7. 设计模式---解释器模式(C++实现)
  8. inux下切换到root权限有以下几种方式
  9. 配置urlrewrite不生效
  10. 极大似然估计的通俗理解
  11. office2019 完美卸载
  12. 办信用卡哪家强?update 2014.11.21
  13. 编辑python用什么输入法_用Python从0开始实现一个中文拼音输入法!
  14. A hybrid CNN-LSTM model for typhoon formation
  15. java xml用word打开乱码,word打开是乱码的5种方法
  16. 学习Chrome Devtools 调试
  17. 网页报错404原因及解决方法
  18. xgboost自定义损失函数评估函数
  19. 钩陈/ 为什么会忍不住复训蟒营™
  20. 常见的几种网络设备的用途和功能

热门文章

  1. 填谷式无源pfc电路_有源PFC电路上各个元件的作用-安泰维修
  2. php array_only,php可以定义数组的常量吗
  3. swift. 扩展类添加属性_Swift iOS-如何动态地向现有类添加属性然后访问它们
  4. Linux / TCPIP / 判断 client 已经关闭的方法
  5. php计算时间差js,JavaScript如何计算时间差(引入外部字体文件)?
  6. python中cv2库_Python cv2库(人脸检测)
  7. mysql5.5源码包安装_mysql的源码包方式安装(mysql5.5)
  8. webpack配置--传统多页面项目
  9. java xmlsec_找不到net.shibboleth.tool:xmlsectool:2.0.0
  10. 常用模块(数据序列化 json、pickle、shelve)