JAVA IO,javaio
分享于 点击 46994 次 点评:235
JAVA IO,javaio
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,额,暂时看不懂。
相关文章
- 暂无相关文章
用户点评