java如何更快生成00000000~99999999的8位数字保存到文件中?
想生成一个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();
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(19)
你可以开100个进程写啦
第一:你每一个数字都重新打开一次文件,就是最傻的一件事,第二:你这有没有并发问题,干嘛还要用原子操作
不能同意更多
forfor循环能犯的问题基本都有了
有什么区别吗?
可以用buffer,buffer的容量大小为100W数字的字符串形式容量左右,达到这个容量打开文件一次性写入,然后清空buffer继续循环。
意思是把File f=new File(path)作为参数传进去写入文件方法是吗?
每一个数字都打开一次文件当然慢了,你打开一次再循环写会快很多啊
你的代码之所以会这么慢主要因为两个半半点:
1:你循环多少次就打开多少次文件。
2:你用了
你应该先转换成String再用substring来整理....
另外半点:你循环多了个0...并且还循环System.out.println()?????
现在我将你的代码重新整理如下,生成的速度也是正常的十秒,十秒,十秒...
substring的方法是借鉴了一楼的,一楼的写法是JDK1.8后的新颖写法,但是那么写用了十秒,而与楼主你一对比,就显得是新版本的代码能有效率的多,其实不是这样的,而是楼主的代码有一部分的问题导致了慢...只要修改下代码就可以与一楼的代码效率一致了。。。
最后想说的是:把分给我吧!!!
什么意思?
回复
@双人鱼XKQ : 就是人才啊
人才!
回复
@tcxu : 基本取决于硬盘写入速度
回复
@canghailan : 谢谢你的回答。看来,你的机器 (java8 mac 11744)用了 11744ms , 比 我的机器 好些。
回复
@tcxu : 用CharBuffer.allocate(9216000) 写入 9680ms
加一个 parallel() 速度会快一点
数据全部内存中处理了,会占用大量内存。
java8 mac 11744ms