小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

JAVA NIO

 筑心wup 2013-01-19

JAVA NIO

分類: Java 387人閱讀 評論(0) 收藏 舉報

jdk1.4 開始引入了新IO類,NIO包的目的是為了提高IO的效率。

緩沖區(qū)Buffer:

緩沖區(qū)的優(yōu)點我就不多介紹了。

擁有3個屬性:

(1)容量:一個緩沖區(qū)最多容量。

(2)界限:一個緩沖區(qū)可讀寫的范圍。

(3)位置:接下來要讀寫的位置。

界限是用來控制當前讀寫的范圍,如果容量為100,界限為10,則位置只能在0-10之間,即只能讀寫0-10之間的數(shù)據(jù)

提供了三個方法改變屬性:

(1)clear():把界限移到容量處,把位置設為0.

(2)flip():把界限移到位置處,把位置移到0.

(3)rewind():界限不變,位置設為0.

ByteBuffer:字節(jié)緩沖區(qū)

創(chuàng)建:ByteBuffer bf = ByteBuffer.allocate(capacity);

MappedByteBuffer:ByteBuffer的子類

能夠把文件的部分映射到緩沖區(qū)中。
方法:

get();

put();

bb.isRemaining();判斷是否還有數(shù)據(jù)可讀

import java.io.*;
import java.nio.*;
import java.nio.channels.*;
public class TransferDemo{
	public static void main(String args[])throws Exception{
		FileChannel in = new FileInputStream("test.txt").getChannel();
		FileChannel out = new FileOutputStream("out.txt").getChannel();
		ByteBuffer bf = ByteBuffer.allocate(1024);
		while(in.read(bf)!=-1){
			bf.flip();
			out.write(bf);
			bf.clear();
		}
		out.close();
		in.close();
	}
}


疑問:光有Buffer,但是怎么和數(shù)據(jù)源和數(shù)據(jù)匯進行連接呢?

Channel通道:把數(shù)據(jù)源或數(shù)據(jù)匯和Buffer連接起來。

FileChannel是一個實現(xiàn)好的類,是文件和緩沖區(qū)的通道,在FileInputStream、FileOutputStream、RandomAccessFile中的getChannel();獲得。

(1)read(ByteBuffer bf);      讀取文件數(shù)據(jù)到ByteBuffer

(2)write(ByteBuffer bf);    把ByteBuffer寫入文件

把String包裝到ByteBuffer中:ByteBuffer.wrap(str.getBytes());

利用Charset能夠?qū)?b style="color:black;background-color:#99ff99">ByteBuffer進行編碼轉(zhuǎn)換。

Charset cs = Charset.forName("UTF-8");

CharBuffer cs.decode(ByteBuffer);把ByteBuffer解碼為Unicode編碼并返回。

import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;
public class FileChannelDemo01{
	public static void main(String args[])throws Exception{
		FileChannel fc = new FileOutputStream("text.txt").getChannel();
		fc.write(ByteBuffer.wrap("你好".getBytes()));
		fc.close();

		fc = new RandomAccessFile("text.txt","rw").getChannel();
		fc.position(fc.size());
		fc.write(ByteBuffer.wrap("朋友".getBytes()));
		fc.close();

		fc = new FileInputStream("text.txt").getChannel();
		ByteBuffer buf = ByteBuffer.allocate(1024);
		fc.read(buf);
		buf.flip();
		Charset cs = Charset.defaultCharset();
		System.out.println(cs.decode(buf));
		
		fc.close();
	}
}


Charset類:字符編碼轉(zhuǎn)換類

Charset cs = Charset.defaultCharset();

Charset cs = Charset.forName("UTF-8");

獲得字符集

UTF-16BE是Unicode碼。

ByteBuffer encode(String);把String按照指定的字符集編碼,并返回。

CharBuffer decode(ByteBuffer)按照指定的字符集轉(zhuǎn)換成Unicode碼。

import java.io.*;
import java.nio.*;
import java.nio.channels.*;

public class CharsetConvert{
	public static void main(String args[])throws Exception{
		ByteBuffer bb = ByteBuffer.wrap("你好".getBytes("UTF-8"));
		CharBuffer cb = bb.asCharBuffer();
		System.out.println(cb);
		bb = ByteBuffer.wrap("你好".getBytes("UTF-16BE"));
		cb = bb.asCharBuffer();
		System.out.println(cb);
		
	}
}


MappedByteBuffer:映射緩沖區(qū)

ByteBuffer的子類,用于因為文件太大不能放入內(nèi)存的文件,能夠映射文件的部分區(qū)域。

MappedByteBuffer b = channel.map(FileChannel.MapMode.READ_WRITE,pos,capacity);    pos表示文件開始映射位置,capacity表示要映射的容量。

import java.nio.*;
import java.io.*;
import java.nio.channels.*;
import java.nio.charset.*;
public class MappedByteBufferDemo01{
	public static void main(String args[])throws Exception{
		int capacity = 0x8000000;
		MappedByteBuffer mb = new RandomAccessFile("test.txt","rw").getChannel().map(FileChannel.MapMode.READ_WRITE,0,capacity);
		mb.put("你好".getBytes("GBK"));
		mb.flip();
		System.out.println(Charset.forName("GBK").decode(mb)); 
	}
}

 

緩沖區(qū)視圖:

ByteBuffer提供了一些方法可以得到其他的視圖,比如asCharBuffer()獲得CharBuffer。

(1)CharBuffer cb = bb.asCharBuffer();

(2)IntBuffer ib = bb.asIntBuffer();

ByteBuffer提供了

getInt()用于讀取整數(shù)緩沖區(qū)視圖put進去的整數(shù)。

getChar()用于讀取字符緩沖區(qū)視圖put進去的字符。

 

import java.nio.*;
public class BufferViewDemo{
	public static void main(String args[])throws Exception{
		ByteBuffer bb = ByteBuffer.allocate(100);
		CharBuffer cb = bb.asCharBuffer();
		cb.put("你好");
		bb.rewind();
		/*while(bb.hasRemaining()){
			System.out.println(bb.getChar()); 
		}*/
		IntBuffer ib = bb.asIntBuffer();
		int[] arr = {1,2,3};
		ib.put(arr);
		System.out.println(ib.get(2));
		ib.flip();
		while(ib.hasRemaining()){
			int i = ib.get();
			System.out.println(i); 
		}

	}
}

文件加鎖:

得到鎖并加鎖:FileLock lock = channel.tryLock();

釋放鎖:lock.release();

 

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多