1. 程式人生 > >IO // NIO 實現方式比較

IO // NIO 實現方式比較

69、Java 中有幾種型別的流?

答:位元組流,字元流。位元組流繼承於InputStream、OutputStream,字元流繼承於Reader、Writer。在java.io 包中還有許多其他的流,主要是為了提高效能和使用方便。

補充:關於Java的IO需要注意的有兩點:一是兩種對稱性(輸入和輸出的對稱性,位元組和字元的對稱性);二是兩種設計模式(介面卡模式和裝潢模式)。另外Java中的流不同於C#的是它只有一個維度一個方向。

補充:下面用IO和NIO兩種方式實現檔案拷貝,這個題目在面試的時候是經常被問到的。

  1. package com.lovo;  
  2. import java.io.FileInputStream;  
  3. import java.io.FileOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.io.OutputStream;  
  7. import java.nio.ByteBuffer;  
  8. import java.nio.channels.FileChannel;  
  9. publicclass MyUtil {  
  10.     private MyUtil() {  
  11.         thrownew AssertionError();  
  12.     }  
  13.     public
    staticvoid fileCopy(String source, String target) throws IOException {  
  14.         try (InputStream in = new FileInputStream(source)) {  
  15.             try (OutputStream out = new FileOutputStream(target)) {  
  16.                 byte[] buffer = newbyte[4096];  
  17.                 int bytesToRead;  
  18.                 while
    ((bytesToRead = in.read(buffer)) != -1) {  
  19.                     out.write(buffer, 0, bytesToRead);  
  20.                 }  
  21.             }  
  22.         }  
  23.     }  
  24.     publicstaticvoid fileCopyNIO(String source, String target) throws IOException {  
  25.         try (FileInputStream in = new FileInputStream(source)) {  
  26.             try (FileOutputStream out = new FileOutputStream(target)) {  
  27.                 FileChannel inChannel = in.getChannel();  
  28.                 FileChannel outChannel = out.getChannel();  
  29.                 ByteBuffer buffer = ByteBuffer.allocate(4096);  
  30.                 while(inChannel.read(buffer) != -1) {  
  31.                     buffer.flip();  
  32.                     outChannel.write(buffer);  
  33.                     buffer.clear();  
  34.                 }  
  35.             }  
  36.         }  
  37.     }  
  38. }