java自带有文件解压缩的功能,但很多人都不用,都说其不支持中文。但我只想说,那是他们没有去深入了解java。
现在就说文件的解压功能,使用java自带的zip操作类,支持中文。
?
class="java" name="code"> 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的很多定义不可能是无厘头写上去的。只要去深入研究,你会发现解决方法的。
?