最近突发奇想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); }
假如帮到你的话,请留下你的评论。欢迎转载(请标明出处),希望能帮助到更多的人。
相关推荐
用户只需解压缩文件,然后直接运行"毫秒级电脑计时器.exe",就能开始使用。 其次,"毫秒级电脑时间显示"则是一个实时显示当前系统时间的工具,同样精确到毫秒。在某些情况下,如多线程编程或分布式系统中,同步各个...
在压缩包内的"易语言毫秒级时间源码"文件中,很可能会包含具体的示例代码,展示如何在易语言中调用这些函数,实现毫秒级时间的获取和操作。这些源码可以帮助我们更好地理解如何在实际项目中运用这些技术。 总的来说...
我们可以创建`File`对象来代表一个具体的文件或目录,然后通过这个对象获取文件的各种属性,如创建时间、修改时间以及文件大小等。 对于文件夹内的文件按照时间排序,我们可以利用`File`类的`lastModified()`方法,...
在Java编程语言中,获取文件的创建时间是一个常见的任务,特别是在处理文件系统操作时。Java提供了多种方式来访问文件的时间属性,包括创建时间、最后访问时间和最后修改时间。以下将详细讲解如何在Java中获取文件的...
java 获取指定日期(带毫秒)的 13位时间戳 ,获取当前时间的时间戳 一句话就可以System.currentTimeMillis();
在Java中,可以使用`java.io.FileWriter`或`java.nio.file.Files`类来创建和写入TXT文件。每个词语及其对应的记忆时间作为一个条目,可能以特定的格式(如:词语+时间)写入文件,方便后期的数据分析。 为了实现...
java8 localtime 毫秒与时间互转 获取前一天六点钟时间
一个漂亮的毫秒级秒表,功能是: 1. 毫秒级精确,timer触发,系统时间计时,绝对比timer的触发累计计时精确 3. 快捷键设置,在程序没有取得焦点的时候仍然可以用快捷键使用 4. 基本功能:开始计时,记录时间点,暂停...
vb6 获取毫秒级的时间,exe文件的属性中概要的备注栏填入未来的某个时间,就会自动启动倒计时程序
本篇将详细探讨如何使用Verilog硬件描述语言来实现一个毫秒级计时器,也称为秒表。 Verilog是一种广泛使用的硬件描述语言,它允许设计师描述数字系统的功能和行为,并可以被综合成实际的集成电路。在毫秒级计时器的...
在Java编程中,有时我们需要获取特定月份的第一天和最后一天的毫秒值,这在处理时间范围、数据统计或者日志记录等场景中非常常见。本文将详细解释如何使用Java的`Calendar`类来实现这一功能,以满足上述标题和描述的...
本项目“MFC毫秒级秒表”利用了MFC库来实现一个高精度的时间测量工具,能够进行毫秒级别的计时操作,同时具备暂停、继续以及记录时间差的功能。 首先,我们要理解MFC中的时间处理机制。在MFC中,`CTime`类用于表示...
通过理解和掌握以上知识点,开发者可以创建出更高效、更精确的毫秒级延时程序,这对于提升软件的用户体验和整体性能至关重要。同时,对源码的深入研究也能帮助我们学习到更多编程技巧和最佳实践。
电脑计时器,毫秒级,相当精确。值得下载
行列互换工具毫秒级_V2.2.2行列转换
在Java编程中,处理时间字符串解析时经常遇到的问题是时间格式的不一致性,尤其是在毫秒值存在或缺失的情况下。本文将详细讲解如何在Java中解析包含或不包含毫秒值的时间字符串。 首先,我们来看标题和描述中提到的...
《毫秒级电脑计时器:精确时间管理的利器》 在信息技术日益发达的今天,时间的精确管理显得尤为重要,特别是在编程、测试、数据分析等领域。毫秒级电脑计时器作为一个专业的计时工具,能够满足用户对时间精度的极致...
标题"fileTimeInfo_java_统计文件创建时间和修改时间_"指的是一个Java程序,它用于获取指定目录下所有文件的创建时间(Creation Time)和最后修改时间(Last Modified Time)。下面将详细阐述如何在Java中实现这一...