io流概述
Java.io有5个类和1个接口:
5个类:File OutputStream InputStream Writer Reader
1个接口:Serializable
io流分为三个部分:
1、流式部分――IO的主体部分
2、非流式部分――主要包含一些辅助流式部分的类,如:File类、RandomAccessFile类和FileDescriptor等类
3、其他类--文件读取部分的与安全相关的类,如:SerializablePermission类,以及与本地操作系统相关的文件系统的类,如:FileSystem类和Win32FileSystem类和WinNTFileSystem类。(未深学习)
主要的类:
1. File(文件特征与管理):用于文件或者目录的描述信息,例如生成新目录,修改文件名,删除文件,判断文件所在路径等。
2. InputStream(二进制格式操作):抽象类,基于字节的输入操作,是所有输入流的父类。定义了所有输入流都具有的共同特征。
3. OutputStream(二进制格式操作):抽象类。基于字节的输出操作。是所有输出流的父类。定义了所有输出流都具有的共同特征。
4.Reader(文件格式操作):抽象类,基于字符的输入操作。
5. Writer(文件格式操作):抽象类,基于字符的输出操作。
6. RandomAccessFile(随机文件操作):一个独立的类,直接继承至Object.它的功能丰富,可以从文件的任意位置进行存取(输入输出)操作。
字节流
1、输入和输出流
首先,字节流要进行读和写,也就是输入和输出,所以它有两个抽象的父类InputStream、OutputStream。
InputStream抽象了应用程序读取数据的方式,即输入流。
OutputStream抽象了应用程序写出数据的方式,即输出流。
2、读写结束
在字节流中当读写结束,达到文件结尾时,称为EOF = End或者读到-1就读到结尾。
3、输入流基本方法
通过文本文件上输入内容,这个过程键盘充当的就是输入流,而不是输出流。(键盘的功能是将内容输入到系统,系统再写入文件上)
int b = in.read(); //读取一个字节无符号填充到int
in.read(byte[] buf); //读取数据填充到字节数组buf中
in.read(byte[] buf,int start, int size)
输出流基本方法
方法为write(),可以将此方法与输入read()方法一 一对应
out.write(int b)//
out.write(byte[] buf)//写入流
out.write(byte[] buf, int start,int size) //字节数组buf从start位置开始写size长度的字节到流
使用FileInputStream
read()方法读取文件
public static void printHex(String fileName) throws IOException{
//把文件作为字节流进行读操作
FileInputStream in=new FileInputStream(fileName);
int b;
int count=0;//计数读到的个数
while((b=in.read())!=-1){
if(b<=0xf){
//单位数前面补0
System.out.println("0");
}
System.out.print(Integer.toHexString(b& 0xff)+" ");
if(++count%10==0){
System.out.println();
}
}
in.close();//关闭流
}
注:
·FileInputStream()构造函数可以通过文件名(String)也可以通过File对象。上面的案例是使用文件名来构造的。
·(b=in.read())!=-1 通过读到-1来判断是否读到文件结尾。
·in.close() 使用完IO流的对象一定要关闭流
使用read(byte[] buf,int start, int size)方法读取文件
一次性读取
public static void printHexByBytes(String fileName) throws IOException{
FileInputStream in=new FileInputStream(fileName);
byte[] buf=new byte[20*1024];//20k字节数组
//一次性读完
int count=in.read(buf, 0, buf.length);
int j=1;
for(int i=0;i<count;i++){
if((buf[i]&0xff)<=0xf){
//单位数前面补0
System.out.print("0");
}
System.out.print(Integer.toHexString(buf[i]&0xff)+ " ");
if(j++%10==0){
System.out.println();
}
}
in.close();
}
}
(方法摘要用法)
(构造方法)
总结:
输出流是往存储介质或数据通道写入数据
输入流是从存储介质或数据通道中读取数据
关于流的特性:
1、先进先出,最先写入输出流的数据最先被输入流读取到。
2、顺序存取,可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。(RandomAccessFile可以从文件的任意位置进行存取(输入输出)操作)
3、只读或只写,每个流只能是输入流或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,对输出流只能进行写操作。在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流。
·输入和输出流
字节流要输入和输出,则它有两个抽象的父类InputStream、OutputStream。
InputStream抽象了应用程序读取数据的方式 (输入流)
OutputStream抽象了应用程序写出数据的方式(输出流)
·读写结束
在字节流中当读写结束,达到末尾时,EOF = End或到-1结尾。
eg: