Теперь у меня есть файл 7z на FTP-сервере.
Я использую FTP Client
для извлечения этого файла, а затем получаю InputStream(SockerInputStream)
Я использую SevenZFile
для его распаковки, но не получилось, выдать исключение:
java.io.IOException: NextHeader CRC mismatch
Я пытался использовать SevenZFile sZFile = new SevenZFile(new File(""));
, и он может работать
Кто-нибудь знает, как это реализовать?
Большое спасибо.
Распаковка
import org.apache.commons.compress.archivers.sevenz.SevenZArchiveEntry;
import org.apache.commons.compress.archivers.sevenz.SevenZFile;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.commons.compress.utils.SeekableInMemoryByteChannel;
public static void decompressFileContent(InputStream is) throws Exception {
try {
byte[] bytes = IOUtils.toByteArray(is);
SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel(bytes);
SevenZFile sZFile = new SevenZFile(channel);
SevenZArchiveEntry entry;
while ((entry = sZFile.getNextEntry()) != null){
byte[] content = new byte[(int) entry.getSize()];
sZFile.read(content, 0, content.length);
System.out.println(new String(content));
}
sZFile.close();
channel.close();
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
FTP
public static InputStream getFileByFtpClient(String fileName, String filePath) throws Exception{
FTPClient ftp = new FTPClient();
ftp.connect("XXX", XXX);
if(!ftp.login("XXX", "XXX"))
{
ftp.logout();
}
ftp.enterLocalPassiveMode();
System.out.println(" -- Remote system is " + ftp.getSystemType());
ftp.changeWorkingDirectory(filePath);
InputStream inputStream = ftp.retrieveFileStream(fileName);
ftp.disconnect();
return inputStream;
}