12 KiB
????
Java ?? I/O ???????????????
- ?????????File
- ????????InputStream ?? OutputStream
- ?????????Reader ?? Writer
- ?????????Serializable
- ?????????Socket
- ??????? IO??NIO
???????
File ????????????????????????????????????????????????????????????
??????
Java I/O ???????????????????? InputStream ?????InputStream ??????????FileInputStream ?? InputStream ??????????????????????????????????????FilterInputStream ????????????????????????????????????????????????? BufferedInputStream ? FileInputStream ??????????????????????§Ý??œ¤????????????????????? FileInputStream ????????????? BufferedInputStream ????¨À?
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
DataInputStream ?????????????????????????????????????? int??double ??????????
????????????§Ö???????????????
byte[] buf = new byte[20*1024];
int bytes = 0;
// ????? buf.length ????????????????????????????? -1 ??????????? eof???????¦Â
while((bytes = in.read(buf, 0 , buf.length)) != -1) {
// ...
}
???????
???????????????×Ï????§³??›¥?????????????????????????? I/O ????????????????????????????????§Ó??????????????????????????????????????§Ó??????????
InputStreamReader ?????????????????????????????OutputStreamWriter ??????????????????????????????????????? Reader ?? Writer??
????????????????????????????????????????????
byte[] bytes = str.getBytes(encoding); // ????
String str = new String(bytes, encoding)?? // ????
GBK ?????§µ?????? 2 ?????????? 1 ??????UTF-8 ?????§µ?????? 3 ?????????? 1 ??????Java ?????????? UTF-16be???????????? 2 ??????
????????????????¨°??????????????????????
???????
???§Ý????????????????????????§µ?????›¥?????
???§Ý???ObjectOutputStream.writeObject()
?????§Ý???ObjectInputStream.readObject()
???§Ý??????????? Serializable ?????????????????????¦Ê¦Ç??????????
transient ??????????§»??????????§Ý???
ArrayList ???§Ý???????§Ý????????ArrayList ?§Õ›¥????????????? transient ???¦Å???????????????????????????????§Ö????????????????????§Ö???????????§Ý????????§Õ???§Ý???????§Ý?????????????????§Ý????????????????????????
private transient Object[] elementData;
???????
Java ?§Ö?????????
- InetAddress????????????????????????? IP ?????
- URL?????????¦Ë??????? URL ?????????????§Õ??????????????
- Sockets????? TCP §¿?????????????
- Datagram????? UDP §¿?????????????
1. InetAddress
??§Û??§Û??????????????????????????????????? InetAddress.getByName(String host)??InetAddress.getByAddress(byte[] addr)??
2. URL
???????? URL ?§Ø???????????
URL url = new URL("http://www.baidu.com");
InputStream is = url.openStream(); // ?????
InputStreamReader isr = new InputStreamReader(is, "utf-8"); // ?????
BufferedReader br = new BufferedReader(isr);
String line = br.readLine();
while (line != null) {
System.out.println(line);
line = br.readLine();
}
br.close();
isr.close();
is.close();
3. Sockets
Socket ??????
- ServerSocket????????????
- Socket?????????
??????????????? InputStream ?? OutputStream ?????????????
4. Datagram
- DatagramPacket?????????
- DatagramSocket???????
NIO
NIO ???????? I/O ???? ( ??????????????? ) ?????????????? ??????????????????????????????????
1. ?????
I/O ?? NIO ?????????????????????????????????????????I/O ??????????????????? NIO ???????????????
???????? I/O ???????????§Õ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? I/O ?????????
????????? I/O ??????????????????????????????????§Ó??????????????????î•???ø„????????????????????????????????? I/O ????§»???????? I/O ?????§Ö????????????
I/O ???? NIO ?????????????java.io.* ????? NIO ????????????????????????????????? NIO ???§»????????íà java.io.* ???§Ö??§»??????????????§Õ??????????????¨¹????????????????§µ??????????????
2. ?????????
2.1 ???
??? Channel ???? I/O ???§Ö??????????????????????§Õ???????
????????????????????????????????????????(??????????? InputStream ???? OutputStream ??????)?? ???????????????????????§Õ???????????§Õ??
????????????????
- FileChannel????????§Ø?§Õ?????
- DatagramChannel????? UDP ??§Õ???????????
- SocketChannel????? TCP ??§Õ???????????
- ServerSocketChannel???????????????? TCP ?????????????????????????????? SocketChannel??
2.2 ??????
????????????????§Ø???????????????????§µ?????????????§Ø?????¦Ê??????????????????§³???????????????????????§Ø?§Õ??????????????????????
???????????????????ï…??????????????????î•?????????????????????????????????????????/§Õ?????
???????????????????
- ByteBuffer
- CharBuffer
- ShortBuffer
- IntBuffer
- LongBuffer
- FloatBuffer
- DoubleBuffer
3. ????????????
- capacity???????????
- position??????????§Õ?????????
- limit?????????§Õ?????????
??????????????
1. ????????§³? 8 ???????????????? position ? 0???? limit == capacity == 9??capacity ???????????????????????????
2. ??????????§Ø?? 3 ?????????§Õ???????§µ???? position ?????? 3??limit ???????
3. ???????????????§Õ???????????????????? flip() ??????????????? limit ???????? position?????? position ????? 0??
4. ?????????? 4 ??????????????§µ???? position ??? 4??
5. ?????????? clear() ??????????????????? position ?? limit ????????????¦Ë?¨¢?
4. ??§Õ??????
1. ?????????????? FileInputStream???????? FileInputStream ??????? FileChannel??
FileInputStream fin = new FileInputStream("readandshow.txt");
FileChannel fic = fin.getChannel();
2. ???????????? 1024 ?? Buffer
ByteBuffer buffer = ByteBuffer.allocate(1024);
3. ??????????? FileChannel §Õ?? Buffer ?§µ??????????????? read() ???????? -1
int r = fcin.read(buffer);
if (r == -1) {
break;
}
4. ??§Õ?????????? FileOutputStream???????? FileOutputStream ?????? FileChannel
FileOutputStream fout = new FileOutputStream("writesomebytes.txt");
FileChannel foc = fout.getChannel();
5. ???? flip() ?§Ý???§Õ
buffer.flip();
6. ?? Buffer ?§Ö???????????? FileChannel ??
foc.write(buffer);
7. ?????? clear() ?????????
buffer.clear();
5. ???????????
??????FileChannel ?????§Ý?????????????????? Channel ?????
5.1 ????? I/O
????? I/O ????? InputStream.read() ?????????????????????????????????????? ServerSocket.accept() ???????????????????§á??????????????????????????????????????????????????????????????
5.2 ??????? I/O
?????????????????????§Ö? I/O ???????????????
??????????????????????????????????????????????
???????????????? wait()??notify() ?????????????????????§Ý???????????????????¦Í??????§Ý???
6. ????????
6.1 ServerSocketChannel
???????????????? ServerSocketChannel ?????????????
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.configureBlocking(false); // ???????????
ServerSocket ss = ssc.socket();
InetSocketAddress address = new InetSocketAddress(ports[i]);
ss.bind(address); // ?????
6.2 Selectors
?? I/O ??? Selector ??????? I/O ???????? ?D ?????????????????????????????????????????????????????????
???? Selectors ?????????????????????? register() ??????register() ????????????????? Selector????????????? OP_ACCEPT?????????????????????? accept ????????????????????????????????????
SelectionKey ????????????? Selector ?????????????? Selector ????????????????????????????????????? SelectionKey ?????§Ö??SelectionKey ?????????????????????
Selector selector = Selector.open();
SelectionKey key = ssc.register(selector, SelectionKey.OP_ACCEPT);
6.3 ?????
???????????? Selector ?? select() ??????????????????????????????????????????????????????????????????????? select() ?????????????????????????????
??????????????? Selector ?? selectedKeys() ?????????????????????? SelectionKey ???????? ???? ??
??????????? SelectionKeys ?????¦Ä?????? SelectionKey ??????????????????? SelectionKey????????????????????? I/O ???????????????????§» I/O ????
int num = selector.select();
Set selectedKeys = selector.selectedKeys();
Iterator it = selectedKeys.iterator();
while (it.hasNext()) {
SelectionKey key = (SelectionKey)it.next();
// ... deal with I/O event ...
}
6.4 ??????????
??????§Ö??????????????? ServerSocketChannel??????????????????????????????????????? SelectionKey ???? readyOps() ??????????ú€????????????????
if ((key.readyOps() & SelectionKey.OP_ACCEPT)
== SelectionKey.OP_ACCEPT) {
// Accept the new connection
// ...
}
??????????? readOps() ??????????????????????????
6.5 ???????????
?????????????????????????????????????????????????????????????????????????????? accept() ????????????
ServerSocketChannel ssc = (ServerSocketChannel)key.channel();
SocketChannel sc = ssc.accept();
??????????????? SocketChannel ??????????????????????????????????????????????????????????????????????? SocketChannel ??? Selector????????????
sc.configureBlocking( false );
SelectionKey newKey = sc.register( selector, SelectionKey.OP_READ );
?????????? register() ?? OP_READ ???????? SocketChannel ??????? ??? ?????? ???? ???????
6.6 ?????????? SelectionKey
????? SelectionKey ???????????????????????????????????????????????? SelectionKey ????????????????????????????????????????????????????????????????????????????????????????????¦Ä????????????????????? remove() ???????????????? SelectionKey??
it.remove();
???????????????????????????????????§Õ????????(???????????? I/O ???)???
6.7 ????? I/O
?????????????????????????????????? I/O ??????????????????§Ö??? Selector.select()????????????????? I/O ?????????¦²? SelectionKey ???????? OP_READ ??????????????
} else if ((key.readyOps() & SelectionKey.OP_READ)
== SelectionKey.OP_READ) {
// Read the data
SocketChannel sc = (SocketChannel)key.channel();
// ...
}
?¦Ï?????
- Eckel B, ????? , ??? , ?? . Java ?????? [M]. ??§Ö????????? , 2002.
- IBM: NIO ????
- ??????? Java I/O ?????????
- NIO ??? IO ??????