2010-06-25 112 views
1

在我的程序中,我希望用戶能夠從目錄中獲取一些圖像,並將它們保存在單個文件下,可以將其轉移到另一臺計算機上,並實際讀取並顯示(使用相同的程序)。在一個文件中保存多個圖像

我會如何去做這件事,特別是如果我想保存其他數據一起,也許對象等。我知道你可以使用ObjectOutputStream類,但我不知道如何將它與圖像集成。因此,我希望程序能夠讀取/寫入單個文件中的數據,對象和圖像。

在此先感謝。

[編輯 - 從響應+有關評論Zip文件]

的zip或許能夠把工作做好。

但我希望它只能被程序讀取。 (你認爲把它變成一個zip文件,改變文件擴展名會有用,然後在閱讀時只是把它作爲一個zip文件來閱讀)我不希望用戶能夠直接看到內容。

Ill詳細說明了它的一個遊戲,用戶可以使用xml文件,圖像等創建自己的內容。但是,當用戶創建一些內容時,我不希望其他用戶能夠準確查看他們是如何創建它的,或者他們使用了什麼,只有最終的結果。

+0

將它的工作將它們打包成一個ZIP壓縮文件? (你不需要Java來做到這一點) – 2010-06-25 05:47:38

+0

謝謝你們的回覆。 拉鍊可能能夠完成工作。但我希望它只能被程序讀取。 (你認爲把它變成一個zip文件,改變文件擴展名會有用,然後在閱讀時只是把它作爲一個zip文件來閱讀)我不希望用戶能夠直接看到內容。 Ill詳細說了一下它的遊戲,用戶可以使用xml文件,圖像等創建自己的內容。但是當用戶創建一些東西時,我不希望其他用戶能夠確切地看到它是如何創建的,只有最終的結果。 – Larry 2010-06-25 17:18:46

回答

1

您可以編程方式創建zip文件,並從Java讀取zip文件,無需將其公開爲常規.zip文件。

參見:java.io.zip pacakge獲取更多信息,並these別人的代碼示例如何read/write拉鍊用java上。

現在,如果您想阻止用戶解壓縮此文件,但您不希望通過加密內容或創建複雜格式來使您的生活複雜化,則可以模擬簡單的Internet消息格式,類似於一個用於電子郵件附加文件。

你可以閱讀更多有關Internet郵件格式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,帶有複雜customformat的zip或帶有自定義複雜加密格式的zip。

因爲這是對廣大你可能會問這裏的特定部分:https://stackoverflow.com/questions/ask

+0

感謝您的深入響應,生病不得不花一些時間來看看這一切。 – Larry 2010-06-25 21:43:42

+0

我希望它有幫助。順便說一句,歡迎來到Stackoverflow,如果你找到一個有用的答案,你可以加註它(點擊問題旁邊數字的上三角),或者如果某些東西是浮誇錯誤的話,可以減少它。另外,如果您找到完全回答您的疑問的答案,您可以將其標記爲已接受(點擊數字下方的綠色箭頭)B-) – OscarRyz 2010-06-25 21:50:24

2

在你的情況下,我會使用ZIP庫將所有圖像打包在ZIP文件中。對於要隨這些保存的元數據,請使用XML文件。 XML和ZIP今天已經成爲事實上的標準,如果你想添加新的文件或元數據,處理起來很簡單,而且靈活。還有序列化工具將您的對象序列化爲XML。 (我不完全知道他們在Java中,但我確定有。)

+0

檢查第二個評論(三個類似的響應sorta,所以我只是把它張貼在那裏) – Larry 2010-06-25 17:21:00

0

是的,只需用java.util.zip。*打包/解壓縮它們,這是非常簡單的。自XP以來的每個Windows版本都內置了zip支持,所以您的好去處。對於java/c#還有很多好的(也是更快的)免費的zip庫。

0

我知道你可以使用ObjectOutputStream類,但我不知道如何將它與圖像集成。

圖像是二進制數據,所以讀入一個byte[]和編寫byte[]ObjectOutputStream應該工作。但是,只有內存佔用很大,因爲每個byte至少會佔用JVM內存的一個字節。你需要考慮到這一點。

+0

是的,這就是我當我問這個問題時使用的,但它是讓我困惑了一下的圖像。 – Larry 2010-06-25 21:42:19