NIO Stream in 2009

前言

    NIO(非阻塞IO)是在原来的IO流(BIO:Block IO)上做了模式上的改进(还有个AIO:异步IO),运用了Reactor模式,或者说是Observer模式为我们监察I/O端口,如果有内容进来,会自动通知我们,就不必开启多个线程死等,改进了原IO流的读取效率,提供了有如"文件内容内存映射","IO非阻塞读取"接口,提高在多线程环境下,特别是高并发度系统中的效率.

 

数据传输

    传统IO以流传输;

    Buffer等改进以多个字节或字符传输,有个缓存;

    新IO以块传输; 

 

题记

    因为最近任务也有牵涉到IO流处理,并之前测试出FileWrite写,BufferReader读效率最好,恰好坛子里有人放出了自己的FileUtil,被坛友提出质疑为什么不用NIO,于是我去google相关资料,发现这方面的例子并不多;

 

实例:

// 文件映射内存

import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;
import java.util.regex.*;


public class Grep {

    // Charset and decoder for ISO-8859-15
    private static Charset charset = Charset.forName("ISO-8859-15");
    private static CharsetDecoder decoder = charset.newDecoder();

    // Pattern used to parse lines
    private static Pattern linePattern
	= Pattern.compile(".*\r?\n");

    // The input pattern that we're looking for
    private static Pattern pattern;

    // Compile the pattern from the command line
    //
    private static void compile(String pat) {
	try {
	    pattern = Pattern.compile(pat);
	} catch (PatternSyntaxException x) {
	    System.err.println(x.getMessage());
	    System.exit(1);
	}
    }

    // Use the linePattern to break the given CharBuffer into lines, applying
    // the input pattern to each line to see if we have a match
    //
    private static void grep(File f, CharBuffer cb) {
	Matcher lm = linePattern.matcher(cb);	// Line matcher
	Matcher pm = null;			// Pattern matcher
	int lines = 0;
	while (lm.find()) {
	    lines++;
	    CharSequence cs = lm.group(); 	// The current line
	    if (pm == null)
		pm = pattern.matcher(cs);
	    else
		pm.reset(cs);
	    if (pm.find())
		System.out.print(f + ":" + lines + ":" + cs);
	    if (lm.end() == cb.limit())
		break;
	}
    }

    // Search for occurrences of the input pattern in the given file
    //
    private static void grep(File f) throws IOException {

	// Open the file and then get a channel from the stream
	FileInputStream fis = new FileInputStream(f);
	FileChannel fc = fis.getChannel();

	// Get the file's size and then map it into memory
	int sz = (int)fc.size();
	MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, sz);

	// Decode the file into a char buffer
	CharBuffer cb = decoder.decode(bb);

	// Perform the search
	grep(f, cb);

	// Close the channel and the stream
	fc.close();
    }

    public static void main(String[] args) {
	if (args.length < 2) {
	    System.err.println("Usage: java Grep pattern file...");
	    return;
	}
	compile(args[0]);
	for (int i = 1; i < args.length; i++) {
	    File f = new File(args[i]);
	    try {
		grep(f);
	    } catch (IOException x) {
		System.err.println(f + ": " + x);
	    }
	}
    }

}

 

 

写IO操作(简单的写文件流,NIO更适合些SOCKET)

import java.io.*;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class WriteTest {
	public WriteTest() {
	}

	public static void main(String[] args) {
		FileChannel outputChannel = null;
	try{		File file = new File("C:/add1.txt");
			FileOutputStream outputFile = null;

			long begin4 = System.currentTimeMillis();

			outputFile = new FileOutputStream(file);
			outputChannel = outputFile.getChannel();

			ByteBuffer buff = ByteBuffer.allocate(1024);

			for (int i = 0; i < count; i++) {
				buff.clear();
				buff.put("~!@#$%^&*()|\r\n".getBytes());
				buff.flip();

				try {
					outputChannel.write(buff);
				} catch (IOException ioe) {
					ioe.printStackTrace(System.err);
				}
			}
			long end4 = System.currentTimeMillis();

			System.out.println("NIO CharBuffer执行耗时:" + (end4 - begin4) + " 豪秒");

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				outputChannel.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值