java自带有文件解压缩的功能,但很多人都不用,都说其不支持中文。但我只想说,那是他们没有去深入了解java。
现在就说文件的解压功能,使用java自带的zip操作类,支持中文。
public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
//配置文件
// FileConfigUtil configUtil = FileConfigUtil.getInstance();
// configUtil.loadFileConfigUtil("D:\\file-upload.properties");
// FileConfigUtil.getFileUploadConfig();
//zip文件解压
ParseZipFile zipFile = new ParseZipFile();
String zipFilePath = "D:/test/错误图片数据.zip";
String outFilePath = "D:/新建文件夹";
zipFile.parseZipFile(zipFilePath, outFilePath);
}
public void parseZipFile(String zipFilePath,String outFilePath){
if(zipFilePath == null || zipFilePath.isEmpty()
|| outFilePath == null || outFilePath.isEmpty()){
return null;
}else{
try {
//转化为iso_8859_1,用于解压,如若包含中文,会生成失败。
ZipFile zipFile = new ZipFile(zipFilePath,StandardCharsets.ISO_8859_1);
ZipInputStream in = new ZipInputStream(new BufferedInputStream(new FileInputStream(zipFilePath)),StandardCharsets.ISO_8859_1);
ZipEntry zipEntry;
while ((zipEntry = in.getNextEntry()) != null) {
if(!zipEntry.isDirectory()){
File file = new File(outFilePath + "/" + new String(zipEntry.getName().getBytes(
StandardCharsets.ISO_8859_1), "gbk"));
System.out.println(file.getName());
if(!file.exists()) {
if(!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
file.createNewFile();
}
FileOutputStream out = new FileOutputStream(file);
InputStream is = zipFile.getInputStream(zipEntry);
int readLen = 0;
byte[] buffer = new byte[1024 * 8];
while ((readLen = is.read(buffer, 0, 1024 * 8)) != -1){
out.write(buffer, 0, readLen);
}
out.close();
is.close();
}
}
in.close();
zipFile.close();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
其实在以前的文章中就提过,java本身转换的字符到底是什么格式,很难说。
但在这里,先转化为iso8859然后,再转回gbk。如果转换为utf-8的话,可能会出现乱码。
所以大致可以猜测,在文件这一块,java也许使用的并不是utf-8。
当然,这只是可能。
不过,还是那句话,java的很多定义不可能是无厘头写上去的。只要去深入研究,你会发现解决方法的。