Java IO之文件读取

 以BIO形式的文件读取和复制:

public class MyReadFile {
	public static void main(String[] args){
		
		try{
			//第一步,定位数据源
			File f=new File("c:/work/test.txt");
			//第二布,建立管道,FileInputStream文件输入流类用于读文件
			FileInputStream fis=new FileInputStream(f);
			
			//FileOutputStream文件输出流类用于写文件
			File outFile=new File("c:/work/test1.txt");	
			FileOutputStream fos=new FileOutputStream(outFile);
			//第三步,操作管道
			int length=fis.available();
			for(int i=0;i<length;i++)
			System.out.print((char)fis.read());
			
			//将test中的文件读出来-->再写入到test1中,实现文件复制
			for(int i=0;i<length;i++)
				fos.write(fis.read());
		}catch(Exception e){}  //IO异常
	}
}

 

NIO读取过程:

 

NIO形式的读取和复制

//以NIO的形式读取需要建立通道
public class CopyBytesWithChannel {

	private static final int BSIZE = 1024;// 定义缓冲区大小

	public static void main(String[] args) throws IOException {
		FileInputStream ins = new FileInputStream("c:/work/test.txt");
		FileOutputStream fos = new FileOutputStream("c:/work/test2.txt");

		FileChannel inChannel = ins.getChannel();// 获取该文件输入流的通道
		FileChannel outChannel = fos.getChannel();// 获取该文件输出流的通道
		// System.out.println(ins.read());
		ByteBuffer buffer = ByteBuffer.allocate(BSIZE);// 创建缓冲区
		while (inChannel.read(buffer) != -1) {
			buffer.flip(); // 使缓冲区准备好写操作
			outChannel.write(buffer);
			buffer.clear();
		}
		ins.close();
		fos.close();
		//System.out.println("read end");
	}
}

 

阻塞 IO 和非阻塞 IO 这两个概念是程序级别的。主要描述的是程序请求操作系统 IO 操作后,如果 IO 资源没有准备好,那么程序该如何处理的问题:前者等待;后者继续执行(并且使用线程一直轮询,直到有 IO 资源准备好了)。

同步 IO 和异步 IO,这两个概念是操作系统级别的。主要描述的是操作系统在收到程序请求 IO 操作后,如果 IO 资源没有准备好,该如何响应程序的问题:前者不响应,直到 IO 资源准备好以后;后者返回一个标记(好让程序和自己知道以后的数据往哪里通知),当 IO 资源准备好以后,再用事件机制返回给程序。

 

同步阻塞IO(JAVA BIO): 
    服务器实现模式为一个连接一个线程,每当客户端有连接请求时服务器端就需要启动一个线程进行处理。而且服务器需要一直处于等待状态,一直在 accept();。如果这个连接不做任何事会造成不必要的开销。

同步非阻塞IO(Java NIO) :

服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。用户进程也需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问。 

异步阻塞IO(Java NIO):  
   此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问IO是否完成。(比如你买了一份快递,你不需要一天二十四小时去关注快递的状态,而是当快递到了或丢了等特殊情况下会通知你。)

阻塞是因为此时是通过select系统调用来完成的,而select函数本身的实现方式是阻塞的,而采用select函数有个好处就是它可以同时监听多个文件句柄从而提高系统的并发性!

 

还有更强的异步非阻塞(AIO)。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值