`
chai1020
  • 浏览: 18659 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java 瞬间快速创建固定大小文件,毫秒级。。。

阅读更多

    最近突发奇想java能不能快速创建固定大小的文件,类似迅雷下载的时候会先创建一个和下载文件同样大小的文件占位,以避免空间不足下载失败。

    在网上搜索一番发现提出这个问题的还真不少,但是很少就解决办法,最多的解决办法就是循环向文件里面入固定大小的空字节,但这个方法的弊端就是创建大文件很费力,我试了创建2GB的文件大概需要50秒左右,最快也要三四十秒,再大的文件就更慢了,这也许跟我电脑配置有关系,但是这跟迅雷那种瞬间创建文件实在是相差太多了。

 

    这使得我很沮丧,但是昨天无意间发现java有一个类:FileChannel,查阅API发现通过这个类来实现复制文件比简单的循环读取写入可能会高效得多,很多操作系统可将字节直接从文件系统缓存传输到目标通道,而无需实际复制各字节。这使我想到使用它能不能快速的创建大文件呢!所以我写了一个测试方法,结果让我大吃一惊,创建一个2GB的大文件只需要90毫秒,你没看错,是毫秒,我试了创建更大的文件10GB,20GB,150GB,所用时间都是100毫秒左右,太令人吃惊了。这种快乐的事情当然要分享给大家了下面进入正题。

 

    通过FileChannel类的 int write(ByteBuffer src, long position) throws IOException 方法可以在指定position位置写入字节,position大于文件长度的话,前面的部分会填充为空字节0。我们这种创建固定大小的空文件之需要在最后一个位置写入一个空字节0就可以使文件扩大到我们想要的长度,下面是我写的测试。

 

 

	/**
	 * 创建固定大小的文件
	 * @param file
	 * @param length
	 * @throws IOException 
	 */
	public static void createFixLengthFile(File file, long length) throws IOException{
		long start = System.currentTimeMillis();
		FileOutputStream fos = null;
		FileChannel output = null;
		try {
			fos = new FileOutputStream(file);
			output = fos.getChannel();
			output.write(ByteBuffer.allocate(1), length-1);
		} finally {
			try {
				if (output != null) {
					output.close();
				}
				if (fos != null) {
					fos.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		long end = System.currentTimeMillis();
		System.out.println("total times "+(end-start));
	}

 

    写了这么多是想跟大家分享一下自己的发现与学习的过程,在技术的道路上充满乐趣,不断发现,不断探索,乐在其中。

2013-08-26:今天发现 RandomAccessFile 能够更方便,更直观的实现,两者效率相差无几,但这应该是更推荐的一种方式。

public static void create(File file, long length) throws IOException{
		long start = System.currentTimeMillis();
		RandomAccessFile r = null;
		try {
			r = new RandomAccessFile(file, "rw");
			r.setLength(length);
		} finally{
			if (r != null) {
				try {
					r.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		long end = System.currentTimeMillis();
		System.out.println(end-start);
		
	}

 

    假如帮到你的话,请留下你的评论。欢迎转载(请标明出处),希望能帮助到更多的人。

 

 

分享到:
评论

相关推荐

    易语言毫秒级时间

    在压缩包内的"易语言毫秒级时间源码"文件中,很可能会包含具体的示例代码,展示如何在易语言中调用这些函数,实现毫秒级时间的获取和操作。这些源码可以帮助我们更好地理解如何在实际项目中运用这些技术。 总的来说...

    java文件夹按时间、大小等排序

    我们可以创建`File`对象来代表一个具体的文件或目录,然后通过这个对象获取文件的各种属性,如创建时间、修改时间以及文件大小等。 对于文件夹内的文件按照时间排序,我们可以利用`File`类的`lastModified()`方法,...

    Java获得文件创建时间

    在Java编程语言中,获取文件的创建时间是一个常见的任务,特别是在处理文件系统操作时。Java提供了多种方式来访问文件的时间属性,包括创建时间、最后访问时间和最后修改时间。以下将详细讲解如何在Java中获取文件的...

    java 获取指定日期(带毫秒)13位时间戳

    java 获取指定日期(带毫秒)的 13位时间戳 ,获取当前时间的时间戳 一句话就可以System.currentTimeMillis();

    毫秒级计数器下载毫秒级计数器下载毫秒级计数器下载毫秒级计数器下载

    综上所述,这个压缩包文件包含了一个毫秒级计数器的实现及其测试,使用C++编写,并且可能支持在Windows环境中显示结果。开发人员可以通过CPUTicker类在代码中方便地插入计时点,从而测量代码段的执行时间,这对于...

    java文字记忆毫秒计时器

    在Java中,可以使用`java.io.FileWriter`或`java.nio.file.Files`类来创建和写入TXT文件。每个词语及其对应的记忆时间作为一个条目,可能以特定的格式(如:词语+时间)写入文件,方便后期的数据分析。 为了实现...

    java8 localtime 毫秒与时间互转 获取前一天六点钟时间

    java8 localtime 毫秒与时间互转 获取前一天六点钟时间

    vb6获取毫秒级的时间

    vb6 获取毫秒级的时间,exe文件的属性中概要的备注栏填入未来的某个时间,就会自动启动倒计时程序

    小工具_毫秒级电脑计时器+毫秒级电脑时间显示.zip

    用户只需解压缩文件,然后直接运行"毫秒级电脑计时器.exe",就能开始使用。 其次,"毫秒级电脑时间显示"则是一个实时显示当前系统时间的工具,同样精确到毫秒。在某些情况下,如多线程编程或分布式系统中,同步各个...

    Verilog实现毫秒级计时器(秒表)

    本篇将详细探讨如何使用Verilog硬件描述语言来实现一个毫秒级计时器,也称为秒表。 Verilog是一种广泛使用的硬件描述语言,它允许设计师描述数字系统的功能和行为,并可以被综合成实际的集成电路。在毫秒级计时器的...

    产生毫秒级延时

    通过理解和掌握以上知识点,开发者可以创建出更高效、更精确的毫秒级延时程序,这对于提升软件的用户体验和整体性能至关重要。同时,对源码的深入研究也能帮助我们学习到更多编程技巧和最佳实践。

    MFC毫秒级秒表

    本项目“MFC毫秒级秒表”利用了MFC库来实现一个高精度的时间测量工具,能够进行毫秒级别的计时操作,同时具备暂停、继续以及记录时间差的功能。 首先,我们要理解MFC中的时间处理机制。在MFC中,`CTime`类用于表示...

    电脑毫秒级计时器

    电脑计时器,毫秒级,相当精确。值得下载

    Java 获取视频时长、格式、大小需要的jar

    在Java编程环境中,有时我们需要处理多媒体文件,特别是视频文件,比如获取视频的时长、格式以及文件大小等信息。为了实现这些功能,开发者通常会依赖第三方库。在本例中,我们关注的是名为"jave-1.0.2"的库,它是一...

    毫秒级电脑计时器.rar

    《毫秒级电脑计时器:精确时间管理的利器》 在信息技术日益发达的今天,时间的精确管理显得尤为重要,特别是在编程、测试、数据分析等领域。毫秒级电脑计时器作为一个专业的计时工具,能够满足用户对时间精度的极致...

    fileTimeInfo_java_统计文件创建时间和修改时间_

    标题"fileTimeInfo_java_统计文件创建时间和修改时间_"指的是一个Java程序,它用于获取指定目录下所有文件的创建时间(Creation Time)和最后修改时间(Last Modified Time)。下面将详细阐述如何在Java中实现这一...

    VisualC 实效编程 44 毫秒级的控制

    VisualC 实效编程 44 毫秒级的控制VisualC 实效编程 44 毫秒级的控制VisualC 实效编程 44 毫秒级的控制VisualC 实效编程 44 毫秒级的控制VisualC 实效编程 44 毫秒级的控制VisualC 实效编程 44 毫秒级的控制VisualC ...

    java代码获取当前月第一天和最后一天的毫秒值(csdn)————程序.pdf

    java代码获取当前月第一天和最后一天的毫秒值(csdn)————程序

Global site tag (gtag.js) - Google Analytics