Подтвердить что ты не робот

Самый быстрый способ записи в файл?

Я сделал метод, который принимает File и String. Он заменяет файл новым файлом с этой строкой в ​​качестве его содержимого.

Это то, что я сделал:

public static void Save(File file, String textToSave) {

    file.delete();
    try {
        BufferedWriter out = new BufferedWriter(new FileWriter(file));
        out.write(textToSave);
        out.close();
    } catch (IOException e) {
    }
}

Однако это очень медленно. Это иногда занимает более минуты.

Как я могу писать большие файлы с десятками тысяч, может быть, до миллиона символов в них?

4b9b3361

Ответ 1

Убедитесь, что вы выделили достаточно большой буфер:

BufferedWriter out = new BufferedWriter(new FileWriter(file), 32768);

В какой ОС вы работаете? Это тоже может иметь большое значение. Тем не менее, за минуту, чтобы записать файл размером менее огромного размера, звучит как системная проблема. В Linux или других * ix-системах вы можете использовать такие вещи, как strace, чтобы увидеть, создает ли JVM множество ненужных системных вызовов. (Очень давно Java I/O был довольно глупым и сделал бы безумные номера низкоуровневых системных вызовов write(), если бы вы не были осторожны, но когда я говорю "давно", я имею в виду 1998 или около того.)

edit — обратите внимание, что ситуация с Java-программой, написанной простым файлом простым способом и, тем не менее, очень медленной, по своей природе является нечетной. Можете ли вы сказать, сильно ли загружен процессор, когда файл записывается? Это не должно быть; от такой вещи почти не будет нагрузки процессора.

Ответ 2

Простой тест для вас

char[] chars = new char[100*1024*1024];
Arrays.fill(chars, 'A');
String text = new String(chars);
long start = System.nanoTime();
BufferedWriter bw = new BufferedWriter(new FileWriter("/tmp/a.txt"));
bw.write(text);
bw.close();
long time = System.nanoTime() - start;
System.out.println("Wrote " + chars.length*1000L/time+" MB/s.");

Печать

Wrote 135 MB/s.

Ответ 4

Попробуйте использовать файлы с отображением памяти:

FileChannel rwChannel = new RandomAccessFile("textfile.txt", "rw").getChannel();
ByteBuffer wrBuf = rwChannel.map(FileChannel.MapMode.READ_WRITE, 0, textToSave.length());

wrBuf.put(textToSave.getBytes());

rwChannel.close();

Ответ 5

В Java BufferWriter работает очень медленно: используйте собственные методы напрямую и назовите их как можно меньше (дайте им как можно больше данных за звонок).

    try{
        FileOutputStream file=new FileOutputStream(file);
        file.write(content);
        file.close();
    }catch(Throwable e){
        D.error(e);
    }//try

Кроме того, удаление файла может занять некоторое время (возможно, оно сначала копируется в корзину). Просто перезапишите файл, как в приведенном выше коде.