JAVA IO 学习
Java流的分类
1.输入/输出流
输入流:只能向其读数据,不能写。
输出流:只能向其写数据,不能读。
所谓的输入输出都是相对应用程序而言的。
2.字节流/字符流
单位不同,字节流操作8位,字符流操作16位,2倍关系。
3.节点流/处理流
按照流的角色来分的。
节点流:从/向特定的IO设备读/写的流,也称低级流。
处理流:对于一个已经存在的流进行连接或包装,通过包装后的流来实现读写功能,也称高级流。
Java流概念模型
Java.io包里面有40多个类,看上去很凌乱负责,但实际有规律。所有类都继承自4个类,
|
InputStream |
|
OutputStream |
|
Reader |
|
Writer |
所有类的结构图如下:

其实是按字节流/字符流来分的。
上述4个类是抽象类的主要方法。
读,InputStream/Reader
有几个主要的方法:
Int read()读取单个字节/字符。
Int read(byte[] b/char[] c),读取给定数组的字节/字符。
Int read(byte[] b/char[] c, int off, int len)从字节/字符组中的off位置,读取len长度。
代码:
以FileInputStream和FileReader为例子:
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
FileInputStream fis = new FileInputStream("TestFile1.java");
byte[] bbuf = new byte[1024];
int hasRead = 0;
while((hasRead = fis.read(bbuf))>0){
System.out.print(new String(bbuf,0,hasRead));
}
fis.close();
}
这里byte数组的大小是1024,如果很小,或者为奇数的话,可能会出现读出来的是乱码。
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
try {
fr = new FileReader("TestFile1.java");
char[] cbuf = new char[32];
int hasRead = 0;
while ((hasRead = fr.read(cbuf)) > 0) {
System.out.print(new String(cbuf, 0, hasRead));
}
} catch (IOException e) {
e.printStackTrace();
}
finally{
fr.close();
}
}
写,OutputStream/Writer
主要的方法:
Void write(c)写入指定的c个字节/字符。
Void write(byte[] b/char[] c)写入字节/字符数组中的数据。
Void write(byte[]/char[] buf, int off, int len)从字节/字符数组中的off位置写入len长度到输出流。
由于字符流以字符为单位,Writer可以用字符串来代替字符数组,于是有了2个新的方法:
Void write(string s)写入字符串s到流。
Void write(string s, int off, int len)从字符串s的off位置处写入len长度到流。
以FileOutputStream和FileWriter为例子:
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(
" TestFile1.java");
fos = new FileOutputStream(
" NewFile.txt");
byte[] bbuf = new byte[1024];
int hasRead = 0;
while ((hasRead = fis.read(bbuf)) > 0) {
fos.write(bbuf, 0, hasRead);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
fis.close();
fos.close();
}
}
FileWriter:
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileWriter fw = null;
try {
fw = new FileWriter("newFile2.txt");
fw.write("静夜思\r\n");
fw.write("床前明月光,\r\n");
fw.write("疑是地上霜,\r\n");
fw.write("举头望明月,\r\n");
fw.write("低头思故乡。\r\n");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
fw.close();
}
}
Java序列化和反序列化
序列化即将对象转换成数据(二进制或xml文本),反序列化则相反。
Java序列化/反序列化用到的类:ObjectOutputStream/ObjectInputStream,它们都是处理流对象,接受节点流FileOutputStream/FileInputStream.
序列化/反序列化要求被处理的类继承Serializable接口。
例子:
//Person 类
public class Person implements java.io.Serializable { public String Name; public int Age; public Person(String name,int age){
this.Name=name;
this.Age=age;
}
} public class TestSerialization { /**
* @param args
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws ClassNotFoundException {
// TODO Auto-generated method stub /**
* Serialize
*/
try {
ObjectOutputStream op = new ObjectOutputStream(
new FileOutputStream(
"Person.txt"));
Person p = new Person("Jackson", 24);
Person p2 = new Person("Anne", 23);
op.writeObject(p);
op.writeObject(p2);
System.out.println("person info: name is " + p.Name + " ;age is: "
+ p.Age);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} /**
* DeSerialize
*/
try {
ObjectInputStream ip = new ObjectInputStream(new FileInputStream(
"Person.txt"));
Person p = (Person) ip.readObject();
Object o;
while ((o = ip.readObject()) != null) {
Person pp = (Person) o;
System.out.println("name: " + pp.Name + ",Age:" + pp.Age);
} } catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
JAVA IO 学习的更多相关文章
- Java IO学习笔记:概念与原理
Java IO学习笔记:概念与原理 一.概念 Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了 ...
- Java IO学习笔记总结
Java IO学习笔记总结 前言 前面的八篇文章详细的讲述了Java IO的操作方法,文章列表如下 基本的文件操作 字符流和字节流的操作 InputStreamReader和OutputStreamW ...
- Java IO学习笔记三
Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...
- Java IO学习笔记二
Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...
- Java IO学习笔记一
Java IO学习笔记一 File File是文件和目录路径名的抽象表示形式,总的来说就是java创建删除文件目录的一个类库,但是作用不仅仅于此,详细见官方文档 构造函数 File(File pare ...
- java IO 学习(三)
java IO 学习(一)给了java io 进行分类,这一章学习这些类的常用方法 一.File 1.创建一个新的File的实例: /** * 创建一个新的File实例 */ File f = new ...
- Java IO学习笔记一:为什么带Buffer的比不带Buffer的快
作者:Grey 原文地址:Java IO学习笔记一:为什么带Buffer的比不带Buffer的快 Java中为什么BufferedReader,BufferedWriter要比FileReader 和 ...
- Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer
作者:Grey 原文地址:Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer ByteBuffer.allocate()与ByteBuffer.allocateD ...
- Java IO学习笔记三:MMAP与RandomAccessFile
作者:Grey 原文地址:Java IO学习笔记三:MMAP与RandomAccessFile 关于RandomAccessFile 相较于前面提到的BufferedReader/Writer和Fil ...
- Java IO学习笔记四:Socket基础
作者:Grey 原文地址:Java IO学习笔记四:Socket基础 准备两个Linux实例(安装好jdk1.8),我准备的两个实例的ip地址分别为: io1实例:192.168.205.138 io ...
随机推荐
- php中关于Map热点的运用
给图像使用map标签,可以给图像的某个部分建立超连接 一般情况下用在图片上,如:<img src="Images/banner.gif" width="780&qu ...
- jquery 插件
1 jquery.slimscroll.min.js:虚拟滚轴 2 jquery.steps.js:步骤(注册下一步) 3 jquery-barcode.js:条形码
- 拓展Yii Framework(易框架)
1.拓展yii 此文针对Yii1.1.15而写,请注意甄别你的Yii Framework 版本. 拓展yii是开发期间常见的代码处理方式.例如,你写一个新的controller(业务控制器),你通过继 ...
- SSH开源框架的优缺点
js+servlet+javabean的开发模式需要写很多的重复代码,比如固定的doGet()方法,而且它的控制跳转不灵活,往往一个问题处理需要两个.java文件,而且当采用MVC模式开发时有很大的耦 ...
- Ext.Net 学习随笔 003 超链接按钮
HyperlinkButton() 1.不带图标的普通超链接按钮 @(X.HyperlinkButton() .Text("简单样式") .OnClientClick(" ...
- [转] "self = [super init]"的解释与潜藏bug
Objective-C的推荐init方法写法如下: - (id) init { if(self = [super init]) { //为子类增加属性进行初始化 } return self; } 这里 ...
- catalog备份数据库及RMAN存储脚本
环境说明: 提前配置好两个库的监听与tnsnames.oraIP:10.100.25.13 为目标数据库 IP:10.100.25.14 为恢复目录数据库(catalog database) 以下操 ...
- 基于CWMP(TR069)协议ACS服务器的搭建
Linux上安装openacs Openacs的安装分为四大步: 1.安装jdk 2.安装jboss 3.安装mysql 4.部署openacs JDK简介 Java DevelopmentKit(J ...
- HTTP head 详解 (转)
HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内 容请参考RFC2616.HTTP协议采用了请求/响应模型.客 ...
- js实现页面局部弹窗打印
原文出自:http://www.haorooms.com/post/css3media 在网页中经常看到有打印功能,点击之后,只针对特定区域进行的打印.网上看了一下,大体上有2中实现方法,一种是用cs ...