如何使用InputStream从ZIP读取文件?

2023-11-30

我必须使用 SFTP 从 ZIP 存档(只有一个文件,我知道它的名称)获取文件内容。我唯一拥有的是 ZIPInputStream。大多数示例显示如何使用此语句获取内容:

ZipFile zipFile = new ZipFile("location");

但正如我所说,我的本地计算机上没有 ZIP 文件,我不想下载它。是一个InputStream够读吗?

UPD:我就是这样做的:

import java.util.zip.ZipInputStream;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

public class SFTP {


    public static void main(String[] args) {

        String SFTPHOST = "host";
        int SFTPPORT = 3232;
        String SFTPUSER = "user";
        String SFTPPASS = "mypass";
        String SFTPWORKINGDIR = "/dir/work";
        Session session = null;
        Channel channel = null;
        ChannelSftp channelSftp = null;
        try {
            JSch jsch = new JSch();
            session = jsch.getSession(SFTPUSER, SFTPHOST, SFTPPORT);
            session.setPassword(SFTPPASS);
            java.util.Properties config = new java.util.Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);
            session.connect();
            channel = session.openChannel("sftp");
            channel.connect();
            channelSftp = (ChannelSftp) channel;
            channelSftp.cd(SFTPWORKINGDIR);
            ZipInputStream stream = new ZipInputStream(channelSftp.get("file.zip"));
            ZipEntry entry = zipStream.getNextEntry();
            System.out.println(entry.getName); //Yes, I got its name, now I need to get content
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            session.disconnect();
            channelSftp.disconnect();
            channel.disconnect();
        }


    }
}

下面是一个关于如何提取 ZIP 文件的简单示例,您需要检查该文件是否是一个目录。但这是最简单的。

您缺少的步骤是读取输入流并将内容写入缓冲区,该缓冲区写入输出流。

// Expands the zip file passed as argument 1, into the
// directory provided in argument 2
public static void main(String args[]) throws Exception
{
    if(args.length != 2)
    {
        System.err.println("zipreader zipfile outputdir");
        return;
    }

    // create a buffer to improve copy performance later.
    byte[] buffer = new byte[2048];

    // open the zip file stream
    InputStream theFile = new FileInputStream(args[0]);
    ZipInputStream stream = new ZipInputStream(theFile);
    String outdir = args[1];

    try
    {

        // now iterate through each item in the stream. The get next
        // entry call will return a ZipEntry for each file in the
        // stream
        ZipEntry entry;
        while((entry = stream.getNextEntry())!=null)
        {
            String s = String.format("Entry: %s len %d added %TD",
                            entry.getName(), entry.getSize(),
                            new Date(entry.getTime()));
            System.out.println(s);

            // Once we get the entry from the stream, the stream is
            // positioned read to read the raw data, and we keep
            // reading until read returns 0 or less.
            String outpath = outdir + "/" + entry.getName();
            FileOutputStream output = null;
            try
            {
                output = new FileOutputStream(outpath);
                int len = 0;
                while ((len = stream.read(buffer)) > 0)
                {
                    output.write(buffer, 0, len);
                }
            }
            finally
            {
                // we must always close the output file
                if(output!=null) output.close();
            }
        }
    }
    finally
    {
        // we must always close the zip file.
        stream.close();
    }
}

代码摘录来自以下网站:

http://www.thecoderscorner.com/team-blog/java-and-jvm/12-reading-a-zip-file-from-java-using-zipinputstream#.U4RAxYamixR

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用InputStream从ZIP读取文件? 的相关文章

