[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:根据流向不同:输入流和输出流. =============(补充字节跟字符概念区分)================= ...
随机推荐
- WinEdt打开UTF-8文件乱码问题——ctex[转]
原来这么简单,mark一下! [转自:http://fstang.diandian.com/post/2012-04-17/40030401020] 其实这个问题网上文章已经有一大堆了...我只是记录 ...
- iOS SDwebImage 使用说明
SDWebImage托管在github上.https://github.com/rs/SDWebImage 这个类库提供一个UIImageView类别以支持加载来自网络的远程图片.具有缓存管理.异步下 ...
- __init__ __new__区别
请运行代码: class A: def __init__(self): print "A.__init" def __new__(self): print "A.__ne ...
- mongo数据库使用小结
db.userId5555.aggregate({$unwind:"$tcjl"},{$match:{"_id":"0e549864-2a56-43c ...
- python模块学习 hashlib
一.hashlib概述 涉及加密服务:14. Cryptographic Services 其中 hashlib是涉及安全散列和消息摘要,提供多个不同的加密算法借口,如SHA1.SHA224.SHA2 ...
- 虚拟化技术与"云"
虚拟化技术: 如网站在某一时间访问量大,平时访问量少,如果一直保持大量的服务器提供服务,显示效率好低,浪费资源,在 不增减服务器,存储设备,网络等实际物理设备,而是利用软件将这些物理设备虚拟化,在有必 ...
- 关于webapp的一个webframe问题
最近重启ios webapp的项目,将之前的框架拿过来发现出现了错误,错误出现在写JSAlart控件的WebFrame上,xcode会报WebFrame是未定义的错误.由于之前使用的是ios5的 sd ...
- Apache server-status
1.找到apache配置文件:httpd.conf 2.打开模块: LoadModule status_module modules/mod_status.so 3.在文件末尾处加上以下代码: ...
- Objective-C 入门(给新人的)
http://www.hengxinsoft.com/2010/12/objective-c-%E5%85%A5%E9%97%A8%EF%BC%88%E7%BB%99%E6%96%B0%E4%BA%B ...
- PAT (Basic Level) 1001害死人不偿命的(3n+1)猜想 (15)
卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下去,最后一定在某一步得到n=1.卡拉兹在1950年的世界数 ...