Java IO 窥探

此文大部分摘自:https://blog.csdn.net/qq_22063697/article/details/52137369

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:非正常到达文件尾或输入流尾部时,抛出的异常

猜你喜欢

转载自blog.csdn.net/u014209205/article/details/81282229