Java中的IO流就是输入输出流,也成为读写流,实现数据的读写。处理字节数据的称作字节流,其中有关的两个抽象基类:InputStream,OutputStream;处理字符数据的称为字符流,下面也有两个抽象基类:Reader,Writter,由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。•如:InputStream的子类FileInputStream。
•如:Reader的子类FileReader;Writter的子类FileWritter
下面就以FileReader和FileWritter来实现文数据的复制拷贝为例,说明字符流读取文件时的运行机制。
package com.io.com;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyTest {
/**
* 需求:将当前工作空间下的一个文件复制到D盘
* 复制的原理:其实就是将相对目录下的数据存储到D盘的文件中。
* 步骤:
* 1、在D盘创建一个文件,用于存储空间下文件中的数据。
* 2、定义读取流和工作空间文件关联。
* 3,通过不断的读写完成读写完成数据存储
* 4,关闭资源
* 提供两种方法:一种是读取一个字符就写一个字符;另外一种是创建一个字符数组用来存放读取到的数据,存满后一次性写入
*/
public static void main(String[] args) {
//调用功能
copy_1();
copy_2();
}
//从C盘读取一个字符,就往D盘写一个字符。
public static void copy_1(){
//建立对象引用
FileReader fr=null;
FileWriter fw =null;
try {
//创建数据存放的目的地,开启续写功能,可以接着在文件末尾续写
fw =new FileWriter("D:\\RuntimeDmeo_copy.txt",true);
//与已有文件关联
fr = new FileReader("FileReaderDemo1.java");
int len =0;
//read()返回读取的字符,如果已到达流的末尾,则返回 -1
while((len=fr.read())!=-1){
//写入单个字符
/* write
public void write(int c)
throws IOException写入单个字符。
覆盖:
类 Writer 中的 write
参数:
c - 指定要写入字符的 int。 */
fw.write(len);
fw.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
//释放资源
finally{
if (fr!=null) {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fw!=null) {
try {
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//功能2,利用字符数组存放读取的数据
public static void copy_2(){
//建立对象引用
FileWriter fw=null;
FileReader fr =null;
try {
//创建目的地,文件写的位置
fw =new FileWriter("D:\\SystemDemo_copy.txt");
//创建输入流对象,实现文件关联
fr = new FileReader("FileReaderDemo1.java");
//定义一个字符数组,用户存储读取到的数据
char [] buf =new char [1024];
int len =0;
while ((len=fr.read(buf))!=-1) {
/*public void write(char[] cbuf,
int off,
int len)
throws IOException写入字符数组的某一部分
只写数组中读取到的数据,避免无效数据写入*/
fw.write(buf,0,len);
}
} catch (IOException e) {
throw new RuntimeException("读写失败");
}
//释放资源
finally{
if(fr!=null){
try {
//关闭输入流
fr.close();
} catch (IOException e) {
}
}
if (fw!=null) {
try {
//关闭输出流
fw.close();
} catch (IOException e) {
throw new RuntimeException("读写失败");
}
}
}
}
}
虽然这两种方法都能实现文件的读取,对第一种方式来讲,当复制的数据量较大时,相对于第二种来说效率就要低许多了!