在单个文件中保存多个图像

时间:2010-06-25 05:34:14

标签: java file image save

在我的程序中,我希望用户能够从目录中获取一些图像,并将它们保存在单个文件中,可以将其传输到另一台计算机,并实际读取和显示(使用相同的程序)。

我将如何做到这一点,特别是如果我想保存其他数据,也许是对象等。我知道你可以使用ObjectOutputStream类,但我不知道如何将它与图像集成。

总的来说,我希望程序能够从单个文件读取/写入数据,对象和图像。

先谢谢。

[编辑 - 来自回应+关于Zip文件的评论]

拉链可能能够完成工作。

但是我希望它只被读成程序。 (你认为把它变成一个拉链,改变文件扩展名会起作用,然后在阅读它时只需追回它并读作一个拉链?)我不希望用户能够直接看到内容。

Ill详细说明了它的游戏,用户可以使用xml文件,图像等创建自己的内容。但是当用户创建一些我不希望其他用户能够确切地看到他们如何创建它或者他们使用的东西时,只有最终结果。

4 个答案:

答案 0 :(得分:2)

在您的情况下,我会使用ZIP库将所有图像打包到ZIP文件中。对于要与其一起保存的元数据,请使用XML文件。 XML和ZIP是当今非常事实上的标准,易于处理,如果您想添加新文件或元数据,则可灵活使用。还有序列化工具将对象序列化为XML。 (我不完全是用Java知道它们,但我确定有。)

答案 1 :(得分:1)

您可以以编程方式创建zip文件,并从Java读取zip文件,无需将其作为常规.zip文件公开。

请参阅:java.io.zip pacakge以获取更多信息,these其他人了解如何使用java read / write压缩代码示例。

现在,如果您想阻止用户解压缩此文件,但您不想通过加密内容或创建复杂格式来使您的生活变得复杂,您可以模拟一种简单的互联网邮件格式,类似于用于发送电子邮件附件。

您可以阅读有关互联网邮件格式here

的更多信息

这将是您的应用程序仅使用的自定义文件格式,因此您可以根据需要进行操作。你只需要定义你的格式。

可能是:

  • 包含该包中文件名称(和编号)的标题。
  • 后跟一个分隔符列表(例如limit.a.txt=yadayada一些标识符,知道您已完成该内容)
  • 实际内容

因此,您使用以下内容创建包:

public void createBundle() {
    ZipOutputStream out = .... 
    writeHeader( out );
    writeLimits( out yourFiles );
    for( File f : youFiles ) {
        writeFileTo( f, out );
     }
     out.close();
}

排序......

结果将是一个压缩文件,如:

 filenames =a.jpg, b.xml, c.ser, d.properties, e.txt
 limits.a.jpg =poiurqpoiurqpoeiruqeoiruqproi
 limits.b.xml =faklsdjfñaljsdfñalksjdfa
 limit.s.ser =sdf09asdf0as9dfasd09fasdfasdflkajsdfñlk
 limit.d.properties =adfa0sd98fasdf90asdfaposdifasdfklasdfkñm
 limit.e.txt =asdf9asdfaoisdfapsdfñlj
 attachments=
 <include binary data from a.jpg here>
 --poiurqpoiurqpoeiruqeoiruqproi
 <include binary data from b.xml here>
 --faklsdjfñaljsdfñalksjdfa

由于您的文件格式是可以保持尽可能简单,或者使您的生活无限复杂化。

如果您设法在应用中包含MIME库,那么可以节省大量时间。

最后,如果你想增加额外的安全性,你必须加密文件,这毕竟不是那么难,问题是,如果你发送加密代码,你的用户可能会对它感到好奇并将它们反编译为找出。但是一个好的加密机制会阻止这种情况。

因此,根据您的需求,您可以使用简单的zip,带自定义格式的zip,带有复杂自定义格式的zip或带有自定义复杂加密格式的zip。

由于这是广泛的,您可以在此处询问具体部分:https://stackoverflow.com/questions/ask

答案 2 :(得分:0)

是的,只需使用java.util.zip。*打包/解压缩它们,这非常简单。自XP以来的每个Windows版本都内置了拉链支持,所以你的好事。 java / c#还有许多好的(更快的)免费zip库。

答案 3 :(得分:0)

  

我知道你可以使用ObjectOutputStream类,但我不知道如何将它与图像集成。

图片是二进制数据,因此将其读入byte[]并将byte[]写入ObjectOutputStream应该有效。然而,它只占用内存,因为每个byte至少占用JVM内存的一个字节。你需要考虑到这一点。