java如何更快生成00000000~99999999的8位数字保存到文件中?

双人鱼XKQ 发布于 01/14 00:16
阅读 3K+
收藏 6

想生成一个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();
			}
		}
	}

 

加载中
1
canghailan
canghailan
@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

boystudio
boystudio
数据全部内存中处理了,会占用大量内存。
臭水沟
臭水沟
加一个 parallel() 速度会快一点
火山火
火山火
回复 @tcxu : 用CharBuffer.allocate(9216000) 写入 9680ms
tcxu
tcxu
回复 @canghailan : 谢谢你的回答。看来,你的机器 (java8 mac 11744)用了 11744ms , 比 我的机器 好些。
canghailan
canghailan
回复 @tcxu : 基本取决于硬盘写入速度
下一页
2
开源中国首席金三胖
foy
foy
回复 @双人鱼XKQ : 就是人才啊
双人鱼XKQ
双人鱼XKQ
什么意思?
0
淡茗
淡茗
每一个数字都打开一次文件当然慢了,你打开一次再循环写会快很多啊
双人鱼XKQ
双人鱼XKQ
意思是把File f=new File(path)作为参数传进去写入文件方法是吗?
0
周金桥
周金桥
可以用buffer,buffer的容量大小为100W数字的字符串形式容量左右,达到这个容量打开文件一次性写入,然后清空buffer继续循环。
0
公孙二狗
公孙二狗
AtomicLong atomicLong = new AtomicLong(-1); // 直接使用 Long 即可
0
双人鱼XKQ
双人鱼XKQ
有什么区别吗?
0
孤星闵月
孤星闵月
第一:你每一个数字都重新打开一次文件,就是最傻的一件事,第二:你这有没有并发问题,干嘛还要用原子操作
冰红茶盖
冰红茶盖
不能同意更多
0
LeoXu1990
LeoXu1990
forfor循环能犯的问题基本都有了
0
酷酷的就
酷酷的就

你可以开100个进程写啦 

0
影风优
影风优
这样写,是不是要完蛋!
返回顶部
顶部