你可以尝试删除BufferedWriter并直接使用FileWriter。在现代系统上,无论如何,你很有可能只是写入驱动器的缓存。
我需要4-5秒的时间来写入175MB(400万个字符串)-这是在运行Windows XP和80GB,7200-RPM日立磁盘的双核2.4GHz戴尔上进行的。
你能否确定记录检索有多少时间和文件写入有多少时间?
import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.Writer;import java.util.ArrayList;import java.util.List;public class FileWritingPerfTest {private static final int ITERATIONS = 5;private static final double MEG = (Math.pow(1024, 2));private static final int RECORD_COUNT = 4000000;private static final String RECORD = "Help I am trapped in a fortune cookie factoryn";private static final int RECSIZE = RECORD.getBytes().length;public static void main(String[] args) throws Exception { List<String> records = new ArrayList<String>(RECORD_COUNT); int size = 0; for (int i = 0; i < RECORD_COUNT; i++) { records.add(RECORD); size += RECSIZE; } System.out.println(records.size() + " 'records'"); System.out.println(size / MEG + " MB"); for (int i = 0; i < ITERATIONS; i++) { System.out.println("nIteration " + i); writeRaw(records); writeBuffered(records, 8192); writeBuffered(records, (int) MEG); writeBuffered(records, 4 * (int) MEG); }}private static void writeRaw(List<String> records) throws IOException { File file = File.createTempFile("foo", ".txt"); try { FileWriter writer = new FileWriter(file); System.out.print("Writing raw... "); write(records, writer); } finally { // comment this out if you want to inspect the files afterward file.delete(); }}private static void writeBuffered(List<String> records, int bufSize) throws IOException { File file = File.createTempFile("foo", ".txt"); try { FileWriter writer = new FileWriter(file); BufferedWriter bufferedWriter = new BufferedWriter(writer, bufSize); System.out.print("Writing buffered (buffer size: " + bufSize + ")... "); write(records, bufferedWriter); } finally { // comment this out if you want to inspect the files afterward file.delete(); }}private static void write(List<String> records, Writer writer) throws IOException { long start = System.currentTimeMillis(); for (String record: records) { writer.write(record); } writer.flush(); writer.close(); long end = System.currentTimeMillis(); System.out.println((end - start) / 1000f + " seconds");}}


