2014-01-19 22 views
0

http://sevenzipjbind.sourceforge.net/basic_snippets.html - Java代碼示例 http://sevenzipjbind.sourceforge.net/javadoc/index.html - API文檔的JRuby與sevenzipjbinding

require "./sevenzipjbinding-AllPlatforms.jar" 
require "./sevenzipjbinding.jar" 

java_import "net.sf.sevenzipjbinding.ExtractAskMode" 
java_import "net.sf.sevenzipjbinding.ExtractOperationResult" 
java_import "net.sf.sevenzipjbinding.IArchiveExtractCallback" 
java_import "net.sf.sevenzipjbinding.ISequentialOutStream" 
java_import "net.sf.sevenzipjbinding.ISevenZipInArchive" 
java_import "net.sf.sevenzipjbinding.PropID" 
java_import "net.sf.sevenzipjbinding.SevenZip" 
java_import "net.sf.sevenzipjbinding.SevenZipException" 
java_import "net.sf.sevenzipjbinding.impl.RandomAccessFileInStream" 

randomAccessFile = java.io.RandomAccessFile.new(ARGV[0], "r") 
SevenZip.initSevenZipFromPlatformJAR 
inArchive = SevenZip.openInArchive(nil, RandomAccessFileInStream.new(randomAccessFile)) 

(0..inArchive.getNumberOfItems-1).each { |i| 
    puts 
    puts "PATH: #{inArchive.getProperty(i, PropID::PATH)}" # show file name 
    puts "SIZE: #{inArchive.getProperty(i, PropID::SIZE)}" # and file size 
} 

inArchive.close 
randomAccessFile.close 

確定它的作品一般。但我無法理解提取。

inArchive.extractSlow(int index, ISequentialOutStream outStream, java.lang.String password) 

如何ISequentialOutStream工作,以及如何獲取存檔文件作爲字符串在內存中或將其保存到磁盤?

回答

0

ISequentialOutStream是由您正在使用的庫定義的接口。它有一個方法:write需要一個字節數組並返回實際寫入的字節數。

這取決於您的應用程序如何「寫入」數據。如果您認爲緊縮數據是UTF-8字符串,這樣做將是一個辦法:

class MyOutput 
    def initialize 
    @buffer = java.io.ByteArrayOutputStream.new 
    end 

    def write(bytes) 
    @buffer.write(bytes) 
    end 

    def to_s 
    @buffer.toString("UTF-8") 
    end 
end 

output = MyOutput.new 
inArchive.extractSlow(index, output, password) 
puts output.to_s 

沒有什麼真正的JRuby的具體談談你的問題 - 這只是普通的Java。

+0

謝謝你的幫助。一個更正。 'net.sf.sevenzipjbinding.SevenZipException:'int ISequentialOutStream.write(byte [])'的實現應該至少寫入一個字節。返回的寫入字節數量:0' 'write'方法需要'@ buffer.size'。 'def write(bytes) @ buffer.write(bytes) return @ buffer.size end' – user3211940

+0

好的,但我認爲你需要返回'bytes.length'。 JavaDoc並不完全清楚,但通常你告訴調用者你能夠寫*他們給你*的東西。 – Shepmaster