如何检查 InputStream 7Z 存档文件是否受密码保护?
How to check if an InputStream 7Z archive file is password protected or not?
我用过commons-compress-1.21.jar
File f = new File("/home/user/Desktop/test.7z");
SevenZFile sevenZFile = new SevenZFile(f);
SevenZArchiveEntry entry = sevenZFile.getNextEntry();
sevenZFile.read();
sevenZFile.close();
inMemoryByteChannel.close();
这是识别给定 test.7z 密码是否受保护的工作代码。阅读时抛出:
protectedjava.io.IOException: Cannot read encrypted files without a password
at org.apache.commons.compress.archivers.sevenz.AES256SHA256Decoder.init(AES256SHA256Decoder.java:57)
at org.apache.commons.compress.archivers.sevenz.AES256SHA256Decoder.read(AES256SHA256Decoder.java:118)
at org.apache.commons.compress.utils.ChecksumVerifyingInputStream.read(ChecksumVerifyingInputStream.java:85)
at java.io.DataInputStream.readFully(DataInputStream.java:195)
at java.io.DataInputStream.readFully(DataInputStream.java:169)
at org.apache.commons.compress.archivers.sevenz.SevenZFile.readEncodedHeader(SevenZFile.java:289)
at org.apache.commons.compress.archivers.sevenz.SevenZFile.readHeaders(SevenZFile.java:191)
at org.apache.commons.compress.archivers.sevenz.SevenZFile.<init>(SevenZFile.java:95)
at org.apache.commons.compress.archivers.sevenz.SevenZFile.<init>(SevenZFile.java:117)
at com.helloworld.ZipFileTest.main(ZipFileTest.java:45)
从这个异常我们可以确定这是一个密码保护的文件。但是我只有一个 7Z 文件的 InputStream。我没有文件,也没有文件路径。
SevenZFile
可以接受 SeekableByteChannel
作为参数。
只需从您的信息流创建 SeekableInMemoryByteChannel
。
InputStream inputStream; // input stream
SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel
(IOUtils.toByteArray(inputStream));
Source
我用过commons-compress-1.21.jar
File f = new File("/home/user/Desktop/test.7z");
SevenZFile sevenZFile = new SevenZFile(f);
SevenZArchiveEntry entry = sevenZFile.getNextEntry();
sevenZFile.read();
sevenZFile.close();
inMemoryByteChannel.close();
这是识别给定 test.7z 密码是否受保护的工作代码。阅读时抛出:
protectedjava.io.IOException: Cannot read encrypted files without a password
at org.apache.commons.compress.archivers.sevenz.AES256SHA256Decoder.init(AES256SHA256Decoder.java:57)
at org.apache.commons.compress.archivers.sevenz.AES256SHA256Decoder.read(AES256SHA256Decoder.java:118)
at org.apache.commons.compress.utils.ChecksumVerifyingInputStream.read(ChecksumVerifyingInputStream.java:85)
at java.io.DataInputStream.readFully(DataInputStream.java:195)
at java.io.DataInputStream.readFully(DataInputStream.java:169)
at org.apache.commons.compress.archivers.sevenz.SevenZFile.readEncodedHeader(SevenZFile.java:289)
at org.apache.commons.compress.archivers.sevenz.SevenZFile.readHeaders(SevenZFile.java:191)
at org.apache.commons.compress.archivers.sevenz.SevenZFile.<init>(SevenZFile.java:95)
at org.apache.commons.compress.archivers.sevenz.SevenZFile.<init>(SevenZFile.java:117)
at com.helloworld.ZipFileTest.main(ZipFileTest.java:45)
从这个异常我们可以确定这是一个密码保护的文件。但是我只有一个 7Z 文件的 InputStream。我没有文件,也没有文件路径。
SevenZFile
可以接受 SeekableByteChannel
作为参数。
只需从您的信息流创建 SeekableInMemoryByteChannel
。
InputStream inputStream; // input stream
SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel
(IOUtils.toByteArray(inputStream));
Source