2015-10-05 126 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

在数据写入磁盘之前,文件系统高速缓存可能会使文件写入完成。您的基准似乎不允许这样做。 –

相关问题