3月22号

十四、NIO
NIO:New IO,从 JDK1.4加入,目的为了提高 IO 流的读取和写入效率
处理的数据格式是:块


NIO中提供的缓冲区(数组)
ByteBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
CharBuffer
ShortBuffer


缓冲区的三个重要变量:
position:位置
limit:限制
capacity:容量


创建缓冲区,并分配缓冲区大小
//字节缓冲区
ByteBuffer buf = ByteBuffer.allocate(10);




示例1:
/**
* 使用NIO复制文件
* @throws IOException
*/
private static void copy() throws IOException{
long start = System.currentTimeMillis();
//创建一个文件通道,该通道指向一个目标文件
FileChannel fcIn = new FileInputStream("c:\\3D0.jpg")
.getChannel();
FileChannel fcOut = new FileOutputStream("c:\\liyan.jpg")
.getChannel();
//[10,20,30,40,50,60,70,80,90]


ByteBuffer buf = ByteBuffer.allocate(1024);
int i=1;
while(fcIn.read(buf)!=-1){
System.out.println(i++);
buf.flip();//反转缓冲区
fcOut.write(buf);
buf.clear();//还原缓冲区的状态
}
fcIn.close();
fcOut.close();
System.out.println("copy success");
long end = System.currentTimeMillis();
System.out.println("耗时(毫秒):"+(end-start));
}


示例2:
/**
* 使用内存映射复制文件
*/
private static void randomAccessFileCopy(){
try {
//创建指向目标文件的RandomAccessFile
RandomAccessFile in = new RandomAccessFile(
new File("c:\\3D0.jpg"),"r");
RandomAccessFile out = new RandomAccessFile(
new File("c:\\36D_liyan.jpg"),"rw");
//获取通道
FileChannel fcIn = in.getChannel();
FileChannel fcOut = out.getChannel();


//映射内存缓冲区
long size = fcIn.size();
MappedByteBuffer inBuf =
fcIn.map(MapMode.READ_ONLY, 0,size );
MappedByteBuffer outBuf =
fcOut.map(MapMode.READ_WRITE, 0,size);


//从源文件的缓冲区中把数据放到目标文件的缓冲区
for(int i=0;i<size;i++){
outBuf.put(inBuf.get());
}
//关闭(同时写入数据块)
fcIn.close();
fcOut.close();
in.close();
out.close();
System.out.println("copy success");


} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}


}


文件操作的性能比较:
速度最快的方式:使用内存映射
其次是 NIO
效率较低 IO流


使用普通 IO 实现文件读写:


写文件:
OutputStream out = new FileOutputStream("c:\\test.txt",true);
BufferedOutputStream bos = new BufferedOutputStream(out);
PrintStream ps = new PrintStream(bos);
String info = "hello world";
ps.write(info.getBytes());
ps.close();




读文件:
InputStream in = new FileInputStream("c:\\test.txt");
BufferedInputStream bis = new BufferedInputStream(in);
byte[] bytes = new byte[1024];
int len = -1;
StringBuilder sb = new StringBuilder();
while((len=bis.read(bytes))!=-1){
    sb.append(new String(bytes,0.len));
}
bis.close();


使用字符流输出:


private void writeFile(OutputStream out){
    OutputSteamWriter osw = new OutputStreamWriter(out);
    BufferedWriter bw = new BufferedWriter(osw);
    bw.print("info");
    //...
    bw.close();
}


使用字符流输入:


private void readFile(InputStream in){
    InputStreamReader isr = new InputStreamReader(in);
    BufferedReader br = new BufferedReader(isr);
    char[] cs = new char[1024];
    int len = -1;
    StringBuilder sb = new StringBuilder();
    while((len=br.read(cs))!=-1){
        sb.append(new String(cs,0.len));
    }
    br.close();
}













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值