java io 结构_java 的IO类库的基本架构
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类库的基本架构相关推荐
- java 流压缩_java之IO流:压缩文件
在java的学习中,IO流是一个避不开的话题.在java日常的学习和使用中,为了给不同的场景提供不同的用途,IO流拥有一个庞大的方法集合.虽然给使用者提供了极大的便利,但此同时也带来了学习时的异常冗杂 ...
- java io处理_java之IO处理
一.Java的 IO 处理 1. input output 输入和输出 2. 输入? --学习对于学生来说 -- 由外面的信息到大脑 -- 由外存到内存 3. 输出? -- 授课对于老师来说 -- 由 ...
- java写入简介_Java关于IO流的介绍
2.InputStream 和 OutputStream 是两个 abstact 类,对于字节为导向的 stream 都扩展这两个基类; inputStream中的关键方法: read():方法是读取 ...
- java io操作_Java 的IO操作(文件的读,写操作)
/* * FileEditor.java * * Created on 2006年9月13日, 下午2:22 * * To change this template, choose Tool ...
- java io顺序_Java顺序IO性能
java io顺序 许多应用程序将一系列事件记录到基于文件的存储中,以供以后使用. 从日志记录和审核,直到在事件源设计或其紧密相关的CQRS中保留事务重做日志,这都可以是任何东西. Java具有多种方 ...
- java音频剪切_Java使用IO流实现音频的剪切和拼接
需求:使用IO流将指定目录下的若干个音频文件的高潮部分,进行剪切,并重新拼接成一首新的音频文件 思路(以两首歌为例): 第一首歌有一个输入流对象bis1.第二首歌有一个输入流对象bis2,他们公用一条 ...
- java 文件io操作_java文件IO操作。
public static void main(String[] args) { String filename = "F:/zhangming_test/test.txt"; S ...
- java list 结构_Java中常见数据结构List之ArrayList
这里主要包含ArrayList和LinkedList. 关于Java中的集合内容, 感觉都已经被写烂了, 我这里主要是做个复习, 再从扒下源代码, 尽量用最直白的语言把里面的核心内容记录下来.仅此而已 ...
- java单根结构_Java语言程序设计中的单根结构
在面向对象的程序设计中,由于C++的引入而显得尤为突出的一个问题是:所有类最终是否都应从单独一个基础类继承.在java中(与其他几乎所有OOP语言一样),对这个问题的答案都是肯定的,而且这个终级基础类 ...
最新文章
- Java-ReentrantLock初探
- 为什么使用消息队列? 消息队列有什么优点和缺点? Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,以及适合哪些场景?...
- 怎么获取web开发怎么获取手机的唯一标识_PYTHON实现北京住宅小区数据抓取-(Web服务API-地点检索服务)
- C语言指定编译对齐方式
- 2017蓝桥杯省赛---java---B---10(k倍区间)
- python制作表格的语句_python根据Excel自动生成创建表sql语句
- 设计模式---解释器模式(C++实现)
- inux下切换到root权限有以下几种方式
- 配置urlrewrite不生效
- 极大似然估计的通俗理解
- office2019 完美卸载
- 办信用卡哪家强?update 2014.11.21
- 编辑python用什么输入法_用Python从0开始实现一个中文拼音输入法!
- A hybrid CNN-LSTM model for typhoon formation
- java xml用word打开乱码,word打开是乱码的5种方法
- 学习Chrome Devtools 调试
- 网页报错404原因及解决方法
- xgboost自定义损失函数评估函数
- 钩陈/ 为什么会忍不住复训蟒营™
- 常见的几种网络设备的用途和功能
热门文章
- 填谷式无源pfc电路_有源PFC电路上各个元件的作用-安泰维修
- php array_only,php可以定义数组的常量吗
- swift. 扩展类添加属性_Swift iOS-如何动态地向现有类添加属性然后访问它们
- Linux / TCPIP / 判断 client 已经关闭的方法
- php计算时间差js,JavaScript如何计算时间差(引入外部字体文件)?
- python中cv2库_Python cv2库(人脸检测)
- mysql5.5源码包安装_mysql的源码包方式安装(mysql5.5)
- webpack配置--传统多页面项目
- java xmlsec_找不到net.shibboleth.tool:xmlsectool:2.0.0
- 常用模块(数据序列化 json、pickle、shelve)