【发布时间】:2021-10-18 11:34:22
【问题描述】:
我正在 Google Cloud Storage 中存储一个 TAR 文件。该文件可以通过gsutil 成功下载并使用 macOS 存档实用程序在我的计算机中提取。但是,我实现的 Java 程序在访问文件时总是遇到java.io.IOException: Corrupted TAR archive。我尝试了几种方法,所有方法都在使用org.apache.commons:commons-compress 库。你能告诉我如何解决这个问题或我可以尝试的东西吗?
以下是我尝试过的实现:
Blob blob = storage.get(BUCKET_NAME, FILE_PATH);
blob.downloadTo(Paths.get("filename.tar"));
String contentType = blob.getContentType(); // application/x-tar
InputStream is = Channels.newInputStream(blob.reader());
String mime = URLConnection.guessContentTypeFromStream(is); // null
TarArchiveInputStream ais = new TarArchiveInputStream(is);
ais.getNextEntry(); // raise java.io.IOException: Corrupted TAR archive
InputStream is2 = new ByteArrayInputStream(blob.getContent());
String mime2 = URLConnection.guessContentTypeFromStream(is2); // null
TarArchiveInputStream ais2 = new TarArchiveInputStream(is2);
ais2.getNextEntry(); // raise java.io.IOException: Corrupted TAR archive
InputStream is3 = new FileInputStream("filename.tar");
String mime3 = URLConnection.guessContentTypeFromStream(is3); // null
TarArchiveInputStream ais3 = new TarArchiveInputStream(is3);
ais3.getNextEntry(); // raise java.io.IOException: Corrupted TAR archive
TarFile file = new TarFile(blob.getContent()); // raise java.io.IOException: Corrupted TAR archive
TarFile tarFile = new TarFile(Paths.get("filename.tar")); // raise java.io.IOException: Corrupted TAR archive
补充:我尝试从 GCS 解析 JSON 并且它工作正常。
Blob blob = storage.get(BUCKET_NAME, FILE_PATH);
JSONTokener jt = new JSONTokener(Channels.newInputStream(blob.reader()));
JSONObject jo = new JSONObject(jt);
【问题讨论】:
-
tar 文件可能使用了 Java tar 实现不支持的功能。我不知道这些特性(想想扩展权限、acls 等)是如何在 tar 中实现的,有些格式以向后兼容的方式实现,我不知道 tar 是否可以。我怀疑这实际上与 GCS 无关。您是否尝试过使用原始 tar 而不上传/下载它?
-
我已尝试从本地目录通过
FileInputStream直接访问该tar 文件,但同样的错误仍然存在。我尝试通过运行命令$ tar -cvf <filename>.tar <random-dir>创建一个归档到tar 中的随机文件,使用相同的FileInputStream可以访问该tar 文件。我认为基于这些事实我们可以排除一些可能性,它不应该是由 Spring GCS 或commons-compress库引起的。 Here 是“损坏”的 tar 文件,如果它可能有助于检查的话。
标签: java google-cloud-platform google-cloud-storage tar archive