Java程序中,对于数据的输入/输出操作以 “流(stream)” 的方式进行。 java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。
一、原理
1.输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中
2.输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中。
二、流的体系结构
三、字符流实现文本文件传输
说明:如果使用单元测试,文件相对路径为当前module。
如果使用main()测试,文件相对路径为当前工程
@Test
public void test3(){
FileReader fr = null;
FileWriter fw = null;
try {
//1.File类的实例化
//sorFile源文件 outFile目标文件
File sorFile = new File("Hello.txt");
File outFile = new File("Hi.txt");
//2.提供具体的流
fr = new FileReader(sorFile);
fw = new FileWriter(outFile);
//3.读/写操作
char[] cbuf = new char[1024];
int len;
while ((len= fr.read(cbuf))!=-1){
// String str = new String(cbuf,0,len);
fw.write(cbuf,0,len);
}
System.out.println("文件复制成功");
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.关闭流
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
四、字节流实现非文本文件传输(如.jpg)
@Test
public void test4(){
FileInputStream fis = null;
FileOutputStream fos = null;
try {
//1.File类的实例化
File sorFile = new File("1374225513544.jpg");
File outFile = new File("an1374225513544.jpg");
//2.提供具体的流
fis = new FileInputStream(sorFile);
fos = new FileOutputStream(outFile);
//3.输入/输出操作
byte[] bytes = new byte[1024];
int len;
while ((len=fis.read(bytes))!=-1){
fos.write(bytes,0,len);
}
System.out.println("图片复制成功");
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.关闭流
try {
if (fis!=null)
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (fos!=null)
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果:
五、字节型缓冲流实现非文本文件传输
public void copyFileWithBuffered(String sorFile,String outFile){
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
//1.File文件实例化
File ansorFile = new File(sorFile);
File anoutFile = new File(outFile);
//2.1提供具体的流---造节点流
FileInputStream fis = new FileInputStream(ansorFile);
FileOutputStream fos = new FileOutputStream(anoutFile);
//2.2造缓冲流
bis = new BufferedInputStream(fis);
bos = new BufferedOutputStream(fos);
//3.读入/写出操作
byte[] bytes = new byte[5];
int len;
while ((len=bis.read(bytes))!=-1){
bos.write(bytes,0,len);
}
System.out.println("复制成功!");
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.关闭流
//说明:关闭外层流的同时,内层流会自动关闭。
try {
if (bis!=null)
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (bos!=null)
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Test
public void test(){
String sorFile="1374225513544.jpg";
String outFile ="new1374225513544.jpg";
long start = System.currentTimeMillis();
copyFileWithBuffered(sorFile,outFile);
long end = System.currentTimeMillis();
System.out.println("复制花费时间:"+(end-start));
}
这里可以看到此次运行所花费时间:
说明:缓冲流提高了读、写操作的速度。处理流,就是“套接”在已有流的基础上。
六、字符型缓冲流实现文本文件传输
@Test
public void test5(){
BufferedReader br = null;
BufferedWriter bw = null;
try {
br = new BufferedReader(new FileReader("Hello.txt"));
bw = new BufferedWriter(new FileWriter("sayHi.txt"));
char[] cbuf = new char[5];
int len;
while ((len=br.read(cbuf))!=-1){
bw.write(cbuf,0,len);
}
System.out.println("文本复制成功!");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br!=null)
br.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (bw!=null)
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果: