2013-04-17 130 views
3

我對Java NIO很陌生,沒有掌握它。關於Java NIO,我知道它是快速的,然後java.IO.IO和NIO性能差異和示例

所以,只是爲了試一試,我想爲 「複製一個文件的內容到另一個文件」編寫簡單的程序。 「從大文件搜索一個詞」。

同時使用java.io和java.nio包。

此外,我已分別在操作開始和結束之前和之後打印時間。

我沒有發現任何差異,因此NIO更快。可能是我走錯了方向。

任何人都可以請指導我通過場景,我可以通過示例正確看到區別?

編輯:

我真的很驚訝地知道,這個問題會得到反對票。 我剛纔提到我是NIO的新手,並且指導我如果走錯了方向。 我還沒有發佈程序,因爲它是非常基本的讀寫操作...請參見下面的程序我用來測試....

使用IO

public static void copyFile(File in, File out) throws Exception { 

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
    Date now = new Date(); 
    String strDate = sdf.format(now); 

    System.out.println("Before Read :"+strDate); 


    FileInputStream fis = new FileInputStream(in); 
    FileOutputStream fos = new FileOutputStream(out); 
    try { 
     byte[] buf = new byte[1024]; 
     int i = 0; 
     while ((i = fis.read(buf)) != -1) { 
      fos.write(buf, 0, i); 
     } 
    } 
    catch (Exception e) { 
     throw e; 
    } 
    finally { 
     if (fis != null) fis.close(); 
     if (fos != null) fos.close(); 
    } 

    Date now1 = new Date(); 
    String strDate1 = sdf.format(now1); 

    System.out.println("After Read :"+strDate1); 


} 

使用NIO

public static void copyFile(File in, File out) 
     throws IOException 
{ 

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
    Date now = new Date(); 
    String strDate = sdf.format(now); 

    System.out.println("Before Read :"+strDate); 

    FileChannel inChannel = new 
     FileInputStream(in).getChannel(); 
    FileChannel outChannel = new 
     FileOutputStream(out).getChannel(); 
    try { 
     inChannel.transferTo(0, inChannel.size(), 
       outChannel); 
    } 
    catch (IOException e) { 
     throw e; 
    } 
    finally { 
     if (inChannel != null) inChannel.close(); 
     if (outChannel != null) outChannel.close(); 
    } 

    Date now1 = new Date(); 
    String strDate1 = sdf.format(now1); 

    System.out.println("After Read :"+strDate1); 
} 

我從一個文件複製到另一個文件的文件大約爲20 MB。

+0

爲什麼不顯示用於比較的代碼?也許有一個錯誤是放緩NIO版本。 –

+0

您應該使用比1024更大的緩衝區。這些天的磁盤簇大小至少爲4096,並且不應低於此值。你必須在循環中調用transferTo();不保證在一次通話中完成。 – EJP

回答

4

NIO允許你只使用一個(或更少)的線程管理多個頻道,但付出的代價是,解析數據可能有點從讀取數據時更復雜使用標準IO阻塞流。

如果您需要同時管理數千個打開的連接(每個連接只發送一點數據,例如聊天服務器),那麼在NIO中實現服務器可能是一個優勢。同樣,如果你需要保持與其他計算機的大量開放連接,例如在P2P網絡中,使用單個線程來管理所有出站連接可能是一個優勢。

如果您擁有較少帶寬的連接,一次發送大量數據,那麼標準的IO服務器實現應該是您的選擇。

Ref:Difference between standard IO and NIO