JAVA IO

Java I/O流使用了Java的装饰模式,

Java装饰模式

装饰模式和继承都是使得类的结构和功能多种多样的方法,但是如同网络上非常多评论说的一样,继承会产生大量的类,装饰能避免这点但是会产生大量的对象。

我能理解,不如说要要实现有 缓冲区的格式化输出,格式话输出在PrintStream中,但是缓冲区在 BufferedOutputStream中,这就说明了,要先建立一个BufferedOutputStream,将BufferedOutputStream对象注入到PrintStream,然后这个PrintStream对象就可以实现有 缓冲区的格式化输出的功能,这确实导致了大量对象,但是对于大大减少了类的数量来说,这个代价值得付出。


 NIO 类:多了一个channel


关于RandomAccessFile

上面这篇链接写得非常认真,真的要赞一个。


就当是初步学习,NIO的效率会比IO高,原因是它是使用块传输:

package javaio;

import java.io.*;
import java.nio.*;
import java.nio.channels.*;
public class GetChannel {
	private static final int BSIZE = 1024;
	public static void main(String[] args) throws Exception {
		FileChannel fc =(new FileOutputStream(
				"nioData.txt")).getChannel();
		fc.write(ByteBuffer.wrap("Some text ".getBytes()));
		fc.close();
		fc = new RandomAccessFile("nioData.txt", "rw").getChannel();
		fc.position(fc.size()); 
		fc.write(ByteBuffer.wrap("Some more".getBytes()));
		fc.close();
		fc = new FileInputStream("nioData.txt").getChannel();
		ByteBuffer buff = ByteBuffer.allocate(BSIZE);
		fc.read(buff);
		buff.flip();
		while(buff.hasRemaining())
			System.out.print((char)buff.get());    
	}
}
与io的流相似,NIO使用 channel作为传输,channel从stream里面获取,channel写入buff中,buff作为写出操作,和一般的io在编程形式上的不同如下:

下面这句话抄自精通Java网络编程,NIO类

NIO的创建目的是让Java程序员可以实现高速I/O而无需编写自定义的本机代码。NIO将最耗时的I/O操作(填充和提取缓冲区)转移回操作系统,因而可以极大地提高速度。

NIO和IO的最大区别是数据的打包和传输方式,原来的IO以流的方式处理数据,而NIO以块的方式处理数据。

如下面所示:

public void stdIn() throws Exception {
		BufferedReader stdin = new BufferedReader(
					new InputStreamReader(System.in));
		System.out.print("Enter a line:");
		System.out.println( stdin.readLine());
	}
BufferReader是字符流的一种,将InputStreamReader对象给他,他包装然后实现buffer缓冲区,然后使用readline读取,还是一个字节一个字节的数据。面向流的IO系统一次一个字节地处理数据。相当慢。


NIO的特性:

1 。 buffer是NIO中数据的载体,使数据以块的形式出现,并提供缓冲支持以提高性能。

public static void main(String[] args) throws Exception {
		FileChannel fc =(new FileOutputStream(
				"nioData.txt")).getChannel();
		fc.write(ByteBuffer.wrap("Some text ".getBytes()));
		fc.close();
		fc = new RandomAccessFile("nioData.txt", "rw").getChannel();
		fc.position(fc.size()); 
		fc.write(ByteBuffer.wrap("Some more".getBytes()));
		fc.close();
		fc = new FileInputStream("nioData.txt").getChannel();
		ByteBuffer buff = ByteBuffer.allocate(BSIZE);
		fc.read(buff);
		buff.flip();
		while(buff.hasRemaining())
			System.out.print((char)buff.get());    
	}
这里就是使用了channel替代直接的stream,channel写入buffer中,对buff操作。

由于 Selector 是NIO的非阻塞模式的输入输出的重要类之一,因此在这里只能先了解什么损失非阻塞。。。

非阻塞模式

在服务器和客户端程序中,执行输入输出程序时不会发生阻塞,就是非阻塞NIO

至于Selector和 SelectionKey,额,暂时看不懂。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值