[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:根据流向不同:输入流和输出流. =============(补充字节跟字符概念区分)================= ...
随机推荐
- swift 截取字符串
- iOS10新增Api详解
1.SiriKit SiriKit的功能非常强大,支持音频.视频.消息发送接收.搜索照片.预订行程.管理锻炼等等.在用到此服务时,siri会发送Intent对象,里面包括用户的请求和各种数据,可以对这 ...
- 关于通过bindService启动的service,在unbindService后service是否继续运行的讨论
有三种情况:如果直接使用服务,则没有必要进行绑定,但是如果要使用服务里面的方法,则要进行绑定.具体的启动情况有下: 1.当启动时,单独调用bindService方法,在unbindService后,会 ...
- Jmeter软件测试3--发送二进制报文
一直用Jmeter测试post接口,但报文信息都是明文方式,今天测试兄弟求助二进制报文如何使用Jmeter测试,查看了项目源码,报文中不仅采用二进制,而且还用java.util.zip进行了压缩,从晚 ...
- Ninject 自动注册
首先这个问题我纠结了很久,看到autofac强大的自动注册功能,我感觉Ninject弱爆了,不过Ninject自带属性注册,感觉很方便,所以还在纠结Ninject 传统的绑定方式 public cla ...
- js如何获取一个月的天数 data javascript
js如何获取一个月的天数 function days(year,month){ var dayCount; now = new Date(year,month, 0); dayCount = now. ...
- List<Map<String, Object>>相关
2016年8月6日13:53:00 --------------------------- List<Map<String, Object>> List集合新增列 则需要: L ...
- xadmin的插件机制
xadmin的视图方法中如果加了@filter_hook 标记的都可以作为插件的钩子函数. 例如在ListAdminView类中有许多加了上述标记的方法, @filter_hook def get_c ...
- The largest prime factor(最大质因数)
1. 问题: The prime factors of 13195 are 5, 7, 13 and 29.What is the largest prime factor of the number ...
- 新年之际,盘点一些APP开发技巧
(原文:Reader Submissions - New Year's 2015 作者:Mattt Thompson 译者:培子 校对:蓝魂) 回顾过去一年发生在我们身边的事情时,有一点不得不提:对苹 ...