## 1 æ¦è¿°  卿´ä¸ª Java.io å 䏿éè¦çå°±æ¯5个类åä¸ä¸ªæ¥å£ã 5ä¸ªç±»ï¼ - File - OutputStream - InputStream - Writer - Reader ä¸ä¸ªæ¥å£ï¼ - Serializable Java I/O主è¦å æ¬å¦ä¸3屿¬¡ï¼ * æµå¼é¨åââæä¸»è¦é¨åï¼å **æ¬åèæµãå符æµ**ï¼å¦ï¼OutputStreamãInputStreamãWriterãReader ç * éæµå¼é¨åââå¦ï¼FileãRandomAccessFile å FileDescriptor ç * å ¶ä»ââæä»¶è¯»åé¨åçä¸å®å ¨ç¸å ³çç±»ï¼å¦ï¼SerializablePermission ï¼ä»¥å䏿¬å°æä½ç³»ç»ç¸å ³çæä»¶ç³»ç»çç±»ï¼å¦ï¼FileSystem å Win32FileSystem å WinNTFileSystem ## 2 åç±»  ### 2.1 æI/Oç±»åæ¥æ»ä½åç±» * Memory * ä»/åå åæ°ç»è¯»åæ°æ®: CharArrayReaderã CharArrayWriterãByteArrayInputStreamãByteArrayOutputStream * ä»/åå ååç¬¦ä¸²è¯»åæ°æ® :StringReaderãStringWriterãStringBufferInputStream * Pipe 管é å®ç°ç®¡éçè¾å ¥åè¾åºï¼è¿ç¨é´éä¿¡ï¼: PipedReaderãPipedWriterãPipedInputStreamãPipedOutputStream * File æä»¶æµ 对æä»¶è¿è¡è¯»ãåæä½ ï¼FileReaderãFileWriterãFileInputStreamãFileOutputStream * ObjectSerialization 对象è¾å ¥ãè¾åº ï¼ObjectInputStreamãObjectOutputStream * DataConversion æ°æ®æµ æåºæ¬æ°æ®ç±»å读ãåï¼å¤ççæ°æ®æ¯Javaçåºæ¬ç±»åï¼å¦å¸å°åï¼åèï¼æ´æ°åæµ®ç¹æ°ï¼ï¼ï¼DataInputStreamãDataOutputStream * Printing å 嫿¹ä¾¿çæå°æ¹æ³ ï¼PrintWriterãPrintStream * Buffering ç¼å² å¨è¯»å ¥æååºæ¶ï¼å¯¹æ°æ®è¿è¡ç¼åï¼ä»¥åå°I/Oçæ¬¡æ°ï¼BufferedReaderãBufferedWriterãBufferedInputStreamãBufferedOutputStream * Filtering 滤æµï¼å¨æ°æ®è¿è¡è¯»æåæ¶è¿è¡è¿æ»¤ï¼FilterReaderãFilterWriterãFilterInputStreamãFilterOutputStreamè¿ * Concatenation åå¹¶è¾å ¥ æå¤ä¸ªè¾å ¥æµè¿æ¥æä¸ä¸ªè¾å ¥æµ ï¼SequenceInputStream * Counting è®¡æ° å¨è¯»å ¥æ°æ®æ¶å¯¹è¡è®°æ° ï¼LineNumberReaderãLineNumberInputStream * Peeking Ahead éè¿ç¼åæºå¶ï¼è¿è¡é¢è¯» ï¼PushbackReaderãPushbackInputStream * Converting between Bytes and Charactersï¼æç §ä¸å®çç¼ç /è§£ç æ åå°åèæµè½¬æ¢ä¸ºå符æµï¼æè¿è¡åå转æ¢ï¼Streamå°Reader,Writerç转æ¢ç±»ï¼ï¼InputStreamReaderãOutputStreamWriter ### 2.2 ææ°æ®æ¥æºï¼å»åï¼åç±» * Fileï¼æä»¶ï¼ï¼FileInputStreamãFileOutputStreamã FileReaderãFileWriter * byte[]ï¼ByteArrayInputStreamãByteArrayOutputStream * Char[]ï¼CharArrayReaderãCharArrayWriter * Stringï¼StringBufferInputStreamãStringReaderãStringWriter * ç½ç»æ°æ®æµï¼InputStreamãOutputStreamãReaderãWriter * åèæµï¼InputStream / OutputStream ## 3 常ç¨ç±» ### 3.1 File File ç±»å¯ä»¥ç¨äºè¡¨ç¤ºæä»¶åç®å½çä¿¡æ¯ã ```java //读åç®å½ public class TestFile { public static void main(String args[]) { String dirname = "/tmp"; File f1 = new File(dirname); if (f1.isDirectory()) { System.out.println("ç®å½ " + dirname); String s[] = f1.list(); for (int i = 0; i < s.length; i++) { File f = new File(dirname + "/" + s[i]); if (f.isDirectory()) { System.out.println(s[i] + " æ¯ä¸ä¸ªç®å½"); } else { System.out.println(s[i] + " æ¯ä¸ä¸ªæä»¶"); } } } else { System.out.println(dirname + " 䏿¯ä¸ä¸ªç®å½"); } } } ``` ### 3.2 FileInputStream 该æµç¨äºä»æä»¶è¯»åæ°æ®ï¼å®ç对象å¯ä»¥ç¨å ³é®å new æ¥å建ã ```java File file = new File("F:/abc.txt"); FileInputStream fis = new FileInputStream(file); ``` ### 3.3 FileInputStream ç¨æ¥å¤ç以æä»¶ä½ä¸ºæ°æ®è¾åºç®çæ°æ®æµï¼æè 说æ¯ä»å ååºè¯»æ°æ®å ¥æä»¶ã ```java File file = new File("F:/abc.txt"); FileOutputStream fos = new FileOutputStream (file); ``` ### 3.4 ç¼å²è¾å ¥è¾åºæµ BufferedInputStream / BufferedOutputStream ç¼å²æµå°±æ¯æ¯ä¸ä¸ªæ°æ®æµåé ä¸ä¸ªç¼å²åºï¼ä¸ä¸ªç¼å²åºå°±æ¯ä¸ä¸ªä¸´æ¶å卿°æ®çå åãè¿æ ·å¯ä»¥åå°è®¿é®ç¡¬ççæ¬¡æ°,æé«ä¼ è¾æçã BufferedInputStream:å½åç¼å²æµåå ¥æ°æ®æ¶åï¼æ°æ®å åå°ç¼å²åºï¼å¾ ç¼å²åºå满åï¼ç³»ç»ä¸æ¬¡æ§å°æ°æ®åéç»è¾åºè®¾å¤ã BufferedOutputStream :å½ä»åç¼å²æµè¯»åæ°æ®æ¶åï¼ç³»ç»å ä»ç¼å²åºè¯»åºæ°æ®ï¼å¾ ç¼å²åºä¸ºç©ºæ¶ï¼ç³»ç»åä»è¾å ¥è®¾å¤è¯»åæ°æ®å°ç¼å²åºã ```java //å°æä»¶è¯»å ¥å å FileInputStream fis = new FileInputStream("F:/abc.txt"); BufferedInputStream bis = new BufferedInputStream(fis); //å°å ååå ¥æä»¶ FileOutputStream fos = new FileOutputStream("F:/abc.txt"); BufferedOutputStream bos = new BufferedOutputStream (fos); ``` ### 3.5 BufferedReader 读åå符ã ```java //卿§å¶å°è¯»åå符 public class TestReader { public static void main(String args[]) throws IOException { char c; // ä½¿ç¨ System.in å建 BufferedReader BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("è¾å ¥å符, æä¸ 'q' é®éåºã"); // 读åå符 do { c = (char) br.read();//读åä¸ä¸ªå符 System.out.println(c); } while (c != 'q'); } } ``` ### 3.6 ObjectOutputStream/ObjectInputStream åºååï¼å°ä¸ä¸ªå¯¹è±¡è½¬æ¢æåèåºåï¼æ¹ä¾¿åå¨åä¼ è¾ã - åºååï¼ObjectOutputStream.writeObject() - ååºååï¼ObjectInputStream.readObject() ä¸ä¼å¯¹éæåéè¿è¡åºååï¼å 为åºåååªæ¯ä¿å对象çç¶æï¼éæåéå±äºç±»çç¶æã ```java public class TestObjectStream { private static class Person implements Serializable { private String name; private int age; //ä¿è¯å±æ§ä¸ä¼è¢«åºåå private transient String des; public Person(String name, int age,String des) { this.name = name; this.age = age; this.des = des; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getDes() { return des; } public void setDes(String des) { this.des = des; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", des='" + des + '\'' + '}'; } } public static void main(String[] args) throws Exception { Person p1 = new Person("å¼ ä¸", 29,"ä¸ç¥é"); String objectFile = "person.data"; System.out.println(p1); ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(objectFile)); objectOutputStream.writeObject(p1); objectOutputStream.close(); ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(objectFile)); Person p2 = (Person) objectInputStream.readObject(); objectInputStream.close(); System.out.println(p2);//Person{name='å¼ ä¸', age=29, des='null'} } } ``` ## 4 BIOãNIOãAIO ### 4.1 IO模å主è¦åç±» - 忥(synchronous) IOå弿¥(asynchronous) IO - é»å¡(blocking) IOåéé»å¡(non-blocking)IO - 忥é»å¡(blocking-IO)ç®ç§°BIO - 忥éé»å¡(non-blocking-IO)ç®ç§°NIO - 弿¥éé»å¡(asynchronous-non-blocking-IO)ç®ç§°AIO ### 4.2 BIOï¼åæ¥é»å¡I/O) æ°æ®ç读ååå ¥å¿ é¡»é»å¡å¨ä¸ä¸ªçº¿ç¨å çå¾ å ¶å®æï¼**é¢åæµ**ã æ¯å¦æ³¡é¢ï¼è¿ç§æ¨¡å¼ä¸ï¼éè¦ä¸ç´åçï¼ä¸è½å¹²å ¶ä»äºï¼çæ³¡é¢æ³¡å¥½ã ### 4.3 NIOï¼åæ¥éé»å¡I/O) å¨ Java 1.4 ä¸å¼å ¥äº NIO æ¡æ¶ï¼å¯¹åº java.nio å ï¼æä¾äº **Channel , Selectorï¼Buffer **çæ½è±¡ã宿¯æé¢å**ç¼å²ç**ï¼åºäºééçI/Oæä½æ¹æ³ã æ¯å¦æ³¡é¢ï¼è¿ç§æ¨¡å¼ä¸ï¼ä¸éè¦ä¸ç´åçï¼å¯ä»¥å»ççµå½±ï¼ä½ï¼è¿å ç§å°±å»ççæ³¡é¢æ³¡å¥½äºæ²¡æã #### 4.3.1 Bufferï¼ç¼å²åºï¼ Bufferæ¯ä¸ä¸ªå¯¹è±¡ï¼å®å å«ä¸äºè¦åå ¥æè è¦è¯»åºçæ°æ®ã #### 4.3.2 Channelï¼ééï¼ NIO éè¿Channelï¼ééï¼ è¿è¡è¯»åã é鿝ååçï¼å¯è¯»ä¹å¯åï¼èæµçè¯»åæ¯ååçãæ è®ºè¯»åï¼ééåªè½åBuffer交äºãå 为 Bufferï¼ééå¯ä»¥å¼æ¥å°è¯»åã #### 4.3.3 Selectorï¼éæ©å¨ï¼ éæ©å¨ç¨äºä½¿ç¨å个线ç¨å¤çå¤ä¸ªééãå æ¤ï¼å®éè¦è¾å°ççº¿ç¨æ¥å¤çè¿äºééã线ç¨ä¹é´çåæ¢å¯¹äºæä½ç³»ç»æ¥è¯´æ¯æè´µçã å æ¤ï¼ä¸ºäºæé«ç³»ç»æç鿩卿¯æç¨çã #### 4.3.3 NIO è¯»æ°æ®ååæ°æ®æ¹å¼ NIOä¸çææIO齿¯ä» Channelï¼ééï¼ å¼å§çã - ä»ééè¿è¡æ°æ®è¯»å ï¼å建ä¸ä¸ªç¼å²åºï¼ç¶å请æ±ééè¯»åæ°æ®ã - ä»ééè¿è¡æ°æ®åå ¥ ï¼å建ä¸ä¸ªç¼å²åºï¼å¡«å æ°æ®ï¼å¹¶è¦æ±ééåå ¥æ°æ®ã  ### 4.4 AIOï¼å¼æ¥éé»å¡I/O) AIO ä¹å°±æ¯ NIO 2ï¼å¼æ¥IOç缩åãå¨ Java 7 ä¸å¼å ¥äº NIO çæ¹è¿ç NIO 2,宿¯å¼æ¥éé»å¡çIO模åã弿¥ IO æ¯åºäºäºä»¶ååè°æºå¶å®ç°çï¼ä¹å°±æ¯åºç¨æä½ä¹åä¼ç´æ¥è¿åï¼ä¸ä¼å µå¡å¨é£éï¼å½åå°å¤çå®æï¼æä½ç³»ç»ä¼éç¥ç¸åºç线ç¨è¿è¡åç»çæä½ã è½ç¶ NIO å¨ç½ç»æä½ä¸ï¼æä¾äºéé»å¡çæ¹æ³ï¼ä½æ¯ NIO ç IO è¡ä¸ºè¿æ¯åæ¥çãå¯¹äº NIO æ¥è¯´ï¼æä»¬çä¸å¡çº¿ç¨æ¯å¨ IO æä½åå¤å¥½æ¶ï¼å¾å°éç¥ï¼æ¥çå°±ç±è¿ä¸ªçº¿ç¨èªè¡è¿è¡ IO æä½ï¼IOæä½æ¬èº«æ¯åæ¥çã æ¯å¦æ³¡é¢ï¼è¿ç§æ¨¡å¼ä¸ï¼ä¸éè¦ä¸ç´åçï¼ä¹ä¸éè¦è¿å ç§å°±æ¯ççï¼å¯ä»¥å»ççµå½±ï¼ç»æ³¡é¢å®è£ ä¸ä¸ªé¹éï¼æ³¡å¥½äºï¼å°±éç¥ã ### 4.5 BIOãNIOãAIOéç¨åºæ¯ - BIOï¼éç¨äºè¿æ¥æ°ç®æ¯è¾å°ä¸åºå®çæ¶æï¼è¿ç§æ¹å¼å¯¹æå¡å¨èµæºè¦æ±æ¯è¾é«ï¼å¹¶åå±éäºåºç¨ä¸ï¼JDK1.4以åçå¯ä¸éæ©ã - NIOï¼éç¨äºè¿æ¥æ°ç®å¤ä¸è¿æ¥æ¯è¾çï¼è½»æä½ï¼çæ¶æï¼æ¯å¦è天æå¡å¨ï¼å¹¶åå±éäºåºç¨ä¸ï¼ç¼ç¨æ¯è¾å¤æã - AIOï¼ä½¿ç¨äºè¿æ¥æ°ç®å¤ä¸è¿æ¥æ¯è¾é¿ï¼éæä½ï¼çæ¶æï¼æ¯å¦ç¸åæå¡å¨ï¼å åè°ç¨ OS åä¸å¹¶åæä½ï¼ç¼ç¨æ¯è¾å¤æï¼JDK7å¼å§æ¯æã