I/O 速度快慢:
Memory-mapped files 映射文件>nio stream i/o 新输入输出>old stream i/o 旧输入输出
一、操作系统内存使用情况,下面的缓冲是内存条缓存。
1>为硬件保留 115
2>正在使用(表示 操作系统和其它程序正在用的内存)2961
3>已修改(这部分不能用,用之前必须存到硬盘上)表示里面放了缓存的数据和代码,是活动的, 19
4>备用:表示里面放了缓存的数据和代码,但是不活动。
5>可用(free):表示空闲的,谁都可以用
已安装=1>+2>+3>+4>+5>
总数=已安装-为硬件保留 115
缓冲=备用+ 已修
可用= 备用+可用(free)
可变:2>,3>,4> , 5>
不可变:已安装,总数,为硬件保留
二、例子
1、 Memory-mapped files:建立1.5G的文件,当前内存不够,但是也允许你去建立这个文件。
例如:1>建立一个1.5 G的.txt文件
2>观察当前的系统,可用的内存大约 1G,所以Memory-mapped files 假装可以装下。
目前我的操作系统允许最大是, 4G,即一个int的字节数2^32-1=4G。
package io; import java.io.*; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import static net.mindview.util.Print.*; public class LargeMappedFiles { //length <MAX_VALUE = 0x7fffffff=2^32-1=2^10*2^10*2^10*2^2=4G
static int length = 0x4FFFFFFF; // 1.5G public static void main(String[] args) throws Exception { MappedByteBuffer out = new RandomAccessFile("test.txt", "rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, length); for (int i = 0; i < length; i++) out.put((byte) 'x'); print("Finished writing"); for (int i = length / 2; i < length / 2 + 6; i++) printnb((char) out.get(i)); } }
三、类说明:
1、ByteBuffer:就像一个放东西仓库,只和Channel 打交道,表示东西从仓库 移 到通道,从通道 搬到仓库。
1》 lim容量:能装多少东西
2》mark=pos:现在开始往仓库放东西的位置,buffer.mark()
pos:目前放、取东西位置。
put():表示正在放东西,pos+1.
get():表示正在取出东西 ,pos+1
3》reset():pos值=mark 表示回到刚放东西的位置。
4》 rewind():pos=mark=0 表示空仓库。
2、允许一些人往仓库放东西,出现一大堆view 类
1》asLongBuffer :只放 Long
2》asShortBuffer():
等原始类型。
3、MappedByteBuffer 其实 也是 ByteBuffer 类,只是加了一些功能
1》.map(FileChannel.MapMode.READ_WRITE, 0, length):调用这个方法,就有MappedByteBuffer,ByteBuffer 对象。
MapMode:很重要,告诉通道,准备搬东西进仓库或是把仓库东西搬到通道
length:告诉通道,有多少东西需要到通道中,(不然通道没有准备额)