我看了三个选择:
- 使用
DataOutputStream
; - 使用
ObjectOutputStream
(对于Serializable
对象而言int[]
);和 - 使用
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 }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)