【发布时间】:2012-10-08 17:26:54
【问题描述】:
我正在使用以下方法将文件压缩成 zip 文件:
import java.util.zip.CRC32;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public static void doZip(final File inputfis, final File outputfis) throws IOException {
FileInputStream fis = null;
FileOutputStream fos = null;
final CRC32 crc = new CRC32();
crc.reset();
try {
fis = new FileInputStream(inputfis);
fos = new FileOutputStream(outputfis);
final ZipOutputStream zos = new ZipOutputStream(fos);
zos.setLevel(6);
final ZipEntry ze = new ZipEntry(inputfis.getName());
zos.putNextEntry(ze);
final int BUFSIZ = 8192;
final byte inbuf[] = new byte[BUFSIZ];
int n;
while ((n = fis.read(inbuf)) != -1) {
zos.write(inbuf, 0, n);
crc.update(inbuf);
}
ze.setCrc(crc.getValue());
zos.finish();
zos.close();
} catch (final IOException e) {
throw e;
} finally {
if (fis != null) {
fis.close();
}
if (fos != null) {
fos.close();
}
}
}
我的问题是我有内容为N°TICKET 的纯文本文件,例如,压缩结果在未压缩N° TICKET 时会给出一些奇怪的字符。也不支持é 和à 等字符。
我猜是字符编码的原因,但我不知道如何在我的zip方法中将其设置为ISO-8859-1?
(我在 Windows 7、Java 6 上运行)
【问题讨论】:
-
您使用相同的编辑器查看预压缩和后压缩文件对吗?
-
@fvu:问题在于文件内容,而不是文件名
-
您为什么使用流而不是编写器/阅读器?流不知道字符或其编码。
-
@Wug 你是对的!实际上它是一个 CSV 文件,所以我用 Excel 查看后压缩文件... :-/ 所以我认为这是一个 Excel 问题
-
@Wug 但正如 Dunes 在他的回答中所建议的那样,在我的输出编写器中添加 `Charset.forName("ISO-8859-1")` 解决了问题(Excel 显示了正确的值)跨度>