Selector
ä¸ã Selector ç®ä»
1 ãSelector å Channel å ³ç³»
Selector ä¸è¬ç§° 为
éæ©å¨
ï¼ä¹å¯ä»¥ç¿»è¯ä¸º
å¤è·¯å¤ç¨å¨
ãå®æ¯ Java NIO
æ ¸å¿ç»ä»¶
ä¸çä¸ä¸ªï¼
ç¨äºæ£æ¥ä¸ä¸ªæå¤ä¸ª NIO Channelï¼ééï¼çç¶ææ¯å¦å¤äºå¯è¯»ãå¯å
ã
å¦æ¤å¯ä»¥å®ç°
å线ç¨ç®¡çå¤ä¸ª channels
,ä¹å°±æ¯å¯ä»¥
管çå¤ä¸ªç½ç»é¾æ¥
ã
ä½¿ç¨ Selector ç好å¤å¨äºï¼
使ç¨æ´å°ç线ç¨æ¥å°±å¯ä»¥æ¥å¤çééäºï¼ ç¸æ¯ä½¿ç¨å¤ä¸ªçº¿ç¨ï¼é¿å äºçº¿ç¨ä¸ä¸æåæ¢å¸¦æ¥çå¼éã
2ã å¯éæ©éé(SelectableChannel)
ï¼1ï¼ä¸æ¯ææç Channel é½å¯ä»¥è¢« Selector å¤ç¨çã
æ¯æ¹è¯´ï¼
FileChannel å°±ä¸è½è¢«éæ©å¨å¤ç¨
ã
å¤æä¸ä¸ª Channel è½è¢« Selector å¤ç¨ï¼æä¸ä¸ªåæï¼å¤æä»æ¯å¦ç»§æ¿äºä¸ä¸ªæ½è±¡ç±» SelectableChannelãå¦æ继æ¿äº SelectableChannelï¼åå¯ä»¥è¢«å¤ç¨ï¼å¦åä¸è½
ã
ï¼2ï¼SelectableChannel ç±»æä¾äºå®ç°ééçå¯éæ©æ§æéè¦çå ¬å ±æ¹æ³ãå®æ¯æææ¯æ就绪æ£æ¥çééç±»çç¶ç±»ãææ socket ééï¼é½
继æ¿äº SelectableChannel ç±»é½æ¯å¯éæ©ç
ï¼å æ¬ä»ç®¡é(Pipe)对象çä¸è·å¾çééãè
FileChannel ç±»ï¼æ²¡æç»§æ¿ SelectableChannelï¼å æ¤æ¯ä¸æ¯å¯ééé
ã
ï¼3ï¼
ä¸ä¸ªééå¯ä»¥è¢«æ³¨åå°å¤ä¸ªéæ©å¨ä¸ï¼ä½å¯¹æ¯ä¸ªéæ©å¨èè¨åªè½è¢«æ³¨åä¸æ¬¡
ãééåéæ©å¨ä¹é´çå ³ç³»ï¼ä½¿ç¨æ³¨åçæ¹å¼å®æãSelectableChannel å¯ä»¥è¢«æ³¨åå°Selector 对象ä¸ï¼å¨æ³¨åçæ¶åï¼éè¦æå®ééçåªäºæä½ï¼æ¯ Selector æå ´è¶£çã
3 ãChannel 注åå° Selector
ï¼1ï¼ä½¿ç¨ Channel.
registerï¼Selector selï¼int opsï¼æ¹æ³
å°ä¸ä¸ªéé注åå°ä¸ä¸ªéæ©å¨æ¶ã第ä¸ä¸ªåæ°ï¼æå®ééè¦æ³¨åçéæ©å¨ã第äºä¸ªåæ°æå®éæ©å¨éè¦æ¥è¯¢çééæä½(æå ´è¶£æä½)ã
ï¼2ï¼å¯ä»¥ä¾éæ©å¨æ¥è¯¢çééæä½ï¼
æå
´è¶£æä½
ï¼ï¼ä»ç±»åæ¥åï¼å æ¬ä»¥ä¸åç§ï¼
- å¯è¯» : SelectionKey.OP_READ
- å¯å : SelectionKey.OP_WRITE
- è¿æ¥ : SelectionKey.OP_CONNECT
- æ¥æ¶ : SelectionKey.OP_ACCEPT
å¦æ Selector 对ééç
å¤æä½ç±»åæå
´è¶£
ï¼å¯ä»¥ç¨âä½æâæä½ç¬¦æ¥å®ç°ï¼
æ¯å¦ï¼int key = SelectionKey.OP_READ | SelectionKey.OP_WRITE ;
ï¼3ï¼éæ©å¨æ¥è¯¢çä¸æ¯ééçæä½ï¼èæ¯ééçæ个æä½çä¸ç§å°±ç»ªç¶æã
ä»ä¹æ¯æä½ç就绪ç¶æï¼ä¸æ¦ééå ·å¤å®ææ个æä½çæ¡ä»¶ï¼è¡¨ç¤ºè¯¥ééçæ个æä½å·²ç»å°±ç»ªï¼å°±å¯ä»¥è¢« Selector æ¥è¯¢å°ï¼ç¨åºå¯ä»¥å¯¹ééè¿è¡å¯¹åºçæä½ãæ¯æ¹è¯´ï¼æ个SocketChannel ééå¯ä»¥è¿æ¥å°ä¸ä¸ªæå¡å¨ï¼åå¤äºâè¿æ¥å°±ç»ªâ(OP_CONNECT)ãåæ¯æ¹è¯´ï¼ä¸ä¸ª ServerSocketChannel æå¡å¨ééåå¤å¥½æ¥æ¶æ°è¿å ¥çè¿æ¥ï¼åå¤äºâæ¥æ¶å°±ç»ªâï¼OP_ACCEPTï¼ç¶æãè¿æ¯æ¹è¯´ï¼ä¸ä¸ªææ°æ®å¯è¯»çééï¼å¯ä»¥è¯´æ¯â读就绪â(OP_READ)ãä¸ä¸ªçå¾ åæ°æ®çééå¯ä»¥è¯´æ¯âå就绪â(OP_WRITE)ã
4ã éæ©é®(SelectionKey)
ï¼1ï¼Channel 注åå°åï¼å¹¶ä¸ä¸æ¦ééå¤äºæç§å°±ç»ªçç¶æï¼å°±å¯ä»¥è¢«éæ©å¨æ¥è¯¢å°ãè¿ä¸ªå·¥ä½ï¼ä½¿ç¨éæ©å¨ Selector ç selectï¼ï¼æ¹æ³å®æãselect æ¹æ³çä½ç¨ï¼å¯¹æå ´è¶£çééæä½ï¼è¿è¡å°±ç»ªç¶æçæ¥è¯¢ã
ï¼2ï¼Selector å¯ä»¥ä¸æçæ¥è¯¢ Channel ä¸åççæä½ç就绪ç¶æã并ä¸æéæå ´è¶£çæä½å°±ç»ªç¶æãä¸æ¦ééææä½ç就绪ç¶æè¾¾æï¼å¹¶ä¸æ¯ Selector æå ´è¶£çæä½ï¼å°±ä¼è¢« Selector éä¸ï¼æ¾å ¥éæ©é®éåä¸ã
ï¼3ï¼ä¸ä¸ªéæ©é®ï¼é¦å æ¯å å«äºæ³¨åå¨ Selector çééæä½çç±»åï¼æ¯æ¹è¯´SelectionKey.OP_READãä¹å å«äºç¹å®çééä¸ç¹å®çéæ©å¨ä¹é´ç注åå ³ç³»ã
å¼ååºç¨ç¨åºæ¯ï¼éæ©é®æ¯ç¼ç¨çå ³é®ãNIO çç¼ç¨ï¼å°±æ¯æ ¹æ®å¯¹åºçéæ©é®ï¼è¿è¡ä¸åçä¸å¡é»è¾å¤çã
ï¼4ï¼
éæ©é®çæ¦å¿µï¼åäºä»¶çæ¦å¿µæ¯è¾ç¸ä¼¼
ãä¸ä¸ªéæ©é®ç±»ä¼¼çå¬å¨æ¨¡å¼éè¾¹çä¸ä¸ªäºä»¶ãç±äº Selector ä¸æ¯äºä»¶è§¦åç模å¼ï¼èæ¯ä¸»å¨å»æ¥è¯¢ç模å¼ï¼æ以ä¸å«äºä»¶Eventï¼èæ¯å« SelectionKey éæ©é®ã
äºã Selector ç使ç¨æ¹æ³
1. Selector çå建
éè¿è°ç¨ Selector.open()æ¹æ³
å建ä¸ä¸ª Selector 对象
ï¼å¦ä¸ï¼
//è·å Selector éæ©å¨
Selector selector = Selector.open();
2. 注å Channel å° Selector
è¦å®ç° Selector 管ç Channelï¼éè¦å° channel 注åå°ç¸åºç Selector ä¸
// 1ãè·å Selector éæ©å¨
Selector selector = Selector.open();
// 2ãè·åéé
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
// 3.设置为éé»å¡
serverSocketChannel.configureBlocking(false);
// 4ãç»å®è¿æ¥
serverSocketChannel.bind(new InetSocketAddress(9999));
// 5ãå°éé注åå°éæ©å¨ä¸,并å¶å®çå¬äºä»¶ä¸ºï¼âæ¥æ¶âäºä»¶
serverSocketChannel.register(selector,SelectionKey.OP_ACCEPT);
ä¸é¢éè¿è°ç¨ééç register()æ¹æ³ä¼å°å®æ³¨åå°ä¸ä¸ªéæ©å¨ä¸ã
é¦å éè¦æ³¨æçæ¯ï¼
- ï¼1ï¼ä¸ Selector ä¸èµ·ä½¿ç¨æ¶ï¼
ï¼å¦åå°æåºå¼å¸¸IllegalBlockingModeExceptionãè¿æå³çï¼FileChannel ä¸è½ä¸ Selector ä¸èµ·ä½¿ç¨ï¼å 为 FileChannel ä¸è½åæ¢å°éé»å¡æ¨¡å¼ï¼èå¥æ¥åç¸å ³çææçééé½å¯ä»¥ãChannel å¿ é¡»å¤äºéé»å¡æ¨¡å¼ä¸
- ï¼2ï¼ä¸ä¸ªééï¼å¹¶æ²¡æä¸å®è¦æ¯æææçåç§æä½ãæ¯å¦æå¡å¨ééServerSocketChannel æ¯æ Accept æ¥åæä½ï¼è SocketChannel 客æ·ç«¯ééåä¸æ¯æãå¯ä»¥éè¿ééä¸ç validOps()æ¹æ³ï¼æ¥è·åç¹å®ééä¸æææ¯æçæä½éåã
3. 轮询æ¥è¯¢å°±ç»ªæä½
ï¼1ï¼éè¿ Selector ç
selectï¼ï¼æ¹æ³
ï¼å¯ä»¥æ¥è¯¢åºå·²ç»å°±ç»ªçééæä½ï¼è¿äºå°±ç»ªçç¶æéåï¼å åå¨ä¸ä¸ªå ç´ æ¯ SelectionKey 对象ç Set éåä¸ã
ï¼2ï¼ä¸é¢æ¯ Selector å 个éè½½çæ¥è¯¢ select()æ¹æ³ï¼
- select():é»å¡å°è³å°æä¸ä¸ªééå¨ä½ 注åçäºä»¶ä¸å°±ç»ªäºã
- select(long timeout)ï¼å select()ä¸æ ·ï¼ä½æé¿é»å¡äºä»¶ä¸º timeout 毫ç§ã
- selectNow():éé»å¡ï¼åªè¦æéé就绪就ç«å»è¿åã
select()æ¹æ³è¿åç int å¼ï¼è¡¨ç¤ºæå¤å°ééå·²ç»å°±ç»ªï¼æ´åç¡®ç说ï¼æ¯èªåä¸æ¬¡ selectæ¹æ³ä»¥æ¥å°è¿ä¸æ¬¡ select æ¹æ³ä¹é´çæ¶é´æ®µä¸ï¼æå¤å°ééåæ就绪ç¶æã
ä¾å¦ï¼
é¦æ¬¡è°ç¨ select()æ¹æ³ï¼å¦ææä¸ä¸ªééåæ就绪ç¶æï¼è¿åäº 1ï¼è¥å次è°ç¨select()æ¹æ³ï¼å¦æå¦ä¸ä¸ªéé就绪äºï¼å®ä¼å次è¿å 1ãå¦æ对第ä¸ä¸ªå°±ç»ªçchannel 没æåä»»ä½æä½ï¼ç°å¨å°±æ两个就绪çééï¼ä½å¨æ¯æ¬¡ select()æ¹æ³è°ç¨ä¹é´ï¼åªæä¸ä¸ªéé就绪äºã
ä¸æ¦è°ç¨ select()æ¹æ³ï¼å¹¶ä¸è¿åå¼ä¸ä¸º 0 æ¶ï¼å¨ Selector ä¸æä¸ä¸ª
selectedKeys()æ¹æ³
ï¼ç¨æ¥è®¿é®å·²éæ©é®éåï¼è¿ä»£éåçæ¯ä¸ä¸ªéæ©é®å ç´ ï¼æ ¹æ®
就绪æä½
çç±»åï¼å®æ对åºçæä½ï¼
//è·åå·²ç»å°±ç»ªçééæä½
Set selectedKeys = selector.selectedKeys();
Iterator keyIterator = selectedKeys.iterator();
while(keyIterator.hasNext()) {
SelectionKey key = keyIterator.next();
//å¤ækey就绪ç¶ææ¯ä»ä¹
if(key.isAcceptable()) {
// a connection was accepted by a ServerSocketChannel.
} else if (key.isConnectable()) {
// a connection was established with a remote server.
} else if (key.isReadable()) {
// a channel is ready for reading
} else if (key.isWritable()) {
// a channel is ready for writing
}
keyIterator.remove();
}
5. åæ¢éæ©çæ¹æ³
éæ©å¨æ§è¡éæ©çè¿ç¨ï¼ç³»ç»åºå±ä¼ä¾æ¬¡è¯¢é®æ¯ä¸ªééæ¯å¦å·²ç»å°±ç»ªï¼è¿ä¸ªè¿ç¨å¯è½ä¼é æè°ç¨çº¿ç¨è¿å ¥é»å¡ç¶æ,é£ä¹æ们æ以ä¸ä¸ç§æ¹å¼å¯ä»¥å¤éå¨ selectï¼ï¼æ¹æ³ä¸é»å¡ç线ç¨ã
wakeup()æ¹æ³ ï¼
éè¿è°ç¨ Selector 对象ç wakeupï¼ï¼æ¹æ³è®©å¤å¨é»å¡ç¶æçselect()æ¹æ³ç«å»è¿å(å¤éæä½)
该æ¹æ³ä½¿å¾éæ©å¨ä¸ç第ä¸ä¸ªè¿æ²¡æè¿åçéæ©æä½ç«å³è¿åãå¦æå½å没æè¿è¡ä¸çéæ©æä½ï¼é£ä¹ä¸ä¸æ¬¡å¯¹ select()æ¹æ³çä¸æ¬¡è°ç¨å°ç«å³è¿åã
close()æ¹æ³ ï¼
éè¿ closeï¼ï¼æ¹æ³å ³é Selectorï¼è¯¥æ¹æ³ä½¿å¾ä»»ä½ä¸ä¸ªå¨éæ©æä½ä¸é»å¡ç线ç¨é½è¢«å¤éï¼ç±»ä¼¼ wakeupï¼ï¼ï¼ï¼
åæ¶ä½¿å¾æ³¨åå°è¯¥ Selector çææ Channel 被注éï¼
ææçé®å°è¢«åæ¶ï¼ä½æ¯ Channelæ¬èº«å¹¶ä¸ä¼å
³é
ã
ä¸ã 示ä¾ä»£ç
1ãæå¡ç«¯ä»£ç
@Test
public void ServerDemo() {
try {
//è·åæå¡ç«¯éé
ServerSocketChannel ssc = ServerSocketChannel.open();
//ç»å®æå¡ç«¯ip端å£å·
ssc.socket().bind(new InetSocketAddress("127.0.0.1",8000));
//åæ¢éé»å¡æ¨¡å¼
ssc.configureBlocking(false);
//è·åselectoréæ©å¨
Selector selector = Selector.open();
// å°æå¡ç«¯channel注åå°éæ©å¨ä¸ï¼å¹¶ä¸æå®æå
´è¶£çäºä»¶æ¯ Accept
ssc.register(selector, SelectionKey.OP_ACCEPT);
//å建读/åç¼å²åº
ByteBuffer readBuff = ByteBuffer.allocate (1024);
ByteBuffer writeBuff = ByteBuffer.allocate (128);
//åå
¥æ°æ®
writeBuff.put("received".getBytes());
//åæ¢è¯»å模å¼
writeBuff.flip();
while (true) {
int nReady = selector.select();
//è·å就绪ç¶æéå
Set<SelectionKey> keys = selector.selectedKeys();
Iterator<SelectionKey> it = keys.iterator();
while (it.hasNext()) {
//è·åå°å°±ç»ªç¶æ
SelectionKey key = it.next();
it.remove();
//å¤ææ¯ä»ä¹ç¶æï¼å¯¹å¯¹åºæä½è¿è¡å¯¹åºå¤ç
if (key.isAcceptable()) {
// å建æ°çè¿æ¥ï¼å¹¶ä¸æè¿æ¥æ³¨åå° selector ä¸ï¼èä¸ï¼å£°æè¿ä¸ª channel åªå¯¹è¯»æä½æå
´è¶£ã
SocketChannel socketChannel = ssc.accept();
socketChannel.configureBlocking(false);
socketChannel.register(selector, SelectionKey.OP_READ);
}
else if (key.isReadable()) {
SocketChannel socketChannel = (SocketChannel) key.channel();
readBuff.clear();
socketChannel.read(readBuff);
readBuff.flip();
System.out.println("received : " + new String(readBuff.array()));
key.interestOps(SelectionKey.OP_WRITE);
}
else if (key.isWritable()) {
writeBuff.rewind();
SocketChannel socketChannel = (SocketChannel) key.channel();
socketChannel.write(writeBuff);
key.interestOps(SelectionKey. OP_READ );
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
2ã客æ·ç«¯ä»£ç
@Test
public void ClientDemo() {
try {
//è·åéé
SocketChannel socketChannel = SocketChannel.open();
//ç»å®ä¸»æºçip端å£å·
socketChannel.connect(new InetSocketAddress("127.0.0.1",8000));
//设置éé»å¡æ¨¡å¼
socketChannel.configureBlocking(false);
//å建buffer
ByteBuffer writeBuffer = ByteBuffer.allocate(32);
ByteBuffer readBuffer = ByteBuffer.allocate(32);
//ç»bufferåå
¥æ°æ®
writeBuffer.put("hello".getBytes());
//模å¼åæ¢
writeBuffer.flip();
while (true) {
writeBuffer.rewind();
//åå
¥ééæ°æ®
socketChannel.write(writeBuffer);
//å
³é
readBuffer.clear();
socketChannel.read(readBuffer);
}
} catch (IOException e) {
}
}
3 ãNIO ç¼ç¨æ¥éª¤æ»ç»
- 第ä¸æ¥ï¼å建 Selector éæ©å¨
- 第äºæ¥ï¼å建 ServerSocketChannel ééï¼å¹¶ç»å®çå¬ç«¯å£
- 第ä¸æ¥ï¼è®¾ç½® Channel ééæ¯éé»å¡æ¨¡å¼
- 第åæ¥ï¼æ Channel 注åå° Socketor éæ©å¨ä¸ï¼çå¬è¿æ¥äºä»¶
- 第äºæ¥ï¼è°ç¨ Selector ç select æ¹æ³ï¼å¾ªç¯è°ç¨ï¼ï¼çæµééç就绪ç¶åµ
- 第å æ¥ï¼è°ç¨ selectKeys æ¹æ³è·å就绪 channel éå
- 第ä¸æ¥ï¼éå就绪 channel éåï¼å¤æ就绪äºä»¶ç±»åï¼å®ç°å ·ä½çä¸å¡æä½
- ç¬¬å «æ¥ï¼æ ¹æ®ä¸å¡ï¼å³å®æ¯å¦éè¦å次注åçå¬äºä»¶ï¼éå¤æ§è¡ç¬¬ä¸æ¥æä½
Pipe & FileLock
ä¸ã Pipe
Java NIO 管éæ¯
2 个线ç¨ä¹é´çååæ°æ®è¿æ¥
ãPipe æä¸ä¸ª source ééåä¸ä¸ªsink ééãæ°æ®ä¼è¢«åå° sink ééï¼ä» source éé读åã
1ãå建管é
éè¿ Pipe.open()æ¹æ³
æå¼ç®¡é
ã
2ãåå ¥ç®¡é
è¦å管é
åæ°æ®
ï¼éè¦è®¿é® sink ééã
éè¿è°ç¨ SinkChannel ç write()æ¹æ³ï¼å°æ°æ®åå ¥ SinkChannelï¼
String newData = "New String to write to file..." + System.currentTimeMillis();
ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes());
buf.flip();
while(buf.hasRemaining()) {
sinkChannel.write(buf);
}
3ãä»ç®¡é读åæ°æ®
ä»
读å管éçæ°æ®
ï¼éè¦è®¿é® source ééï¼åè¿æ ·ï¼
è°ç¨ source ééç read()æ¹æ³æ¥è¯»åæ°æ®ï¼
ByteBuffer buf = ByteBuffer.allocate(48);
int bytesRead = sourceChannel.read(buf);
read()æ¹æ³è¿åç int å¼ä¼åè¯æ们å¤å°åè被读è¿äºç¼å²åºã
4ã示ä¾
@Test
public void testPipe() throws IOException {
// 1ãè·åéé
Pipe pipe = Pipe.open();
// 2ãè·å sink 管éï¼ç¨æ¥ä¼ éæ°æ®,å管é
Pipe.SinkChannel sinkChannel = pipe.sink();
// 3ãç³è¯·ä¸å®å¤§å°çç¼å²åº
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
byteBuffer.put("achang".getBytes());
byteBuffer.flip();
// 4ãsink åéæ°æ®,åå
¥æä½
sinkChannel.write(byteBuffer);
// 5ãå建æ¥æ¶ pipe æ°æ®ç source 管éï¼è¯»ç®¡é
Pipe.SourceChannel sourceChannel = pipe.source();
// 6ãæ¥æ¶æ°æ®ï¼å¹¶ä¿åå°ç¼å²åºä¸
ByteBuffer byteBuffer2 = ByteBuffer.allocate(1024);
int length = sourceChannel.read(byteBuffer2);
System.out.println(new String(byteBuffer2.array(), 0, length));
// 7ãå
³é
sourceChannel.close();
sinkChannel.close();
}
äºã FileLockæ件é
1ãFileLock ç®ä»
æ件é
å¨ OS ä¸å¾å¸¸è§ï¼å¦æå¤ä¸ªç¨åºåæ¶è®¿é®ãä¿®æ¹åä¸ä¸ªæ件ï¼å¾å®¹æå 为æ件æ°æ®ä¸åæ¥èåºç°é®é¢ãç»æ件å ä¸ä¸ªéï¼åä¸æ¶é´ï¼åªè½æä¸ä¸ªç¨åºä¿®æ¹æ¤æ件ï¼æè ç¨åºé½åªè½è¯»æ¤æ件ï¼è¿å°±è§£å³äºåæ¥é®é¢ã
æ件éæ¯è¿ç¨çº§å«çï¼ä¸æ¯çº¿ç¨çº§å«çãæ件éå¯ä»¥è§£å³å¤ä¸ªè¿ç¨å¹¶å访é®ãä¿®æ¹åä¸ä¸ªæ件çé®é¢ï¼ä½ä¸è½è§£å³å¤çº¿ç¨å¹¶å访é®ãä¿®æ¹åä¸æ件çé®é¢ã使ç¨æ件éæ¶ï¼åä¸è¿ç¨å çå¤ä¸ªçº¿ç¨ï¼å¯ä»¥åæ¶è®¿é®ãä¿®æ¹æ¤æ件ã
æ件éæ¯å½åç¨åºæå±ç JVM å®ä¾ææçï¼ä¸æ¦è·åå°æ件éï¼å¯¹æ件å éï¼ï¼è¦è°ç¨ release()ï¼æè
å
³é对åºç FileChannel 对象ï¼æè
å½å JVM éåºï¼æä¼éæ¾è¿ä¸ªé
ã
ä¸æ¦æ个è¿ç¨ï¼æ¯å¦è¯´ JVM å®ä¾ï¼å¯¹æ个æ件å éï¼åå¨éæ¾è¿ä¸ªéä¹åï¼æ¤è¿ç¨ä¸è½å对æ¤æ件å éï¼å°±æ¯è¯´ JVM å®ä¾å¨åä¸æ件ä¸çæ件éæ¯ä¸éå çï¼è¿ç¨çº§å«ä¸è½éå¤å¨åä¸æ件ä¸è·åéï¼ã
2ãæ件éåç±»ï¼
- æå®éï¼
- åå«ç¬å éã对æ件å æå®éåï¼è¯¥è¿ç¨å¯ä»¥å¯¹æ¤æ件è¿è¡è¯»åï¼è¯¥è¿ç¨ç¬å æ¤æ件ï¼å ¶ä»è¿ç¨ä¸è½è¯»åæ¤æ件ï¼ç´å°è¯¥è¿ç¨éæ¾æ件éã
- å
±äº«éï¼
- æ个è¿ç¨å¯¹æ件å å ±äº«éï¼å ¶ä»è¿ç¨ä¹å¯ä»¥è®¿é®æ¤æ件ï¼ä½è¿äºè¿ç¨é½åªè½è¯»æ¤æ件ï¼ä¸è½åã线ç¨æ¯å®å ¨çãåªè¦è¿æä¸ä¸ªè¿ç¨ææå ±äº«éï¼æ¤æ件就åªè½è¯»ï¼ä¸è½åã
3ã使ç¨ç¤ºä¾
//å建 FileChannel 对象ï¼æ件éåªè½éè¿ FileChannel 对象æ¥ä½¿ç¨
FileChannel fileChannel=new FileOutputStream("./1.txt").getChannel();
//对æ件å é
FileLock lock=fileChannel.lock();
//对æ¤æ件è¿è¡ä¸äºè¯»åæä½ã
//.......
//éæ¾é
lock.release();
æ件éè¦éè¿ FileChannel 对象使ç¨ã
4ãè·åæ件éæ¹æ³
- æ 4 ç§è·åæ件éçæ¹æ³ï¼
lock() ï¼
//对æ´ä¸ªæ件å éï¼é»è®¤ä¸ºæå®éã
lock(long position, long size, booean shared) //èªå®ä¹å éæ¹å¼ãå 2 个åæ°æå®è¦å éçé¨åï¼å¯ä»¥åªå¯¹æ¤æ件çé¨åå 容å éï¼ï¼ç¬¬ä¸ä¸ªåæ°å¼æå®æ¯å¦æ¯å ±äº«éã
tryLock() ï¼
//对æ´ä¸ªæ件å éï¼é»è®¤ä¸ºæå®éã
tryLock(long position, long size, booean shared)ï¼
//èªå®ä¹å éæ¹å¼ã
å¦ææå®ä¸ºå ±äº«éï¼åå ¶å®è¿ç¨å¯è¯»æ¤æ件ï¼ææè¿ç¨åä¸è½åæ¤æ件ï¼å¦ææè¿ç¨è¯å¾å¯¹æ¤æ件è¿è¡åæä½ï¼ä¼æåºå¼å¸¸ã
5ãlock ä¸ tryLock çåºå«ï¼
- lock æ¯
çï¼å¦ææªè·åå°æ件éï¼ä¼ä¸ç´é»å¡å½å线ç¨ï¼ç´å°è·åæ件étryLock å lock çä½ç¨ç¸åï¼åªä¸è¿ tryLock æ¯éé»å¡å¼çï¼é»å¡å¼
- tryLock æ¯å°è¯è·åæ件éï¼è·åæåå°±è¿åé对象ï¼å¦åè¿å nullï¼
å½å线ç¨ãä¸ä¼é»å¡
6ãFileLock 两个æ¹æ³ï¼
boolean isShared() //æ¤æ件éæ¯å¦æ¯å
±äº«é
boolean isValid() //æ¤æ件éæ¯å¦è¿ææ
å¨æäº OS ä¸ï¼å¯¹æ个æ件å éåï¼ä¸è½å¯¹æ¤æ件使ç¨ééæ å°ã
7ãå®æ´ä¾å
public class Demo1 {
public static void main(String[] args) throws IOException {
String input = "achang";
System.out.println("è¾å
¥ :" + input);
ByteBuffer buf = ByteBuffer.wrap(input.getBytes());
String filePath = "D:\\achang\\01.txt";
Path pt = Paths.get(filePath);
FileChannel channel = FileChannel.open(pt,
StandardOpenOption.WRITE,
StandardOpenOption.APPEND);
channel.position(channel.size() - 1); // position of a cursor at the end offile
//æ件è·åé
// è·å¾éæ¹æ³ä¸ï¼lock()ï¼é»å¡æ¹æ³ï¼å½æ件éä¸å¯ç¨æ¶ï¼å½åè¿ç¨ä¼è¢«æèµ·
//lock = channel.lock();// æ å lock()为ç¬å é
// lock = channel.lock(0L, Long.MAX_VALUE, true);æå lock()为å
±äº«éï¼æåæä½ä¼æ¥å¼å¸¸
// è·å¾éæ¹æ³äºï¼trylock()ï¼éé»å¡çæ¹æ³ï¼å½æ件éä¸å¯ç¨æ¶ï¼tryLock()ä¼å¾å° null å¼
FileLock lock = channel.tryLock(0,Long. MAX_VALUE ,false);
System.out.println("å
±äº«é shared: " + lock.isShared());
channel.write(buf);
channel.close(); // Releases the Lock
System.out.println("åæä½å®æ.");
//读åæ°æ®
readPrint (fp);
}
//读åæ°æ®
public static void readPrint(String path) throws IOException {
//éè¿å符æµè¯»å
FileReader filereader = new FileReader(path);
//å
è£
ç¼åæµ
BufferedReader bufferedreader = new BufferedReader(filereader);
String tr = bufferedreader.readLine();
System.out.println("读åå
容: ");
while (tr != null) {
System.out.println(" " + tr);
tr = bufferedreader.readLine();
}
//å
³é
filereader.close();
bufferedreader.close();
}
Path&Files&AsynchronousFileChannelå¼æ¥éé
ä¸ã Path
1ãPath ç®ä»
Java Path æ¥å£æ¯ Java NIO æ´æ°çä¸é¨åï¼å Java NIO ä¸èµ·å·²ç»å æ¬å¨ Java6 åJava7 ä¸ãJava Path æ¥å£æ¯å¨ Java7 ä¸æ·»å å° Java NIO çã
Path æ¥å£ä½äºjava.nio.file å ä¸ï¼æ以 Path æ¥å£çå®å ¨éå®å称为 java.nio.file.PathãJava Path å®ä¾è¡¨ç¤ºæ件系ç»ä¸çè·¯å¾ãä¸ä¸ªè·¯å¾å¯ä»¥æåä¸ä¸ªæ件æä¸ä¸ªç®å½ã
è·¯å¾å¯ä»¥æ¯ç»å¯¹è·¯å¾ï¼ä¹å¯ä»¥æ¯ç¸å¯¹è·¯å¾ãç»å¯¹è·¯å¾å å«ä»æ件系ç»çæ ¹ç®å½å°å®æåçæ件æç®å½çå®æ´è·¯å¾ãç¸å¯¹è·¯å¾å å«ç¸å¯¹äºå ¶ä»è·¯å¾çæ件æç®å½çè·¯å¾ã
å¨è®¸å¤æ¹é¢ï¼java.nio.file.Path æ¥å£
类似äºjava.io.File ç±»
ï¼ä½æ¯æä¸äºå·®å«ãä¸è¿ï¼å¨è®¸å¤æ åµä¸ï¼å¯ä»¥ä½¿ç¨ Path æ¥å£æ¥æ¿æ¢ File ç±»ç使ç¨ã
2ãå建 Path å®ä¾
ä½¿ç¨ java.nio.file.Path å®ä¾å¿ é¡»
å建ä¸ä¸ªPathå®ä¾
ã
å¯ä»¥ä½¿ç¨ Paths ç±»(java.nio.file.Paths)ä¸çéææ¹æ³
Paths.get()
æ¥å建路å¾å®ä¾ã
示ä¾ä»£ç :
import java.nio.file.Path;
import java.nio.file.Paths;
public class PathDemo {
public static void main(String[] args) {
Path path = Paths.get("d:\\achang\\001.txt");
}
}
ä¸è¿°ä»£ç ï¼å¯ä»¥ç解为ï¼Paths.get()æ¹æ³æ¯ Path å®ä¾çå·¥åæ¹æ³ã
3ãå建ç»å¯¹è·¯å¾
ï¼1ï¼å建ç»å¯¹è·¯å¾ï¼éè¿è°ç¨ Paths.get()æ¹æ³ï¼ç»å®ç»å¯¹è·¯å¾æ件ä½ä¸ºåæ°æ¥å®æã
示ä¾ä»£ç ï¼
ä¸è¿°ä»£ç ä¸ï¼ç»å¯¹è·¯å¾æ¯ d:\achang\001.txtãå¨ Java å符串ä¸ï¼ \æ¯ä¸ä¸ªè½¬ä¹å符ï¼éè¦ç¼å\ï¼åè¯ Java ç¼è¯å¨å¨å符串ä¸åå ¥ä¸ä¸ª\å符ã
ï¼2ï¼å¦æå¨
LinuxãMacOS
çæä½åä½ä¸ï¼ä¸é¢çç»å¯¹è·¯å¾å¯è½å¦ä¸:
ç»å¯¹è·¯å¾ç°å¨ä¸º/home/jakobjenkov/myfile.txt.
ï¼3ï¼å¦æå¨ Windows æºå¨ä¸ä½¿ç¨äºä»/å¼å§çè·¯å¾ï¼é£ä¹è·¯å¾å°è¢«è§£é为ç¸å¯¹äºå½å驱å¨å¨ã
4ãå建ç¸å¯¹è·¯å¾
Java NIO Path ç±»ä¹å¯ä»¥ç¨äºå¤çç¸å¯¹è·¯å¾ãæ¨å¯ä»¥ä½¿ç¨ Paths.get(basePath,relativePath)æ¹æ³å建ä¸ä¸ªç¸å¯¹è·¯å¾ã
示ä¾ä»£ç :
//d:\achang\projects
Path projects = Paths.get("d:\\achang", "projects");
//d:\achang\projects\002.txt
Path file = Paths.get("d:\\achang", "projects\\002.txt");
代ç 1 å建äºä¸ä¸ª Java Path çå®ä¾ï¼æåè·¯å¾(ç®å½):d:\achang\projects
代ç 2 å建äºä¸ä¸ª Path çå®ä¾ï¼æåè·¯å¾(æ件):d:\achang\projects\002.txt
5ãPath.normalize()
Path æ¥å£ç normalize()æ¹æ³å¯ä»¥ä½¿
è·¯å¾æ åå
ãæ ååæå³çå®å°ç§»é¤ææå¨è·¯å¾å符串çä¸é´ç.åâ¦ä»£ç ï¼å¹¶è§£æè·¯å¾å符串æå¼ç¨çè·¯å¾ã
Path.normalize()示ä¾:
String originalPath ="d:\\achang\\projects\\..\\yygh-project";
Path path1 = Paths. get (originalPath);
System. out .println("path1 = " + path1);
Path path2 = path1.normalize();//æ ååå¤ç
System. out .println("path2 = " + path2);
è¾åºç»æï¼æ ååçè·¯å¾ä¸å å« projectsâ¦é¨å
äºã Files
Java NIO Files ç±»(java.nio.file.Files)æä¾äºå ç§
æä½æ件系ç»ä¸çæ件çæ¹æ³
ã以ä¸å 容ä»ç» Java NIO Files æ常ç¨çä¸äºæ¹æ³ãjava.nio.file.Files ç±»ä¸java.nio.file.Path å®ä¾ä¸èµ·å·¥ä½ï¼å æ¤å¨å¦ä¹ Files ç±»ä¹åï¼éè¦å äºè§£ Path ç±»ã
1ãFiles.createDirectory()
Files.createDirectory()æ¹æ³ï¼ç¨äº
æ ¹æ® Path å®ä¾å建ä¸ä¸ªæ°ç®å½
示ä¾ï¼
Path path = Paths.get("d:\\sgg");
try {
//å建ä¸ä¸ªæ°ç®å½
Path newDir = Files.createDirectory(path);
} catch(FileAlreadyExistsException e){
// ç®å½å·²ç»åå¨
} catch (IOException e) {
// å
¶ä»åççå¼å¸¸
e.printStackTrace();
}
第ä¸è¡å建表示è¦å建çç®å½ç Path å®ä¾ãå¨ try-catch åä¸ï¼ç¨è·¯å¾ä½ä¸ºåæ°è°ç¨Files.createDirectory()æ¹æ³ãå¦æå建ç®å½æåï¼å°è¿åä¸ä¸ª Path å®ä¾ï¼è¯¥å®ä¾æåæ°å建çè·¯å¾ã
å¦æ该
ç®å½å·²ç»åå¨
ï¼åæ¯
æåºä¸ä¸ª java.nio.file.FileAlreadyExistsException
ã
å¦æåºç°å ¶ä»é误ï¼å¯è½ä¼æåº IOExceptionã
ä¾å¦ï¼å¦ææ³è¦çæ°ç®å½ç
ç¶ç®å½ä¸åå¨
ï¼åå¯è½ä¼æåº
IOException
ã
2ãFiles.copy()
ï¼1ï¼Files.copy()æ¹æ³ä»ä¸ä¸ªè·¯å¾æ·è´ä¸ä¸ªæ件å°å¦å¤ä¸ä¸ªç®å½
示ä¾ï¼
Path sourcePath = Paths.get("d:\\achang\\01.txt");
Path destinationPath = Paths.get("d:\\achang\\002.txt");
try {
//æ件å¤å¶æä½
Files.copy(sourcePath, destinationPath);
} catch(FileAlreadyExistsException e) {
// ç®å½å·²ç»åå¨
} catch (IOException e) {
// å
¶ä»åççå¼å¸¸
e.printStackTrace();
}
é¦å ï¼è¯¥ç¤ºä¾å建两个 Path å®ä¾ãç¶åï¼è¿ä¸ªä¾åè°ç¨ Files.copy()ï¼å°ä¸¤ä¸ª Pathå®ä¾ä½ä¸ºåæ°ä¼ éãè¿å¯ä»¥è®©æºè·¯å¾å¼ç¨çæ件被å¤å¶å°ç®æ è·¯å¾å¼ç¨çæ件ä¸ã
å¦æç®æ
æ件已ç»åå¨
ï¼åæåºä¸ä¸ª
java.nio.file.FileAlreadyExistsException å¼å¸¸
ã
å¦ææå ¶ä»é误ï¼åä¼æåºä¸ä¸ª IOExceptionã
ä¾å¦ï¼å¦æå°è¯¥æ件å¤å¶å°
ä¸åå¨çç®å½
ï¼åä¼æåº
IOException
ã
ï¼2ï¼è¦çå·²åå¨çæ件
Files.copy()æ¹æ³ç
第ä¸ä¸ªåæ°
ãå¦æç®æ æ件已ç»åå¨ï¼è¿ä¸ªåæ°æ示 copy()æ¹æ³
è¦çç°æçæ件
ã
StandardCopyOption.REPLACE_EXISTING
3ãFiles.move()
Files.move()ç¨äºå°æ件
ä»ä¸ä¸ªè·¯å¾ç§»å¨å°å¦ä¸ä¸ªè·¯å¾
ã
移å¨æ件ä¸éå½åç¸åï¼ä½æ¯ç§»å¨æ件æ¢å¯ä»¥ç§»å¨å°ä¸åçç®å½ï¼ä¹å¯ä»¥å¨ç¸åçæä½ä¸æ´æ¹å®çå称ã
示ä¾ï¼
Path sourcePath = Paths.get("d:\\achang\\01.txt");
Path destinationPath = Paths.get("d:\\achang\\001.txt");
try {
Files. move (sourcePath, destinationPath,StandardCopyOption. REPLACE_EXISTING );
} catch (IOException e) {
//移å¨æ件失败
e.printStackTrace();
}
Files.move()ç
第ä¸ä¸ªåæ°
ãè¿ä¸ªåæ°åè¯ Files.move()æ¹æ³æ¥
è¦ç
ç®æ è·¯å¾ä¸çä»»ä½ç°ææ件ã
4ãFiles.delete()
Files.delete()æ¹æ³å¯ä»¥
å é¤ä¸ä¸ªæ件æè
ç®å½
ã
示ä¾ï¼
Path path = Paths. get ("d:\\achang\\001.txt");
try {
Files.delete(path);
} catch (IOException e) {
// å é¤æ件失败
e.printStackTrace();
}
å建æåè¦å é¤çæ件ç Pathãç¶åè°ç¨ Files.delete()æ¹æ³ã
å¦æ Files.delete()ä¸è½å é¤æ件(ä¾å¦ï¼
æ件æç®å½ä¸åå¨
)ï¼ä¼æåºä¸ä¸ª
IOException
ã
5ãFiles.walkFileTree()
ï¼1ï¼Files.walkFileTree()æ¹æ³å å«
éå½éåç®å½æ
åè½ï¼å° Path å®ä¾å FileVisitorä½ä¸ºåæ°ãPath å®ä¾æåè¦éåçç®å½ï¼FileVisitor å¨éåæé´è¢«è°ç¨ã
ï¼2ï¼FileVisitor æ¯ä¸ä¸ªæ¥å£ï¼å¿ é¡»èªå·±å®ç° FileVisitor æ¥å£ï¼å¹¶å°å®ç°çå®ä¾ä¼ éç»walkFileTree()æ¹æ³ãå¨ç®å½éåè¿ç¨ä¸ï¼æ¨ç FileVisitor å®ç°çæ¯ä¸ªæ¹æ³é½å°è¢«è°ç¨ãå¦æä¸éè¦å®ç°ææè¿äºæ¹æ³ï¼é£ä¹å¯ä»¥æ©å± SimpleFileVisitor ç±»ï¼å®å å«FileVisitor æ¥å£ä¸æææ¹æ³çé»è®¤å®ç°ã
ï¼3ï¼FileVisitor æ¥å£çæ¹æ³ä¸ï¼æ¯ä¸ªé½è¿åä¸ä¸ª FileVisitResult æ举å®ä¾ã
FileVisitResult æ举å å«ä»¥ä¸å个é项:
- CONTINUE 继ç»
- TERMINATE ç»æ¢
- SKIP_SIBLING è·³è¿å级
- SKIP_SUBTREE è·³è¿å级
ï¼4ï¼æ¥æ¾ä¸ä¸ªå为 001.txt çæ件示ä¾ï¼
Path rootPath = Paths.get("d:\\achang");
String fileToFind = File.separator + "001.txt";
try {
Files.walkFileTree(rootPath, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
String fileString = file.toAbsolutePath().toString();
//System.out.println("pathString = " + fileString);
//æ¥è¿ä¸ªæ件æ¯å¦åå¨
if(fileString.endsWith(fileToFind)){
System.out.println("file found at path: " + file.toAbsolutePath());
//ç»æ¢æä½
return FileVisitResult.TERMINATE ;
}
//继ç»æä½
return FileVisitResult.CONTINUE ;
}
});
} catch(IOException e){
e.printStackTrace();
}
ï¼5ï¼java.nio.file.Files ç±»å å«è®¸å¤å ¶ä»çå½æ°ï¼æå ³è¿äºæ¹æ³çæ´å¤ä¿¡æ¯ï¼è¯·æ¥çjava.nio.file.Files ç±»ç JavaDocã
ä¸ã AsynchronousFileChannelå¼æ¥éé
å¨ Java 7 ä¸ï¼Java NIO ä¸æ·»å äº AsynchronousFileChannelï¼ä¹å°±æ¯æ¯
å¼æ¥å°å°æ°æ®åå
¥æ件
ã
1ãå建 AsynchronousFileChannel
éè¿éææ¹æ³ open()å建
示ä¾ï¼
Path path = Paths. get ("d:\\achang\\01.txt");
try {
//è·åå¼æ¥ééï¼æå®è¯»æä½StandardOpenOption.READ
AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path,StandardOpenOption.READ);
} catch (IOException e) {
e.printStackTrace();
}
open()æ¹æ³ç第ä¸ä¸ªåæ°æåä¸ AsynchronousFileChannel ç¸å ³èæ件ç Path å®ä¾ã
第äºä¸ªåæ°æ¯ä¸ä¸ªæå¤ä¸ªæå¼é项ï¼å®åè¯ AsynchronousFileChannel å¨æ件ä¸æ§è¡ä»ä¹æä½ã
å¨æ¬ä¾ä¸ï¼æ们使ç¨äº
StandardOpenOption.READ
é项ï¼è¡¨ç¤ºè¯¥æ件å°
被æå¼é
读
ã
2ãéè¿ Future 读åæ°æ®
å¯ä»¥éè¿ä¸¤ç§æ¹å¼ä» AsynchronousFileChannel 读åæ°æ®ã
第ä¸ç§æ¹å¼æ¯è°ç¨è¿åFuture ç read()æ¹æ³
示ä¾ï¼
Path path = Paths.get("d:\\achang\\001.txt");
AsynchronousFileChannel fileChannel = null;
try {
//å建äºä¸ä¸ª AsynchronousFileChannelå¼æ¥ééï¼æå®è¯»æä½StandardOpenOption.READ
fileChannel = AsynchronousFileChannel.open(path,StandardOpenOption.READ);
} catch (IOException e) {
e.printStackTrace();
}
//å建ä¸ä¸ª ByteBufferï¼å®è¢«ä¼ éç» read()æ¹æ³ä½ä¸ºåæ°ï¼ä»¥åä¸ä¸ª 0 çä½ç½®
ByteBuffer buffer = ByteBuffer.allocate(1024);
//å¨è°ç¨ read()ä¹åï¼å¾ªç¯
long position = 0;
Future<Integer> operation = fileChannel.read(buffer, position);
//ç´å°è¿åç isDone()æ¹æ³è¿å true
while(!operation.isDone());
//读åæä½å®æåï¼æ°æ®è¯»åå° ByteBuffer ä¸ï¼ç¶åæå°å° System.out ä¸
buffer.flip();
byte[] data = new byte[buffer.limit()];
buffer.get(data);
System.out.println(new String(data));//以å符串çå½¢å¼è¾åº
buffer.clear();
ä¸è¿°ä»£ç ï¼
ï¼1ï¼å建äºä¸ä¸ª AsynchronousFileChannelï¼
ï¼2ï¼å建ä¸ä¸ª ByteBufferï¼å®è¢«ä¼ éç» read()æ¹æ³ä½ä¸ºåæ°ï¼ä»¥åä¸ä¸ª 0 çä½ç½®ã
ï¼3ï¼å¨è°ç¨ read()ä¹åï¼å¾ªç¯ï¼ç´å°è¿åç isDone()æ¹æ³è¿å trueã
ï¼4ï¼è¯»åæä½å®æåï¼æ°æ®è¯»åå° ByteBuffer ä¸ï¼ç¶åæå°å° System.out ä¸ã
3ãéè¿ CompletionHandler 读åæ°æ®
æ¯ä¸é¢çæ¹å¼è¦ç®åäº
第äºç§æ¹æ³æ¯è°ç¨ read()æ¹æ³ï¼è¯¥æ¹æ³å°ä¸ä¸ª CompletionHandler ä½ä¸ºåæ°
示ä¾ï¼
Path path = Paths.get("d:\\achang\\001.txt");
AsynchronousFileChannel fileChannel = null;
try {
//è·åå¼æ¥ééï¼æå®è¯»æä½StandardOpenOption.READ
fileChannel = AsynchronousFileChannel.open(path,StandardOpenOption.READ);
} catch (IOException e) {
e.printStackTrace();
}
ByteBuffer buffer = ByteBuffer.allocate(1024);
long position = 0;
fileChannel.read(buffer, position, buffer, new CompletionHandler<Integer,
ByteBuffer>() {
//读åå®æä¹åä¼è°ç¨
@Override
public void completed(Integer result,ByteBuffer attachment) {
System.out.println("result = " + result);
attachment.flip();
byte[] data = new byte[attachment.limit()];
attachment.get(data);
System.out.println(new String(data));
attachment.clear();
}
//读å失败åè°ç¨
@Override
public void failed(Throwable exc, ByteBuffer attachment) {
}
});
ï¼1ï¼è¯»åæä½å®æï¼å°è°ç¨ CompletionHandler ç completed()æ¹æ³ã
ï¼2ï¼å¯¹äº completed()æ¹æ³çåæ°ä¼ éä¸ä¸ªæ´æ°ï¼å®åè¯æ们读åäºå¤å°åèï¼ä»¥åä¼ éç» read()æ¹æ³çâé件âãâé件âæ¯ read()æ¹æ³ç第ä¸ä¸ªåæ°ãå¨æ¬ä»£ç ä¸ï¼å®æ¯ ByteBufferï¼æ°æ®ä¹è¢«è¯»åã
ï¼3ï¼å¦æ读åæä½å¤±è´¥ï¼åå°è°ç¨ CompletionHandler ç failed()æ¹æ³ã
4ãéè¿ Future åæ°æ®
å读åä¸æ ·ï¼å¯ä»¥éè¿ä¸¤ç§æ¹å¼å°æ°æ®åå ¥ä¸ä¸ª AsynchronousFileChannel
示ä¾ï¼
Path path = Paths. get ("d:\\achang\\001.txt");
AsynchronousFileChannel fileChannel = null;
try {
//è·åå¼æ¥ééï¼æå®åæä½StandardOpenOption.WRITE
fileChannel = AsynchronousFileChannel.open(path,StandardOpenOption.WRITE);
} catch (IOException e) {
e.printStackTrace();
}
//å建bufferï¼å¹¶åå
¥æ°æ®
ByteBuffer buffer = ByteBuffer.allocate(1024);
long position = 0;
buffer.put("achang data".getBytes());
buffer.flip();//åæ¢å模å¼
//åæä½
Future<Integer> operation = fileChannel.write(buffer, position);
buffer.clear();
//å¤ææ¯å¦åå
¥å®æ
while(!operation.isDone());
System.out println("Write over");
é¦å ï¼AsynchronousFileChannel 以å模å¼æå¼ãç¶åå建ä¸ä¸ª ByteBufferï¼å¹¶å°ä¸äºæ°æ®åå ¥å ¶ä¸ãç¶åï¼ByteBuffer ä¸çæ°æ®è¢«åå ¥å°æ件ä¸ãæåï¼ç¤ºä¾æ£æ¥è¿åç Futureï¼ä»¥æ¥çåæä½å®ææ¶çæ åµã
注æï¼æä»¶å¿ é¡»å·²ç»åå¨ãå¦æ
该æ件ä¸åå¨
ï¼é£ä¹ write()æ¹æ³å°
æåºä¸ä¸ªjava.nio.file.NoSuchFileException
ã
5ãéè¿ CompletionHandler åæ°æ®
示ä¾ï¼
Path path = Paths.get("d:\\achang\\001.txt");
//æ件ä¸åå¨å°±å建
if(!Files.exists(path)){
try {
Files.createFile(path);
} catch (IOException e) {
e.printStackTrace();
}
}
AsynchronousFileChannel fileChannel = null;
try {
//è·åå¼æ¥ééï¼æå®åæä½StandardOpenOption.WRITE
fileChannel = AsynchronousFileChannel.open(path,StandardOpenOption.WRITE);
} catch (IOException e) {
e.printStackTrace();
}
//å建bufferï¼å¹¶åå
¥æ°æ®
ByteBuffer buffer = ByteBuffer.allocate 1024);
long position = 0;
buffer.put("achang data".getBytes());
buffer.flip();//åæ¢ä¸ºåæä½
//åæä½
fileChannel.write(buffer, position, buffer, new CompletionHandler<Integer,
ByteBuffer>() {
//åå
¥å®æåä¼è°ç¨
@Override
public void completed(Integer result, ByteBuffer attachment) {
System.out.println("bytes written: " + result);
}
//åå
¥å¤±è´¥åè°ç¨
@Override
public void failed(Throwable exc, ByteBuffer attachment) {
System.out.println("Write failed");
exc.printStackTrace();
}
});
å½åæä½å®ææ¶ï¼å°ä¼è°ç¨ CompletionHandler ç completed()æ¹æ³ã
å¦æå失败ï¼åä¼è°ç¨ failed()æ¹æ³ã
1.4 å符éï¼Charset ï¼
java ä¸ä½¿ç¨ Charset æ¥è¡¨ç¤ºå符éç¼ç 对象
- Charset 常ç¨éææ¹æ³
public static Charset forName(String charsetName)//éè¿ç¼ç ç±»åè·å¾ Charset 对象
public static SortedMap<String,Charset> availableCharsets()//è·å¾ç³»ç»æ¯æçææç¼ç æ¹å¼
public static Charset defaultCharset()//è·å¾èææºé»è®¤çç¼ç æ¹å¼
public static boolean isSupported(String charsetName)//å¤ææ¯å¦æ¯æ该ç¼ç ç±»å
- Charset 常ç¨æ®éæ¹æ³
public final String name()//è·å¾ Charset 对象çç¼ç ç±»å(String)
public abstract CharsetEncoder newEncoder()//è·å¾ç¼ç å¨å¯¹è±¡
public abstract CharsetDecoder newDecoder()//è·å¾è§£ç å¨å¯¹è±¡
- 代ç 示ä¾ï¼
@Test
public void charSetEncoderAndDecoder() throws
CharacterCodingException {
//0.è·åCharset对象
Charset charset=Charset.forName("UTF-8");
//1.è·åç¼ç å¨å¯¹è±¡
CharsetEncoder charsetEncoder=charset.newEncoder();
//2.è·å解ç å¨å¯¹è±¡
CharsetDecoder charsetDecoder=charset.newDecoder();
//3.å建bufferç¼å²åºå¯¹è±¡ï¼å¹¶åå
¥æ°æ®
CharBuffer charBuffer=CharBuffer.allocate(1024);
charBuffer.put("achangæ°æ®");
charBuffer.flip();//转æ¢è¯»å模å¼
//4.éè¿ç¼ç å¨å¯¹è±¡ï¼è¿è¡ç¼ç
ByteBuffer byteBuffer=charsetEncoder.encode(charBuffer);
System.out.println("ç¼ç åï¼");
for (int i=0;i<byteBuffer.limit();i++) {
System.out.println(byteBuffer.get());
}
//5.解ç
byteBuffer.flip();//读ååæ¢
//éè¿è§£ç å¨å¯¹è±¡ï¼è¿è¡è§£ç
CharBuffer charBuffer1=charsetDecoder.decode(byteBuffer);
System.out.println("解ç åï¼");
System.out.println(charBuffer1.toString());
System.out.println("æå®å
¶ä»æ ¼å¼è§£ç :");
Charset charset1=Charset.forName("GBK");
byteBuffer.flip//读ååæ¢
CharBuffer charBuffer2 =charset1.decode(byteBuffer);
System.out.println(charBuffer2.toString());
//6.è·å Charset ææ¯æçå符ç¼ç
Map<String ,Charset> map= Charset.availableCharsets();
Set<Map.Entry<String,Charset>> set=map.entrySet();
for (ap.Entry<String,Charset> entry: set) {
System. out .println(entry.getKey()+"="+entry.getValue().toString());
}
}