1.3.4 Java I/O系统
IO(输入/输出)指的是计算机与外部世界,或者一个程序与计算机的其余部分之间的接口,它对于任何计算机系统都非常关键。
1.3.4.1 概述
流(Stream)
只能以事先规定好的顺序被读取一次的数据的一个序列
流的特性
- 含有流质—在计算机中,流质就是
数据
- 方向性—方向就是
读或写
1.3.4.2 流的分类
- 按照数据流的方向
- 输入流—继承抽象类
InputStream
或Reader
- 输出流—继承抽象类
OutputStream
或Writer
- 输入流—继承抽象类
- 按照处理数据的最小单元
- 字节流— 以
byte
为最小单位 - 字符流—以
char
为最小单位
- 字节流— 以
- 按照功能
- 节点流(低级流)—节点流是直接可以从/向一个特定的数据源读/写数据的流
- 操作流(高级流)—操作流不直接连接到设备,而是连接到已存在的流之上,通过对数据的处理为程序提供更强大的读写功能
1.3.4.3 I/O操作步骤
- 选择流
- 建立流(new)
- 操作流
关闭流
操作示例
输出流
String str = "窗前明月光,疑是地上霜。";//要输出的字符串 FileWriter fw = null;//选择流,这里是输出流,所以是Writer, //输出目标是文件,所以用FileWriter try { fw = new FileWriter("e:/poem.txt");//建立流 fw.write(str);//操作流,这里调用wirite方法将字符串写到文件中 } catch (IOException e) { e.printStackTrace(); } finally { if (fw!=null) { try { fw.close();//关闭流 } catch (IOException e) { e.printStackTrace(); } } }
输入流
String poemStr = ""; FileReader fr = null;//选择流,输入流选择Reader //数据来源是File所以是FileReader try { fr = new FileReader("poem.txt");//建立流 int c = 0;//FileReader的read()方法返回的是int类型 //不返回char的原因是用int作为返回类型可以用-1表示已读完数据 while ((c=fr.read())!=-1) { poemStr += (char)c;//将读出的字符转换并进行拼接 } System.out.println(poemStr);//控制台打印验证 } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (fr!=null) { try { fr.close();//关闭流 } catch (IOException e) { e.printStackTrace(); } } }
字节文件拷贝
FileInputStream fin = null;//选择流
FileOutputStream fou = null;//选择流
try {
fin = new FileInputStream("e:/poem.txt");//建立流
fou = new FileOutputStream("d:/poemCopy.txt");//建立流
byte[] b = new byte[1024];//做缓存
int len = 0;//记录每次有效读取多少个字节(关键是最后一次)
while ((len=fin.read(b))!=-1) {
fou.write(b,0,len);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (fin!=null) {
try {
fin.close();//关闭流
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (fou!=null) {
try {
fou.close();//关闭流
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4. 对象的序列化
//前置条件要序列化的对象必须实现Serializable接口,这也是JavaBean的规范之一
StudentBean stu = new StudentBean("Coder_Watson");
//这里随便写了一个实现Serializable接口的类
ObjectOutputStream oos = null;//选择流
try {
oos = new ObjectOutputStream(
new FileOutputStream("student.data"));
//建立流,这里进行了流的对接
oos.writeObject(stu);//操作流,调用writeObject(Object o)方法写入
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (oos!=null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
5. 对象的反序列化
StudentBean theStu = null;//用这个来接反序列化的对象
ObjectInputStream ois = null;//选择流
try {
ois = new ObjectInputStream(
new FileInputStream("student.data"));//建立流,这里也进行了流的对接
theStu = (StudentBean) ois.readObject();
//操作流,调用readObject()方法
System.out.println(theStu.getName());
//验证反序列化是否成功,控制台应打印出Coder_Watson
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (ois!=null) {
try {
ois.close();//关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
}