1 什么是IO
Java中的IO操作主要是指使用java进行输入输出的操作。Java中的所有IO机制都是通过数据流进行输入输出的。这些数据流表示了字符或者字节数据的流动序列。
Java中处理IO的软件包主要是java.io和java.nio。前者主要用来处理流IO,后者处理块IO。
java.nio主要是利用通道和缓存区来提高IO的操作效率。
Java的整个IO体系模型的设计采用的是装饰者Decorator模式,使用者可以动态的装配这些Stream。
比如:
FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\io\\aaa.txt"); BufferedInputStream bis = new BufferedInputStream(fis);
上面就是组合使用了FileInputStream 和 BufferedInputStream
2 流的基本概念
数据流是一段连续不断的数据的集合,java中对输入输出的操作抽象成了对流的操作。
这样,在处理输入流时,不必考虑输入设备(内存,磁盘等);在处理输出流时,不必考虑输出设备(内存,磁盘等)。
流的分类
流按照读写方向可以分为:输入流,输出流
流按照处理最小单元分为:字节流,字符流
3 标准输入/输出流
java程序可以通过命令行在console处与外界进行简单的交互。主要的类就是System类。
在System类中,
public final static InputStream in = null;
public final static PrintStream out = null;
public final static PrintStream err = null;
System类不能实例化,可以直接使用。每次main方法被执行时,会自动生成上面的三个对象。
System.in对应的是InputStream对象
/**
* 标准输入
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
int b;
System.out.println("please input");
while((b=System.in.read())!=-1){
System.out.print((char)b);
}
}
System.out和System.err都是PrintStream对象
4 IO体系架构
java.io中最为重要的是5个类和1个接口:5个类是指:InputStream,OutputStream,Reader,Writer,File;一个接口是指Serializable接口。可以看到类像是成对显示的,InputStream和OutputStream,Reader和Writer。基于此,java IO主要分为三个层次:
- 流式部分:也即IO的主体部分
- 非流式部分:主要包括一些辅助流式部分的类,比如File,RandomAccessFile
- 其他部分:文件读取部分的与安全相关的类,比如FileSystem
流式部分主要类
对文件操作的类:
FileInputStream,FileOutputStream,FileReader,FileWriter
对管道进行操作的类:
PipedInputStream,PipedOutputStream,PipedReader,PipedWriter
缓冲流:
BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter
转换流:
InputStreamReader,OutputStreamWriter。把字节流转换为字符流
数据流:
DataInputStream,DataOutputStream
打印流:
PrintStream,PrintWriter
对象流:
ObjectInputStream,ObjectOutputStream
序列化流:
SequenceInputStream
非流式部分主要类
File:用于文件或者目录的描述信息
操作demo
public class FileTest {
public static void main(String[] args) throws IOException {
fileByteCopy();
fileByteBufferCopy();
fileCharCopy();
fileCharBufferCopy();
fileLen();
fileDir();
fileDirAll();
}
/**
* 文件以字节的方式复制
* @throws IOException
*/
static void fileByteCopy() throws IOException{
Long start = System.currentTimeMillis();
FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\io\\aaa.txt");
FileOutputStream fos = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\io\\bbb.txt");
int b ;
while((b=fis.read())!=-1){
fos.write(b);
}
fis.close();
fos.close();
System.out.println("fileByteCopy time :"+(System.currentTimeMillis()-start)+"ms");
}
/**
* 文件字符复制
* @throws IOException
*/
static void fileCharCopy() throws IOException{
Long start = System.currentTimeMillis();
FileReader fr = new FileReader("C:\\Users\\Administrator\\Desktop\\io\\aaa.txt");
FileWriter fw = new FileWriter("C:\\Users\\Administrator\\Desktop\\io\\eee.txt");
int b ;
while((b=fr.read())!=-1){
fw.write(b);
}
fr.close();
fw.close();
System.out.println("fileCharCopy time :"+(System.currentTimeMillis()-start)+"ms");
}
/**
* 文件以字符缓存方式复制
* @throws IOException
*/
static void fileCharBufferCopy() throws IOException{
Long start = System.currentTimeMillis();
FileReader fr = new FileReader("C:\\Users\\Administrator\\Desktop\\io\\aaa.txt");
FileWriter fw = new FileWriter("C:\\Users\\Administrator\\Desktop\\io\\fff.txt");
BufferedReader br = new BufferedReader(fr);
BufferedWriter bw = new BufferedWriter(fw);
int b ;
while((b=br.read())!=-1){
bw.write(b);
}
br.close();
bw.close();
System.out.println("fileCharBufferCopy time :"+(System.currentTimeMillis()-start)+"ms");
}
/**
* 文件以字节缓存方式复制
* @throws IOException
*/
static void fileByteBufferCopy() throws IOException{
Long start = System.currentTimeMillis();
FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\io\\aaa.txt");
FileOutputStream fos = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\io\\ccc.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
int b ;
while((b=bis.read())!=-1){
bos.write(b);
}
bis.close();
bos.close();
System.out.println("fileByteBufferCopy time :"+(System.currentTimeMillis()-start)+"ms");
}
/**
* 文件目录
* @throws IOException
*/
static void fileDir() throws IOException{
Long start = System.currentTimeMillis();
File file = new File("C:\\Users\\Administrator\\Desktop");
int count = 0;
if(file.isDirectory()){
String[] files = file.list();
for(String f : files){
count++;
System.out.println(f);
}
}
System.out.println("count is :"+count);
System.out.println("fileDir time :"+(System.currentTimeMillis()-start)+"ms");
}
/**
* 文件目录
* @throws IOException
*/
static void fileDirAll() throws IOException{
Long start = System.currentTimeMillis();
File file = new File("C:\\Users\\Administrator\\Desktop");
int count = 0;
if(file.isDirectory()){
File[] files = file.listFiles();
for(File f : files){
count++;
System.out.println(f.getName());
}
}
System.out.println("count is :"+count);
System.out.println("fileDirAll time :"+(System.currentTimeMillis()-start)+"ms");
}
/**
* 文件长度
* @throws IOException
*/
static void fileLen() throws IOException{
Long start = System.currentTimeMillis();
File f = new File("C:\\Users\\Administrator\\Desktop\\io\\ddd.txt");
System.out.println(f.length());
System.out.println("fileLen time :"+(System.currentTimeMillis()-start)+"ms");
}
}
5 如何选择IO流
- 根据是否要格式化输出,可以选择格式化流
- 根据是否需要缓冲,可以使用缓冲流
- 根据处理的数据格式划分,可以选择字节流还是字符流
6 IO异常处理
IO异常处理的基类主要是IOException
比较常用的是:
FileNotFoundException:文件未找到时抛出异常
InterruptedIOException:执行被中断异常
EOFException:非正常到达文件尾或输入流尾部时,抛出的异常
参考: