`
C_J
  • 浏览: 124950 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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();
			}
		}
	}

}

 

分享到:
评论

相关推荐

    Java IO, NIO and NIO.2(Apress,2015)

    In this book, you'll learn about classic I/O APIs (File, RandomAccessFile, the stream classes and related types, and the reader/writer classes). Next, you'll learn about NIO's buffer, channel, ...

    Pro.Java.8.Programming.3rd.Edition.1484206428

    You will also delve into more advanced topics like lambda expressions, closures, new i/o (NIO.2), enums, generics, XML, metadata and the Swing APIs for GUI design and development. By the end of the ...

    Pro.Java.8.Programming.3rd.Edition.1484206428.epub

    You will also delve into more advanced topics like lambda expressions, closures, new i/o (NIO.2), enums, generics, XML, metadata and the Swing APIs for GUI design and development. By the end of the ...

    JavaSE-6.0-英文手册(2008/11/30_FullUpdate)

    Its product version number is 6 and developer version number is 1.6.0, as described in Platform Name and Version Numbers. For information on a feature of the JDK, click on a component in the diagram ...

    基于javatcpsocket通信的拆包和装包源码-chaugod:乔戈德

    基于java tcp socket通信的拆包和装包源码 Java IO 文件流: 磁盘 ...java-built-in、hessian、fastjson、jackson、gson、Thrift、ProtoBuf NIO IO: 单向、阻塞、流 NIO: 双向、非阻塞、通道、缓冲区

    JAVA_API1.6文档(中文)

    java.nio.channels.spi 用于 java.nio.channels 包的服务提供者类。 java.nio.charset 定义用来在字节和 Unicode 字符之间转换的 charset、解码器和编码器。 java.nio.charset.spi java.nio.charset 包的服务提供...

    java api最新7.0

    java.nio.channels.spi 用于 java.nio.channels 包的服务提供者类。 java.nio.charset 定义用来在字节和 Unicode 字符之间转换的 charset、解码器和编码器。 java.nio.charset.spi java.nio.charset 包的服务提供者...

    JDK_1_6 API

    javax.xml.stream javax.xml.stream.events javax.xml.stream.util javax.xml.transform 此包定义了用于处理转换指令,以及执行从源到结果的转换的一般 API。 javax.xml.transform.dom 此包实现特定于 DOM 的转换 ...

    JavaAPI1.6中文chm文档 part1

    java.nio.channels.spi 用于 java.nio.channels 包的服务提供者类。 java.nio.charset 定义用来在字节和 Unicode 字符之间转换的 charset、解码器和编码器。 java.nio.charset.spi java.nio.charset 包的服务提供...

    JavaAPI中文chm文档 part2

    java.nio.channels.spi 用于 java.nio.channels 包的服务提供者类。 java.nio.charset 定义用来在字节和 Unicode 字符之间转换的 charset、解码器和编码器。 java.nio.charset.spi java.nio.charset 包的服务提供...

    [Java参考文档]

    java.nio.channels.spi 用于 java.nio.channels 包的服务提供者类。 java.nio.charset 定义用来在字节和 Unicode 字符之间转换的 charset、解码器和编码器。 java.nio.charset.spi java.nio.charset 包的服务提供...

    [Java参考文档].JDK_API 1.6

    java.nio.channels.spi 用于 java.nio.channels 包的服务提供者类。 java.nio.charset 定义用来在字节和 Unicode 字符之间转换的 charset、解码器和编码器。 java.nio.charset.spi java.nio.charset 包的服务提供者...

    Java 1.6 API 中文 New

    java.nio.channels.spi 用于 java.nio.channels 包的服务提供者类。 java.nio.charset 定义用来在字节和 Unicode 字符之间转换的 charset、解码器和编码器。 java.nio.charset.spi java.nio.charset 包的服务提供者...

Global site tag (gtag.js) - Google Analytics