gpt4 book ai didi

Java Zip 文件提取

转载 作者:行者123 更新时间:2023-11-30 10:31:44 24 4
gpt4 key购买 nike

我有一个 GTFS 计划管理器,它会自动从指定的提供程序 URL 下载压缩文件,并即时将文件从中提取到指定的文件夹。因此,在此过程结束时,该文件夹仅包含提取的文件,而不包含压缩文件本身。

到目前为止,这一直有效,但有

http://mta.maryland.gov/_googletransit/latest/google_transit.zip

由于某些原因,它不起作用。当我从流中获取第一个 zip 条目时,它为空。但是,我可以手动将压缩文件下载到本地文件夹,将我的 Java 应用程序中的 URL 更改为它并且它可以很好地提取。只是即时提取不起作用。

这通过按原样运行下面的代码来演示:您将看到失败。如果您随后手动将压缩文件下载到“feeds”文件夹,并在提取工作下方的 main 中交换注释的“extractFilesFromFeed.extract”行。

问题是我是否可以在下面进行更改,以便可以即时提取这个特定的 URL?

===

import java.io.File;
import java.io.FileOutputStream;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class ExtractFilesFromFeed {

private Logger logger = Logger.getLogger("");

public void extract(String feedLocation, String feedFolder) throws Exception {
if (feedLocation == null || feedLocation.length() == 0) {
String tmp = "Invalid feed location specified for GTFS schedule file extraction";
throw new Exception(tmp);
}
else if (feedFolder == null || feedFolder.length() == 0) {
String tmp = "Invalid feed folder specified for GTFS schedule file extraction";
throw new Exception(tmp);
}
else {
logger.log(Level.INFO, String.format("Extracting GTFS schedule files from %s to %s",
feedLocation, feedFolder));
}

URL url;
if (feedLocation.startsWith("http")) {
url = new URL(feedLocation);
}
else {
url = new File(feedLocation).toURI().toURL();
}

File dir = new File(feedFolder);
if(!dir.exists()){
dir.mkdir();
}

byte[] buffer = new byte[8192];
ZipInputStream zis = new ZipInputStream(url.openStream());
ZipEntry ze = zis.getNextEntry();

if (ze == null) {
logger.log(Level.WARNING, "Unable to get first entry from zip file, aborting download");
zis.close();
throw new Exception(String.format("Unable to get first entry from zip file %s", feedLocation));
}

while (ze != null){
String zipFileName = ze.getName();
if (ze.isDirectory()) {
dir = new File(feedFolder + "/" + zipFileName);
if(!dir.exists()){
dir.mkdir();
}
}
else {
FileOutputStream fos = new FileOutputStream(feedFolder + File.separator + zipFileName);
int len;
while ((len = zis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fos.close();
}
ze = zis.getNextEntry();
}
zis.close();
}

public static void main(String[] args) throws Exception {
ExtractFilesFromFeed extractFilesFromFeed = new ExtractFilesFromFeed();
extractFilesFromFeed.extract("http://mta.maryland.gov/_googletransit/latest/google_transit.zip", "feeds");
//extractFilesFromFeed.extract("feeds/google_transit.zip", "feeds");
}
}

最佳答案

看起来这里实际上有两个问题:

  1. http://mta.maryland.gov/_googletransit/latest/google_transit.zip 有一个 HTTP 301 重定向到 https://mta.maryland.gov 的安全 SSL 版本/_googletransit/latest/google_transit.zip
  2. SSL 握手可能因缺少安全策略文件而失败

对于重定向,您需要使用如下内容:

URL url;
if (feedLocation.startsWith("http")) {
url = new URL(feedLocation);
URLConnection urlConnection = url.openConnection();
// Check for HTTP 301 redirect
String redirect = urlConnection.getHeaderField("Location");
if (redirect != null) {
logger.log(Level.WARNING, "Redirecting to " + redirect);
url = new URL(redirect);
}
} else {...

然后,当打开输入流时,您可能想要捕获并记录任何 SSLHandshakeExceptions:

try {
ZipInputStream zis = new ZipInputStream(url.openStream());
...
} catch (SSLHandshakeException sslEx) {
logger.log(Level.ERROR, "SSL handshake failed. Try installing the JCE Extension - see http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html");
}

安装 JCE Extension ,您将需要替换您的 JVM /security 目录中的 US_export_policy.jarlocal_policy.jar 文件,例如 C:\Program Files\Java\jdk1.8.0_73\jre\lib\security,JCE 扩展下载中的 JAR 文件。

我刚刚在我们的项目中修复了同样的问题 - 解决该问题的提交是 https://github.com/CUTR-at-USF/gtfs-realtime-validator/commit/180785d22ca58afa2463b322ad4e1b122c5f0a30 ,并且该问题的 Github 问题是 https://github.com/CUTR-at-USF/gtfs-realtime-validator/issues/89 .

归功于 301 Moved Permanently用于 HTTP 301 重定向解决方案和 https://stackoverflow.com/a/30760134/937715用于安装 JCE 扩展。

关于Java Zip 文件提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43064517/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com