随机推荐

  • Perl 代码分析工具

    我需要测试 Perl 应用程序 文件操作 数据库操作等 我正在寻找 Perl 代码的配置工具 Linux 中是否有类似 gprof 的 Perl 代码分析工具 有些人可能建议使用 Devel DProf 作为最标准的方法 但如果你仔细观察
  • 仅当用户不在另一个表中时才从一个表中选择用户

    我们有两张表 用户 id name borrower 1 Peter 1 2 John 1 3 Mark 1 4 David 0 贷款 id from to amount 1 1 2 100 我需要输出 Peter 没有借过任何钱并且借款人
  • 运行带有太多空格的程序

    我有一个在命令提示符下运行良好的命令 CMD C C Program Files x86 VideoLAN VLC VLC vvv http www foo com 8085 video mp4 playlist m3u8 wmsAuthS
  • 如何递归遍历目录树并仅查找文件?

    我正在研究一个scp调用以下载远程系统上存在的文件夹 下载的文件夹有子文件夹 在这些子文件夹中有一堆文件 我想将它们作为参数传递给 python 脚本 如下所示 scp r email protected SomeName SomeName
  • 如果有新版本可用,如何强制更新 Android 应用程序?

    我正在开发一个应用程序 如果游戏商店上有新版本 我想向应用程序用户强制更新 该应用程序应该向用户显示一条对话框消息 public class ForceUpdateAsync extends AsyncTask
  • 选择套接字输出接口:SO_BINDTODEVICE 与连接前绑定

    我正在尝试在具有两个接口的系统上设置套接字的输出接口 我用谷歌搜索了很多 发现了不同的答案 有人说我可以bind调用之前的套接字connect选择一个特定的接口 如套接字如何知道要使用哪个网络接口控制器 但其他人说这还不够 如http co
  • 如何使用弹性框重新排序 div?

    我试图为我的 DOM 保持 seo 友好和语义结构 而不重复整个元素以在不同位置显示它们 我的布局基于display flex项目 我尝试实现以下目标 需要了解的重要事项 我不想根据窗口宽度显示 隐藏 div 以避免不必要的重复 所有 di
  • 移动时修改 SKNode 的属性

    我有一个 SKNode 的子类 它充当我的 生物 它们使用 SKActions 自动在场景中移动 我有兴趣在生物移动时修改 减少 能量 属性 Int 不保证生物能够移动 SKAction 的整个长度 它可以被中断 因此计算总距离然后在它开始
  • NetBeans 的启动屏幕功能如何工作?

    NetBeans 新手 刚刚注意到文件 gt gt 项目属性 gt gt 应用程序对话框有一个标记为的文本字段启动画面它允许您指定程序启动时要显示的图像的路径 我想自定义启动屏幕的工作方式 添加进度条等 并且想从头开始编写代码 但不知道从哪
  • 如何更改闪亮的应用程序数据表输出字体颜色和辅助表元素颜色?

    我正在使用深色主题 闪亮主题中的石板 创建一个闪亮的应用程序 但是当我应用该主题时 我的 renderDataTable 输出存在两个问题 应用程序背景太暗 看不到表格外的元素 显示 XX 条目 底部页码等 表中的文字太浅 难以阅读 对于问
  • Django 使用 AJAX 在模板中渲染模板

    我的网站目前在自己的页面上呈现表单 我正在尝试让它们在我的主页上的侧边栏 div 标签内呈现 但是 我不知道如何塑造 JavaScript 和 或视图 因此我取回表单模板的 HTML 并将其插入到 div 标记中 UPDATE 我在控制台中
  • 如何使用 HSSF (Apache POI) 在现有 Excel 中的两行之间插入一行

    不知何故 我设法在现有 Excel 文件中的两行之间创建新行 问题是 一些格式没有包含在行的移动中 其中之一是隐藏的行在轮班期间没有相对地进行 我的意思是 例如 第 20 到 30 行被隐藏 但是当创建新行时 格式仍然存在 在插入 创建新行
  • Javascript 多个键具有相同的值 - 它们是否指向同一个地方?

    我有以下简化代码 var obj key1 aliases alias1 alias2 prop1 someVal prop2 someOtherVal var objHashMap for var key in obj objHashMa
  • 在 2D 列表中查找值的 Pythonic 方法? [复制]

    这个问题在这里已经有答案了 使用 numpy 数组 您可以使用切片检查特定列 即array 0 对于列表 检查 2D 元素是否在内部非常简单 one two in some list 然而 只是看看是否 one 存在需要迭代元素 即 one
  • pandas 基于独特的价值观和标准

    我有这个数据框 df in pd DataFrame id 123 123 123 123 123 456 ven group a a a b f f date 1 1 21 2 1 21 3 1 21 1 1 21 1 1 21 1 1
  • 输入数组而不知道其大小

    有没有一种方法可以在 Java 中创建一个数组 而无需先定义或询问其长度 又名用户输入一些数字作为参数 程序创建一个包含这么多参数的数组 有没有一种方法可以在java中创建一个数组 而无需先定义或询问它的长度 又名用户输入一些数字作为参数
  • 如何编写降序排序键函数?

    最近版本的 Python 中传递一个key功能为sort 从上一个cmp函数使我对某些对象执行复杂的排序变得更加困难 例如 我想使用一组字符串决胜字段对一组对象从最新到最旧进行排序 所以我希望日期按相反顺序排列 但字符串按自然顺序排列 使用
  • 如何在 symfony 4 中公开 LoggerInterface 服务

    我希望有Psr Log LoggerInterface在 symfony 中 public 以便能够直接从容器中获取它 container gt get Psr Log LoggerInterface 我尝试了以下方法services ya
  • 使用 SSLEngine (JSSE) 与旧客户端进行 SSL 握手

    这是 的后续问题 使用自签名证书和 SSLEngine JSSE 进行 SSL 握手 我已经实现了一个 NIO Web 服务器 可以在同一端口上处理 SSL 和非 SSL 消息 为了区分 SSL 和非 SSL 消息 我检查入站请求的第一个字
  • 如何使用InputStream从ZIP读取文件?

    我必须使用 SFTP 从 ZIP 存档 只有一个文件 我知道它的名称 获取文件内容 我唯一拥有的是 ZIPInputStream 大多数示例显示如何使用此语句获取内容 ZipFile zipFile new ZipFile location