是否可以有效地将一行添加到zip或gzip文件中?
我将股票市场数据直接存储到文件系统中,我有大约40个不同的文件,每5ms更新一次。
这是最好的方法吗?
答案 0 :(得分:1)
使用数据库,而不是zip文件。
答案 1 :(得分:1)
java.nio.file.FileSystems:
http://docs.oracle.com/javase/7/docs/technotes/guides/io/fsp/zipfilesystemprovider.html
Java SE 7发行版中引入的zip文件系统提供程序是自定义文件系统提供程序的实现。 zip文件系统提供程序将zip或JAR文件视为文件系统,并提供操作文件内容的功能。 zip文件系统提供程序创建多个文件系统 - 每个zip或JAR文件一个文件系统。
TrueZip
http://truezip.java.net/
TrueZIP是一个基于Java的虚拟文件系统(VFS)插件框架,它提供对存档文件的透明访问,就好像它们只是普通的目录一样
请记住:使用内存进行缓存,减少磁盘操作,并使写入无阻塞。
答案 2 :(得分:0)
编辑zip文件的完整周期(我的意思是read-modify-close)会产生太多的开销。我认为最好在内存中累积更改并以合理的速率修改目标文件(即每5秒甚至更多)。
答案 3 :(得分:0)
一种方法可能类似于compressing data sent over a socket,并且不时将压缩块刷新到磁盘。
答案 4 :(得分:0)
您可以使用ZipOutputStream的write方法写入给定的偏移量。
String filepath = new String("/tmp/updated.txt")
FileOutputStream fout = new FileOutputStream("/tmp/example.zip");
ZipOutputStream zout = new ZipOutputStream(fout);
byte[] file = IOUtils.toByteArray(mWriter.toString());
short yourOffset = 0;
ZipEntry ze = new ZipEntry(filepath);
try {
zout.putNextEntry(ze);
zout.write(file, yourOffset, file.length);
zout.closeEntry();
} catch(Exception e) {
e.printStackTrace();
}
如果使用Apache commons IOUtils(导入org.apache.commons.io.IOUtils)将文件转换为字节数组,则可以通过在要编辑的行的偏移处调用write来重写和替换zip条目开始。在这种情况下,它会写入整个文件,从0到file.length。您可以通过创建ZipEntry来替换zip中的文件,其中包含驱动器上更新文件的路径。