IOとNIO操作ファイルの比較

2484 ワード

従来のIOはストリーム方式でデータを処理していたが、ストリーム向けのIOは一度に1バイトずつデータを処理し、簡単で便利だったが、効率は高くなかった.
NIOは、ブロックIOの処理方式を用いて、各動作が1ステップで1つのデータブロック(キャッシュ)を読み出したり書き出したりする.
IOとNIOの対比
1.1ファイルの内容を読み取る
IOを使用して指定ファイルの最初の1024バイトの内容を読み込む
private static void ioRead(String file) throws IOException {
		FileInputStream in = new FileInputStream(file);
		byte[] b = new byte[1024];
		in.read(b);
		System.out.println(new String(b));
	}
NIOを使用して指定ファイルの最初の1024バイトの内容を読み込む
private static void nioRead(String file) throws IOException {
		FileInputStream in = new FileInputStream(file);
		FileChannel channel = in.getChannel();
		ByteBuffer buffer = ByteBuffer.allocate(1024);
		channel.read(buffer);
		byte[] b = buffer.array();
		System.out.println(new String(b));
	}
ストリーム向けIOでは、streamオブジェクトに直接データを書き込むか、streamオブジェクトにデータを読み込む.NIOでは、すべてのオブジェクトがバッファで処理され、読み込み書き込みデータはバッファに格納され、いつでもNIOにアクセスするデータはバッファに格納され、バッファは実際にはバイト配列であるが、配列だけでなく、バッファはまた、データへの構造的なアクセスを提供し、システムの読み書きプロセスを追跡することもできます.
1.2 NIOファイルの読み取り
private static void nioRead(String file) throws IOException {
		FileInputStream in = new FileInputStream(file);
		//        ,   FileInputStream  
		FileChannel channel = in.getChannel();
		//          
		ByteBuffer buffer = ByteBuffer.allocate(1024);
		//                
		channel.read(buffer);
		byte[] b = buffer.array();
		System.out.println(new String(b));
	}
1.3 NIO書き込みファイル
private static void NIOWrite(String file) throws IOException {
		FileOutputStream out = new FileOutputStream(file);
		//        ,   FileInputStream  
		FileChannel channel = out.getChannel();
		//          ,          
		ByteBuffer buffer = ByteBuffer.allocate(1024);
		buffer.put("  NIO".getBytes());
		buffer.flip();
		//       
		channel.write(buffer);
	}
1.4ファイルコンテンツコピー
private static void NIOCopy(String file) throws IOException {
		FileOutputStream out = new FileOutputStream(file);
		FileInputStream in = new FileInputStream(file);
		//         
		FileChannel outChannel = out.getChannel();
		FileChannel inChannel = in.getChannel();
		//     
		ByteBuffer buffer = ByteBuffer.allocate(1024);
		while(true){
			//clear        ,           
			buffer.clear();
			//             
			int r = inChannel.read(buffer);
			//read   ,        ,    ,             ,   -1
			if(r == -1){
				break;
			}
			//flip   ,             ,         
			buffer.flip();
			//              
			outChannel.write(buffer);
		}
	}