Java的IO流:
1. 字节流的抽象基类
InputStream、OutputStream
2. 字符流的抽象基类
Read、Writer
注:
由这四个类派生出来的子类名臣都是其父类名作为子类的后缀
如InputStream的子类FileInputStream
如Reader的子类FileRader
先来了解一下InputStream、OutputStream的子类分部情况:
在来了解一下Reader、Writer的子类分部情况
Java程序通过流来完成输入/输出。流是生产或消费信息的抽象。流通过Java的输入/输出系统与物理设备链接。尽管与它们链接的物理设备不尽相同,所 有流的行为具有同样的方式。这样,相同的输入/输出类和方法适用于所有类型的外部设备。这意味着一个输入流能够抽象多种不同类型的输入:从磁盘文件,从键 盘或从网络套接字。同样,一个输出流可以输出到控制台,磁盘文件或相连的网络。流是处理输入/输出的一个洁净的方法,例如它不需要代码理解键盘和网络的不 同。Java中流的实现是在java.io包定义的类层次结构内部的。
一、输入/输出流概念
输入/输出时,数据在通信通道中流动。所谓“数据流(stream)”指的是所有数据通信通道之中,数据的起点和终点。信息的通道就是一个数据流。只要是数据从一个地方“流”到另外一个地方,这种数据流动的通道都可以称为数据流。
输入/输出是相对于程序来说的。程序在使用数据时所扮演的角色有两个:一个是源,一个是目的。若程序是数据流的源,即数据的提供者,这个数据流对程序来说就是一个“输出数据流”(数据从程序流出)。若程序是数据流的终点,这个数据流对程序而言就是一个“输入数据流”(数据从程序外流向程序)。
二、输入/输出类
在java.io包中提供了60多个类(流)。
1.从功能上分为两大类:输入流和输出流。
2. 从流结构上可分为字节流(以字节为处理单位或称面向字节)和字符流(以字符为处理单位或称面向字符)。字节流的输入流和输出流基础是InputStream和OutputStream这两个抽象类,字节流的输入输出操作由这两个类的子类实现。字符流是Java1.1版后新增加的以字符 为单位进行输入输出处理的流,字符流输入输出的基础是抽象类Reader和Writer。
一个简单的字符流操作:拷贝文本文件
package com.wangjing;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
*
*@author wJing
*time:2014-2-10 22:05:29
*/
public class CopyFileDemo {
publicstatic void main(String[] args) {
copy1();
}
//从C盘读取一个字符就往d盘写
publicstatic void copy1() {
try{
FileWriterfw = new FileWriter("d:\\demo.txt",true);
FileReaderfr = new FileReader("c:\\demo.txt");
intch = 0;
while((ch= fr.read()) != -1) {
fw.write(ch);
}
fr.close();
fw.close();
}catch (IOException e) {
e.printStackTrace();
}
}
publicvoidcopy2() {
FileWriterfw = null;
FileReaderfr = null;
try{
fw= new FileWriter("d:\\demo.txt",true);
fr= new FileReader("c:\\demo.txt");
char[]buf = new char[1024];
intlen = 0;
while((len= fr.read(buf)) != -1) {
fw.write(buf,0, len);
}
}catch(IOException e) {
thrownew RuntimeException(e);
}finally {
if(fr!= null) {
try{
fr.close();
}catch (IOException e) {
e.printStackTrace();
}
}
if(fw!= null) {
try{
fw.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
一个简单的字节流操作,拷贝图片
package com.wj.stream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
*
*@author wJing
*time :2014-2-11 22:26:59
*
* 拷贝图片资源
*/
public class CopyPic {
publicstatic void main(String[] args) {
FileOutputStreamfos = null;
FileInputStreamfis = null;
try{
fis= new FileInputStream("d:\\a.jpg");
fos= new FileOutputStream("d:\\1_copy.jpg");
byte[]buf = new byte[1024];
intlen = 0;
while((len= fis.read(buf)) != -1) {
fos.write(buf,0, len);
}
}catch (Exception e) {
thrownew RuntimeException("复制文件出错!!!");
}finally {
if(fis != null) {
try{
fis.close();
}catch (IOException e) {
e.printStackTrace();
}
}
if(fos != null) {
try{
fos.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
总结:
流操作的基本规律:
最痛苦的就是流对象太多,不知道该用哪一个
通过三个明确来完成:
1. 明确源和目的
源:输入流。InputStream Reader
目的:输出流。OutputStream Writer
2. 操作的数据是否是纯文本
是:字符流
不是:字节流
3. 当体系明确后,在明确要使用哪个具体对象
通过设备进行区分:
源设备:内存,硬盘,键盘
目的设备:内存,硬盘,控制台