一,IO
1,IO
IO流用来处理设备之间的数据传输;IO就是输入(Input)和输出(Output),在学习java.io包汇总的一些类,这些类用来完成java程序中的输入输出工作
2,输入输出流
在Java程序读取写出数据时,需要使用输入流和输出流
输入流(InputStream)用来读取数据,InputStream的子类可以从各种数据源中读取数据
输出流(OutputStream)用来写出数据,OutputStream的子类可以像各种数据目的地写出数据
3,FileInputStream读取文件
创建FileInputStream对象,关联一个文件
调用read()方法可以读取一个字节,如果读到末尾返回-1;
调用close()方法关闭流,释放资源;
4,FileOutputStream写出文件
创建FileOutputStream对象,关联一个文件,文件如果不存在就创建,文件存在则清空,如果需要追加,构造函数中多传一个true;
调用write()方法可以写出一个字节;
调用close()方法关闭流,释放资源;
5,拷贝文件;方式:
*1,逐个字节:使用FileputStream.read()和FileOutputStream.write(int)
循环读取,读取到一个字节,判断是否是文件末尾,不是末尾就写出
由于操作文件速度较慢,逐个字节读取效率很低;
练习:
package cn.chunshentaike;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Fos {
public static voidmain(String[] args) throws IOException {
//创建输入流,关联file.txt
FileInputStreamfis = new FileInputStream("file.txt");
//创建输出流,关联test.txt
FileOutputStreamfos = new FileOutputStream("test.txt",true);
//定义变量
int i;
//使用输入流循环读取文件,如果不是文件末尾
while((i= fis.read())!= -1)
//写入输出流中
fos.write(i);
//关闭流
fos.close();
fis.close();
}
}
***2,自定义数组:使用FileInputStream.read(byte[]) FileOutputStream.write(byte[] ,int,int)
自定义一个数组当做字节缓冲区,一次拷贝一个数组(多个数据),一次写出一个数数组,减少了对文件的操作,提高了效率;
练习;
package cn.itcast;
import java.io.FileInputStream;
publicclass Homework2 {
publicstaticvoid main(String[] args)throws IOException {
// 创建输入流和输出流TODOAuto-generated method stub
FileInputStreamfis = new FileInputStream("桃花庵歌.mp3");
FileOutputStreamfos = new FileOutputStream("demo1.mp3");
//创建数组,用来当做缓冲区,越大越快越占内存;
byte[] b =newbyte[1024];
//定义变量,用来记住每次读取多少个,
int i;
//定义时间,记录开始时间
long time = System.currentTimeMillis();
//从输入流中读取数据到b中,i记住读取多少个
while((i=fis.read(b)) != -1)
//将b中数据写出,写出i个
fos.write(b,0,i);
//记住结束时间
long time1 = System.currentTimeMillis();
//打印拷贝所用时间
System.out.println(time1-time+"毫秒");//21毫秒
fis.close();
fos.close();
}
}
***3,自带缓冲区:使用BufferedInputStream.read()和BufferedOutputStream.write(int);
Java提供了带有缓冲功能的类
使用BufferedInputStream.来读取一个字节,其内部会先读取一批进行缓冲,返回给程序一个,程序再读取时直接在缓冲区内读取,
使用BufferedOutputStream来写出一个字节,这个字节不会直接写出到文件,是写出到缓冲区中,直到缓冲区中写满或者关闭流时才会写到文件;
这样的机制减少了文件操作,提高效率;
import java.io.BufferedInputStream;
publicclass Homework3 {
publicstaticvoid main(String[] args)throws IOException {
//使用自带缓冲区输入,输出流;
BufferedInputStreambis = new BufferedInputStream(new FileInputStream("桃花庵歌.mp3"));
BufferedOutputStreambos = new BufferedOutputStream(new FileOutputStream("demo3.mp3"));
int i;//定义变量,记住读取的个数;
//
long time = System.currentTimeMillis();
//循环,将
while((i = bis.read())!=-1)
bos.write(i);
long time1 = System.currentTimeMillis();
System.out.println("拷贝使用的时间是>>>"+(time1-time)+"毫秒");//拷贝使用的时间是>>>96毫秒
bos.close();
bis.close();
}
}
6,标准化代码:
使用IO流的时候必须关闭流,而使用IO流的代码通常都是会抛出异常的,如果程序运行过程中某行代码出现异常,下面代码不会再执行;
为了避免关闭流的代码被异常中断,关闭流的代码都是写在finally代码块中的;
而如果有多个流需要关闭,每个关闭流的代码都要单独放在try和finally中,因为关闭流的代码通常也会抛出异常;
练习:
package cn.itcast;
import java.io.BufferedInputStream;
publicclass EncryptDemo {
publicstaticvoid main(String[] args)throws IOException {
// TODO Auto-generated method stub
BufferedInputStreambis = null;
BufferedOutputStreambos = null;
try {
bis= new BufferedInputStream(new FileInputStream("桃花庵歌.mp3"));
bos= new BufferedOutputStream(new FileOutputStream("demo9.mp3"));
int i;
long start = System.currentTimeMillis();
while((i = bis.read())!=-1)
bos.write(i);
long end = System.currentTimeMillis();
System.out.println(end-start);
} finally {
try {
if(bis !=null)
bis.close();
}finally {
if(bos !=null)
bos.close();
}
}
}
}