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

发布于 2022-01-01 13:28:45 字数 1263 浏览 863 评论 19

想生成一个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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(19

温柔少女心 2022-01-08 06:12:43

你可以开100个进程写啦 

贱贱哒 2022-01-08 06:12:42

第一:你每一个数字都重新打开一次文件,就是最傻的一件事,第二:你这有没有并发问题,干嘛还要用原子操作

偏爱自由 2022-01-08 06:12:42

不能同意更多

柳若烟 2022-01-08 06:12:42

forfor循环能犯的问题基本都有了

最偏执的依靠 2022-01-08 06:12:40

有什么区别吗?

南汐寒笙箫 2022-01-08 06:12:36
AtomicLong atomicLong = new AtomicLong(-1); // 直接使用 Long 即可
柠檬 2022-01-08 06:12:22

可以用buffer,buffer的容量大小为100W数字的字符串形式容量左右,达到这个容量打开文件一次性写入,然后清空buffer继续循环。

狼亦尘 2022-01-08 06:11:18

意思是把File f=new File(path)作为参数传进去写入文件方法是吗?

居里长安 2022-01-08 06:10:34

每一个数字都打开一次文件当然慢了,你打开一次再循环写会快很多啊

好听的两个字的网名 2022-01-08 06:06:21

你的代码之所以会这么慢主要因为两个半半点:

1:你循环多少次就打开多少次文件。

2:你用了

String.format("%08d", atLong)

你应该先转换成String再用substring来整理....

另外半点:你循环多了个0...并且还循环System.out.println()?????

现在我将你的代码重新整理如下,生成的速度也是正常的十秒,十秒,十秒...

public class Main {
	public static void main(String[] args) throws Exception {
		 long t = System.currentTimeMillis();
		 FileOperationUtil.bufferedWriteTest();
		 System.out.println((System.currentTimeMillis() - t) + "ms");
		
	}
	
}

 


import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.atomic.AtomicLong;

public class FileOperationUtil {
	
	public static void bufferedWriteTest() {
	
		File f = new File("D://你的文件的名字.txt");

		OutputStreamWriter writer = null;
		BufferedWriter bw = null;
		try {
			OutputStream os = new FileOutputStream(f, true);
			writer = new OutputStreamWriter(os);
			bw = new BufferedWriter(writer);
			
			AtomicLong atomicLong = new AtomicLong(-1);
			Long atLong = null;
			String str;
			for (Integer i = 0; i < 100000000 ; i++) {
				str = i.toString();
				str = "00000000".substring(0, "00000000".length() - str.length()) + str + "n";
				bw.write(str);
			}
			
			bw.flush();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				bw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	
}

 

substring的方法是借鉴了一楼的,一楼的写法是JDK1.8后的新颖写法,但是那么写用了十秒,而与楼主你一对比,就显得是新版本的代码能有效率的多,其实不是这样的,而是楼主的代码有一部分的问题导致了慢...只要修改下代码就可以与一楼的代码效率一致了。。。

最后想说的是:把分给我吧!!!

 

长安忆 2022-01-08 06:01:21

什么意思?

瀞厅☆埖开 2022-01-08 05:58:41

回复
@双人鱼XKQ : 就是人才啊

猫九 2022-01-08 05:32:26

人才!

惜醉颜 2022-01-08 03:16:04

回复
@tcxu : 基本取决于硬盘写入速度

坏尐絯 2022-01-08 02:38:12

回复
@canghailan : 谢谢你的回答。看来,你的机器 (java8 mac 11744)用了 11744ms , 比 我的机器 好些。

天涯离梦残月幽梦 2022-01-07 20:39:50

回复
@tcxu : 用CharBuffer.allocate(9216000) 写入 9680ms

夜司空 2022-01-06 07:55:17

加一个 parallel() 速度会快一点

丢了幸福的猪 2022-01-04 00:54:03

数据全部内存中处理了,会占用大量内存。

平生欢 2022-01-02 15:11:51
@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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文