gpt4 book ai didi

android - 使用 ZipInputStream 错误 UTFDataFormatException 提取文件

转载 作者:太空宇宙 更新时间:2023-11-03 13:23:11 25 4
gpt4 key购买 nike

我在尝试提取存储在 Assets 文件夹中的 .zip 文件时遇到错误,出现错误是因为我的文件包含字符 ñ。当我尝试获取下一个条目时出现错误:zipIs.getNextEntry()

private void loadzip(String folder, InputStream inputStream) throws IOException
{
ZipInputStream zipIs = new ZipInputStream(inputStream);
ZipEntry ze = null;

int i=0;
while ((ze = zipIs.getNextEntry()) != null) {

FileOutputStream fout = new FileOutputStream(folder +"/"+ ze.getName());

byte[] buffer = new byte[1024];
int length = 0;

while ((length = zipIs.read(buffer))>0) {
fout.write(buffer, 0, length);
}


zipIs.closeEntry();
fout.close();


}
zipIs.close();
}

解决方案

使用 zip4j

private void loadZip(String zipFileName, String destination)
{
ZipFile zipFile = null;
List<FileHeader> headers = null;
try {
zipFile = new ZipFile(zipFileName);
headers = zipFile.getFileHeaders();

} catch (ZipException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

if(headers != null)
{
for(int i=0;i<headers.size();i++)
{
try {
zipFile.extractFile(headers.get(i),destination);

} catch (ZipException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}

}

................................................ ..................................................... ...........................................

如果你想从 Assets 加载(我的情况),你必须将你的 zip 移动到 sdcard 文件夹,然后解压它:

private ArrayList<String> moveZipsFromAssets(String[] zipsAssets, String destination)
{
ArrayList<String> zips = new ArrayList<String>();
for(int i=0;i<zipsAssets.length;i++)
{
InputStream inputStream = getInputStream(zipsAssets[i]);
Log.d(tag, ""+zipsAssets[i]);
File file = new File(destination+"/"+zipsAssets[i]);
try {
FileOutputStream outputStream = new FileOutputStream(file);

int read = 0;
byte[] bytes = new byte[1024];

while ((read = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, read);
}

outputStream.close();
zips.add(destination+"/"+zipsAssets[i]);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return zips;
}

使用示例(我们有一个文件夹 assets/myZipsFolder/,所有的 zips 都在这里):`ArrayList

zipsExternos = moveZipsFromAssets(getAssets().list("myZipsFolder"),
Environment.getExternalStorageDirectory()+"/myZipsFolder");

//and load the zips:
for(int i=0;i<zipsExternos.size();i++)
loadZip(zipsExternos.get(i),Environment.getExternalStorageDirectory()+"/myZipsFolder");

最佳答案

需要使用zip4j等第三方库.他们的 ZipInputStream 实现支持非 UTF8 文件名。

编辑是因为 ZipInputStream(InputStream, Charset) 在 Android 中不可用。

关于android - 使用 ZipInputStream 错误 UTFDataFormatException 提取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24509264/

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