用Java将整数数组写入文件的最快方法?

用Java将整数数组写入文件的最快方法?,第1张

用Java将整数数组写入文件的最快方法?

我看了三个选择:

  1. 使用
    DataOutputStream
    ;
  2. 使用
    ObjectOutputStream
    (对于
    Serializable
    对象而言
    int[]
    );和
  3. 使用
    FileChannel

结果是

DataOutputStream wrote 1,000,000 ints in 3,159.716 msObjectOutputStream wrote 1,000,000 ints in 295.602 msFileChannel wrote 1,000,000 ints in 110.094 ms

因此NIO版本是最快的。它还具有允许编辑的优点,这意味着您可以轻松更改一个int,而这

ObjectOutputStream
将需要读取整个数组,对其进行修改并将其写到文件中。

代码如下:

private static final int NUM_INTS = 1000000;interface IntWriter {  void write(int[] ints);}public static void main(String[] args) {  int[] ints = new int[NUM_INTS];  Random r = new Random();  for (int i=0; i<NUM_INTS; i++) {    ints[i] = r.nextInt();  }  time("DataOutputStream", new IntWriter() {    public void write(int[] ints) {      storeDO(ints);    }  }, ints);  time("ObjectOutputStream", new IntWriter() {    public void write(int[] ints) {      storeOO(ints);    }  }, ints);  time("FileChannel", new IntWriter() {    public void write(int[] ints) {      storeFC(ints);    }  }, ints);}private static void time(String name, IntWriter writer, int[] ints) {  long start = System.nanoTime();  writer.write(ints);  long end = System.nanoTime();  double ms = (end - start) / 1000000d;  System.out.printf("%s wrote %,d ints in %,.3f ms%n", name, ints.length, ms);}private static void storeOO(int[] ints) {  ObjectOutputStream out = null;  try {    out = new ObjectOutputStream(new FileOutputStream("object.out"));    out.writeObject(ints);  } catch (IOException e) {    throw new RuntimeException(e);  } finally {    safeClose(out);  }}private static void storeDO(int[] ints) {  DataOutputStream out = null;  try {    out = new DataOutputStream(new FileOutputStream("data.out"));    for (int anInt : ints) {      out.write(anInt);    }  } catch (IOException e) {    throw new RuntimeException(e);  } finally {    safeClose(out);  }}private static void storeFC(int[] ints) {  FileOutputStream out = null;  try {    out = new FileOutputStream("fc.out");    FileChannel file = out.getChannel();    ByteBuffer buf = file.map(FileChannel.MapMode.READ_WRITE, 0, 4 * ints.length);    for (int i : ints) {      buf.putInt(i);    }    file.close();  } catch (IOException e) {    throw new RuntimeException(e);  } finally {    safeClose(out);  }}private static void safeClose(OutputStream out) {  try {    if (out != null) {      out.close();    }  } catch (IOException e) {    // do nothing  }}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5438853.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存