在Java中,将通过不同输入输出设备(键盘,内存,显示器,网络等)之间的数据传输抽象表述为“流”,程序允许通过流的方式与输入输出设备进行数据传输。Java中的“流”都位于java.io包中,称为IO(输入输出)流。
IO流按照操作数据的不同,可以分为字节流和字符流,按照数据传输方向的不同又可分为输入流和输出流。
在I0包中,字节流的输入输出流分别用java.io.InputStream和java.io.OutputStream表示,字符流的输入输出流分别用java.io.Reader和java.io.Writer表示。
字节流:
字节流的两个顶级父类:抽象类:InputStream和OutputStream
InputStream类:
int read() | 从输入流读取一个8位的字节,把它转换为0-255之间的整数,并返回这一整数(逐个读入字节) |
int read(byte[]b) | 从输入流读取若干字节,把它们保存到参数b指定的字节数组中,返回的整数表示读取字节的数目。(读入字节数组) |
int read(byte[]b,int off,int len) | 从输入流读取若干字节,把它们保存到参数b指定的字节数组中,off 指定字节数组开始保存数据的起始下标,len表示读取的字节数目。(读入字节数组) |
void close() | 关闭此输入流并释放与该流关联的所有系统资源。 |
OutputStream类:
void write(int b) | 向输出流写入一个字节(逐个字节写入) |
void write(byte[]b) | 把参数b指定的字节数组的所有字节写到输出流。 |
void write(byte[]b,int off,int len) | 将指定byte数组中从偏移量off开始的len个字节写入输出流。 |
void flush() | 刷新此输出流并强制写出所有缓冲的输出字节。 |
void close() | 关闭此输出流并释放与此流相关的所有系统资源。 |
在操作文件时,最常见的就是从文件中读取数据并将数据写入文件,即文件的读写。针对文件的读写,JDK专门提供了两个类,分别是FilelnputStream和FileOutputStream。
//创建一个文件字节输入流
FileInputStream in = new FileInputStream("test.txt");
int b= 0;
//定义一个int类型的变量b,记住每次读取的一个字节
while(true)
b= in.read();//变量b记住读取的一个字节
if(b==-1)//如果读取的字节为-1,跳出while循环
break;
System.out.println(b);//否则将b写出
in.close();
//文件字节输出流
FileOutputStream out = new FileOutputStream("example.txt");
String str ="我是傻逼";
byte[]b = str.getBytes();
for(int i = 0;i< b.length;i++){
out.write(b[i]);
}
out.close();
IO流在进行数据读写操作时会出现异常,然而一旦遇到IO异常,IO流的close()方法将无法得到执行,流对象所占用的系统资源将得不到释放。因此,为了保证IO流的close()方法必须执行,通常将关闭流的操作写在finally代码块中。
finally{
try{
if(in!=null) //如果in不为空,关闭输入流
in.close();
}catch(Exception e){
e.printStackTrace();
}
try{
if(out!=null) //如果out不为空,关闭输出流
out.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
字节缓冲流:
在I0包中提供两个带缓冲的字节流,分别是BufferedInputStream和BufferedOutputStream,它们的构造方法中分别接收InputStream和OutputStream类型的参数作为对象。
byte[]buff = new byte[1024]; //定义一个字节数组,作为缓冲区
int len; //定义一个int类型的变量len记住读取读入缓冲区的字节数
long begintime = System.currentTimeMillis();
while((len = in.read(buff))!=-1){ //判断是否读到文件末尾
out.write(buff,0,len); //从第一个字节开始,向文件写入len个字节
}
//创建一个带缓冲区的输入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("src.txt"));
//创建一个带缓冲区的输出流
BufferedoutputStream bos = new BufferedOutputStream(new FileOutputStream("des.txt"));
int len;
while((len = bis.read())!=-1){
bos.write(len);
}
字符流:
字节流在读写文件时操作的都是字节,所以就有字符流,在程序中操作字符。
字符流的两个顶级父类:抽象类:Reader和Writer
//创建一个PileReader对象用来读取文件中的字符
FileReader reader=new FileReader("reader.txt");
int ch;//定义一个变量用于记录读取的字符
while((ch=reader.read())!=-1){//循环判断是否读取到文件的末尾
system.out.print1n((char)ch);//不是字符流末尾就转为字符打印
}
reader.close();//关闭文件读取流,释放资源
FileReader reader= new FileReader("sre.txt");
Filewriter writer =new Filewriter("des.txt");
//创建一个Buf feredReader缓冲对象
BufferedReader br=new BufferedReader(reader);
//创建一个Bufferdwriter缓冲区对象
BufferedWriter bw=new BufferedNriter(writer);
String str;
while((str br.readline())!=null){
bw.write(str);
bw.newlrine();
}
br.close();
bw.close();
转换流:
在JDK中提供了两个类可以将字节流转换为字符流,它们分别是InputStreamReader和OutputStreamWriter。
OutputStreamWriter是Writer的子类,它可以将一个字节输出流转换成字符输出流,方便直接写入字符。
InputStreamReader是Reader的子类,它可以将一个字节输入流转换成字符输入流,方便直接读取字符。
FileInputsStream in w,nevw Fileinputs-ream("are*xt");//创建字节输入流
//将字节流输入转换成字符输入流
InputStreamReader isr =new InputstreamReader(in);
BufferedReader br =new BufferedReader(isr);//赋予字符流对象缓冲区
FileOutputStream out =new FileoutputStream("des.txt");
//将字节输出流转换成字符输出流
OutputStreamyriter osw =new OutputStreamwriter(out);
BufferedNriter bw = new Bufferedmriter(osw);//赋予字符输出流对象缓冲区
String line;
while((line=br.readLine())!=null){//判断是否读到文件末尾
bw.write(line);//输出读取到的文件
}
br.close();
bw.close();
File类:
File类构造方法:
File(String pathname) | 通过指定的一个字符串类型的文件路径来创建一个新的File对象 |
File(String parent,String child) | 根据指定的一个字符串类型的父路径和一个字符串类型的子路径 (包括文件名称)创建一个File对象 |
File(File parent,String child) | 根据指定的File类的父路径和字符串类型的子路径(包括文件名称)创建一个File对象 |
File类常用方法: