30
回答
java如何更快生成00000000~99999999的8位数字保存到文件中?
华为云4核8G,高性能云服务器,免费试用   

想生成一个8位数字,但是感觉好慢,计算了一下差不多得用2.5个小时左右。有没有更快的方法呢?最好写出代码解释下。以下是我的代码,还请大神指点优化一下。

public class Main {
	public static void main(String[] args) {
		// 生成8位数密码
		Generator.gen8Num();
	}
}

生成数字并写入文件

/**
	 * 8位数字密码生成器
	 * 
	 * @param strs
	 */
	public static void gen8Num() {
		AtomicLong atomicLong = new AtomicLong(-1);
		for (int i = 0; i < 1000000000; i++) {
			Long atLong = atomicLong.incrementAndGet();
			FileOperationUtil.bufferedWriteTest(filePath_8Num, String.format("%08d", atLong));
		}
	}

写入文件

public static void bufferedWriteTest(String filePath, String str) {
		File f = new File(filePath);
		OutputStreamWriter writer = null;
		BufferedWriter bw = null;
		try {
			OutputStream os = new FileOutputStream(f, true);
			writer = new OutputStreamWriter(os);
			bw = new BufferedWriter(writer);
			System.out.println(str);
			bw.write(str + "\n");
			bw.flush();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				bw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

 

举报
双人鱼XKQ
发帖于6个月前 30回/2K+阅
共有30个答案 最后回答: 3个月前
@Test
public void test() throws Exception {
    long t = System.currentTimeMillis();
    // 打开文件
    try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("a.txt"), StandardCharsets.UTF_8))) {
        IntStream.range(0, 99999999 + 1) // 遍历
                .mapToObj(String::valueOf) // 转为字符串
                .map(s -> "00000000".substring(0, "00000000".length() - s.length()) + s + "\n") // 补0,换行
                .forEach(s -> {
                    // 写入文件
                    try {
                        writer.write(s);
                    } catch (IOException e) {
                        throw new UncheckedIOException(e);
                    }
                });
        writer.flush();
    }
    System.out.println((System.currentTimeMillis() - t) + "ms");
}

java8 mac 11744ms

--- 共有 8 条评论 ---
boystudio数据全部内存中处理了,会占用大量内存。 5个月前 回复
臭水沟加一个 parallel() 速度会快一点 5个月前 回复
火山火 回复 @tcxu : 用CharBuffer.allocate(9216000) 写入 9680ms 6个月前 回复
tcxu 回复 @canghailan : 谢谢你的回答。看来,你的机器 (java8 mac 11744)用了 11744ms , 比 我的机器 好些。 6个月前 回复
canghailan 回复 @tcxu : 基本取决于硬盘写入速度 6个月前 回复
可以用buffer,buffer的容量大小为100W数字的字符串形式容量左右,达到这个容量打开文件一次性写入,然后清空buffer继续循环。
顶部