2015-10-05 78 views
0

在我的應用程序中,我使用Files.write和org.jclouds.blobstore.domain.Blob.putBlob將一個字節數組寫入4MB文件。兩者以並行方式。第二個選項(jcloud)更快。將字節數組寫入文件的快速方法

我想知道是否有更快的方法來寫入一個字節數組到文件中。如果我實現我的Files.write它更好。

由於

+1

正如目前所提出的那樣,問題太過情境化。您需要提供更多的上下文 - 使其成爲特定的*問題,理想情況下使用MCVE,以便我們能夠有效回答。 –

回答

0

我看着代碼,和(令人驚訝)Files.write(Path, byte[], OpenOption ...)使用8192個字節的固定大小的緩衝器寫入該文件。 (Java 7 & Java 8版本)

您應該可以通過直接寫入來獲得更好的性能;例如

byte[] bytes = ... 
    try (FileOutputStream fos = new FileOutputStream(...)) { 
     fos.write(bytes); 
    } 
+0

我會測試。謝謝 –

0

我做了兩個程序。首先使用Files.write,然後使用FileOutputStream創建4個4MB的文件。 Files.write耗時47秒,FileOutputStream 53秒。

public class TestFileWrite { 

    public static void main(String[] args) { 
     try { 
      Path path = Paths.get("/home/felipe/teste.txt"); 
      byte[] data = Files.readAllBytes(path); 

      SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-DD HH:mm:ss"); 
      System.out.println("TestFileWrite"); 
      System.out.println("start: " + sdf.format(new Date())); 
      for (int i = 0; i < 1000; i++) { 
       Files.write(Paths.get("/home/felipe/Test/testFileWrite/file" + i + ".txt"), data); 
      } 
      System.out.println("end: " + sdf.format(new Date())); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 



public class TestOutputStream { 

    public static void main(String[] args) { 
     Path path = Paths.get("/home/felipe/teste.txt"); 
     byte[] data = null; 
     try { 
      data = Files.readAllBytes(path); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 

     SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-DD HH:mm:ss"); 
     System.out.println("TestOutputStream"); 
     System.out.println("start: " + sdf.format(new Date())); 

     for (int i = 0; i < 1000; i++) { 
      try (OutputStream out = new FileOutputStream("/home/felipe/Test/testOutputStream/file" + i + ".txt")) { 
       out.write(data); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      // Files.write(Paths.get("), data); 
     } 
     System.out.println("end: " + sdf.format(new Date())); 
    } 
} 
+0

在數據寫入磁盤之前,文件系統高速緩存可能會使文件寫入完成。您的基準似乎不允許這樣做。 –

相關問題