[Java] Java IO 概况
Java IO 是 Java 的一套 API, 用于读入和写出数据(输入和输出)。Java IO API 位于 java.io package。实际上 java.io package 没有解决所有的输入输出情况,例如,web 页面没有包含在 Java IO package 里面,而是由 Java 企业版本的 servlet 和 HTTP package 处理。
Java IO package 关注文件、网络流(Network Stream), 内存缓冲区(internal memory buffer)的输入输出。Java IO package 没有包含用于打开网络套接字(Network socket) 的类。网络套接字由 Java Network API 打开,然后 Java IO 的 InputStream / OutputStream 从打开的套接字读入,或者向打开的套接字写出数据。
Java NIO 用于处理非阻塞的输入输出操作。
Input 和 Output
最常见的数据源或目的地有:
文件
管道
网络连接
内存缓冲区
System.in, System.out, System.error
本质的数据流动请求如下
Source -> Program -> Destination
Stream
Stream 是 Java IO 的核心概念。Stream 是一个无尽头的数据流,可以从一个 Stream 读取数据,也可以向一个 Stream 写入数据。Stream 没有下标,也不能向前向后地移动,和数组不一样。
Stream 可以简单分为基于字节(byte based),或者基于字符(character based)。
基于字节的 stream 一般叫做 xxxxxxStream,例如 InputStream, OutputStream。这些 stream 一次只读入或写出一个字节,除了 DataInputStream / DataOutputStream。DataInputStream / DataOutputStream 用于处理 int / long / boolean 等类型。
基于字符的 stream 一般叫做 xxxxxxReader 或 xxxxxxWriter。
程序通过 InputStream 或者 Reader 读入数据,通过 OutputStream 或者 Writer 写出数据。
Source -> InputStream / Reader -> Program
Program -> OutputStream / Writer -> Destination
如果需要写组件用于输入或输出,尽量让组件依赖于 InputStream / OutputSteam,而不是他们的具体子类,使得代码更加灵活应变。例如
InputStream is = new FileInputStream(filepath);
OutputSteam os = new FileOutputStream(filepath);
一次从文件读取一个字节是非常慢的,使用 BufferedInputStream 一次读取一大块数据会快很多。例子
InputStream is = new BufferedInputStream(new FileInputStream("/tmp/tony/a.txt"));
缓冲(buffer) 也适用于 OutputStream,用于批量写出到硬盘。
| Byte Based | Character Based | ||||
| Input | Output | Input | Output | comment | |
| Basic | InputStream | OutputStream |
Reader InputStreamReader |
Writer OutputStreamWriter |
|
| Arrays | |||||
| Files | FileInputStream | FileOutputStream | FileReader | FileWriter | |
| Pipes | |||||
| Buffering | BufferedInputStream | BufferedOutputStream | In memory, better performance | ||
| Filter | |||||
| Parsing | PushbackInpustream | PushbackReader | |||
| String | |||||
| Data | |||||
| Data-formated | |||||
| Object | |||||
| Utilities | |||||
InputStream 和 OutputStream
InputStream 是 Java IO API 中所有 input stream 的基础类。InputSream 下面的子类有 FileInputStream, BufferedInputStream。 InputStream 例子
InputStream is = new FileInputStream("/tmp/tony/a.txt");
int data = is.read();
while(data != -1){
System.out.print((char)data);
data = is.read();
}
FileInputStream 是 InputStream 的子类。例子中省略了异常的处理。
当 read() 方法返回 -1 时,说明 stream 以及没有内容可以读取了。-1 是 int 值,而不是 byte 或 short 值。
read(byte[]) 方法一次读取字节数组,返回读入的字节数。read(byte[]) 比一次只读取一个字节的 read() 要快。每次都需要检查 read(byte[]) 的返回值,来了解读取的数据大小。
mark() 和 reset() 方法主要用于实现解释器,用到情况小。
OutputStream 是 Java IO API 中所有 output stream 的基础类。OutputStream 下面的子类有 FileOutputStream, BufferedOutputStrea。OutputStream 例子
OutputStream os = new FileOutputStream("/tmp/tony/b.txt");
byte[] b = {'h', 'e', 'l', 'l'};
os.write(b);
os.close();
write(byte[]) 方法将 byte 数组中的所有字节写入到 OutputStream 中
flush() 方法,将已经写出 OutputSteam 的数据清刷(写出)到底层的数据目的地。例如,如果 OutputStream 是 FileOutputStream,写出到 FileOutputStream 的字节还没有全部写出到硬盘。即使 java 代码已经将数据写出到 FileOutputStream,数据可能还在缓存区而已。通过 flush() 方法,可以确保数据都清刷到硬盘(或网络)。
close() 方法,用于关闭 stream。通常位于 final 代码块。
Reader 和 Writer
Reader 和 Writer 在 Java IO 中的功能类似于 InputStream 和 OutputStream,差异点在于 Reader 和 Writer 基于字符。
Reader 是 Java IO API 中又有 reader 的基础类。Reader 下面的子类有 BufferedReader, InputStreamReader, StringReader。例子
Reader reader = new FileReader("/tmp/tony/a.txt");
int data = reader.read();
while(data != -1){
System.out.print((char)data);
data = reader.read();
}
InputStream 一次返回 8 bit( 一个 byte ) 的值 (0 到 255)
Reader 一次返回 16 bit 的值 ( 0 到 65535), 可能是一个或多个 byte,取决于文本采用的编码格式。
Reader 可以套在 InputStream 外面,来读取字符。
InputStream is = new FileInputStream("/tmp/tony/a.txt");
Reader rd = new InputStreamReader(is);
Writer 可以类似地套在 OutputStream 外面,写出字符。
OutputStream os = new FileOutputStream("/tmp/tony/b.txt");
Writer wt = new OutputStreamWriter(os);
wt.write("qqq");
wt.close();
Reader / Writer 子类的的组装
Reader reader = new BufferedReader(new FileReader("/tmp/tony/a.txt"));
Writer writer = new BufferedWriter(new FileWriter("/tmp/tony/c.txt"));
参考资料
[Java] Java IO 概况的更多相关文章
- java的IO流
java的IO流继承四大抽象类分别是字节流 inputStream outputStream与字符流 read write.怎么理解记忆很重要. 直接连接读写对象的是结点流,例如对文件读取字节类的名字 ...
- java之io之File类的list()方法过滤目录的使用
java的io的知识中,File类必须掌握.File类是对文件或者文件夹的封装.它本身并不能对所封装的文件进行读写,它封装的只是文件或文件夹的周边知识,比如 大小啦,创建日期啦,路径啦等等. 如果Fi ...
- Java 新IO
NIO提供全新的底层I/O模型.与最初的java.io包中面向流(stream-oriented)概念不同,NIO采用了面向块的概念(block-oriented).在尽可能的情况下,I/O的操 ...
- JAVA中IO总结
JAVA中IO流主要分为两大类: 字节流:InputStream+OutputStream 字符流:Reader+Writer 字节流: InputStream是所有字节输入流的父类 OutputSt ...
- Java基础——IO流
今天刚刚看完java的io流操作,把主要的脉络看了一遍,不能保证以后使用时都能得心应手,但是最起码用到时知道有这么一个功能可以实现,下面对学习进行一下简单的总结: IO流主要用于硬板.内存.键盘等处理 ...
- 【Java】IO流简单分辨
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827509.html Java的IO流体系十分庞大,并且体系层次稍复杂,很容易记混或记错.在此,我把平时经常用 ...
- JAVA中IO技术:BIO、NIO、AIO
1.同步异步.阻塞非阻塞概念 同步和异步是针对应用程序和内核的交互而言的. 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作 ...
- Java - 文件(IO流)
Java - 文件 (IO) 流的分类: > 文件流:FileInputStream | FileOutputStream | FileReader | FileWriter ...
- JAVA的IO运用
IO OF JAVA想写好一篇关于JAVA的IO的文章不容易,因为它涉及的东西很多难以写得有深度和有思路.我虽不才但也写.这篇文章有我个人不少的见解,虽然涉足计算机不深但我不想用一大堆这个可能那个可能 ...
- JAVA的IO学习
IO 有具体的分类: 有具体的分类:1:根据处理的数类型不同:字节流和字符流.2:根据流向不同:输入流和输出流. =============(补充字节跟字符概念区分)================= ...
随机推荐
- windows 2003 搭建一个vpn
最近从Photonvps.com 租了一台windows主机用来测试网站,512MB的内存,35GB的硬盘空间,每个月500GB的流量和2个独立IP地址.我感觉价格偏贵,不过售后服务还是蛮不错的,每次 ...
- WIN7 64位配置Oracle SQL Developer工具
在使用Oracle SQL 的过程中,很多参考资料,辅导机构,各种书籍绝大多数都是使用PL/SQL进行讲解,但是问题是PL/SQL对WIN7 64位系统支持不好,网上有各种各样的配置教程,我尝试了很多 ...
- OC基础-day04
#pragma mark - Day04_01_匿名对象 1. 如果函数有返回值 我们可以不使用变量接收返回值. 而是直接将函数写在要使用其返回值的地方. 2. 正常情况下.我创建对象. 是使用了1 ...
- jQuery 选择器【1】
jQuery 选择器 请使用我们的 jQuery 选择器检测器 来演示不同的选择器. 选择器 实例 选取 * $("*") 所有元素 #id $("#lastname&q ...
- cell的循环使用
cell的循环利用:(对cell的简单优化) 1.创建一个标示(Identifier),用于区分缓存池里的不同cell. 2.去缓存池里拿自己对应的cell,用到dequeueReusableCell ...
- nginx利用limit模块设置IP并发防CC攻击
nginx利用limit模块设置IP并发防CC攻击 分类: 系统2013-01-21 09:02 759人阅读 评论(0) 收藏 举报 来源:http://blog.xencdn.net/nginx- ...
- SQL70001: This statement is not recognized in this context.
关于错误: SQL70001: This statement is not recognized in this context. 的产生原因以及解决办法. 在SQL Server Databas ...
- 【随记】SQL Server连接字符串参数说明
废话不多说,请参见 SqlConnection.ConnectionString .
- sublime text 自动保存
perferences->Settings - User添加下面两句话: { "save_on_focus_lost": true, "atomic_save&qu ...
- Kafka源码分析-序列2 -Producer
在上一篇,我们从使用方式和策略上,对消息队列做了一个宏观描述.从本篇开始,我们将深入到源码内部,仔细分析Kafka到底是如何实现一个分布式消息队列.我们的分析将从Producer端开始. 从Kafka ...