java解压缩包,在linux下,Aix系统下乱码处理方法

需求:大批量的数据,包含多级目录,目录结构不确定,最后的文件为excel,最终目的是将excel中的数据导入到数据库。开始是做的在页面上传,压缩文件太大,有230多M,页面直接就报错了。后来就是修改为直接读取服务器的文件

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class ImportInvalidCardNo  {
	
    /*
     * 后台批量导入废卡记录
     * 该类在window下面运行不需要处理字符转码
     * 在linux环境下要修改/etc/sysconfig/i18n 中LANG="zh_CN.GBK"
     * 在Aix系统下需要处理转码
     * */
	public String batchInsertInvalidCardNo() throws Exception {
		HttpServletResponse response = ServletActionContext.getResponse();
		String fileUrl ="E:/test/";
		File file = new File(fileUrl);
		File[] files = file.listFiles();// 获取该目录下的所有文件
		String data = "";
		String url = "";	
		for (File f : files) {		
			String filepath = f.getName();
			String zipUrl = filepath.substring(
					filepath.lastIndexOf('.') + 1).trim();
			if (zipUrl.equals("zip")) {
				ZipFile z1 = new ZipFile(f);
				Enumeration emun = z1.getEntries();
				while (emun.hasMoreElements()) {
					ZipEntry entry = (ZipEntry) emun.nextElement();

					// 执行数据库及读取文件
					try {
						if (!entry.isDirectory()) {
							url = entry.getName();
							List<InvalidCardNo> oneFileInfo = this.readFile(z1,
									entry);
						    ServiceReturn sRet =this.importInvalidCardNoService.addInvalidCardNo(oneFileInfo,url);//这是后台执行程序
						}

					} catch (Exception e) {
						// 不捕获异常,记录错误信息,继续执行
						ErrorCardscrapinfotb errorCardscrapinfotb = new ErrorCardscrapinfotb();					
						//url=new String(url.getBytes("ISO8859_1"),"GBK");//该行代码只针对测试测试环境Aix系统,windows下测试需注释掉
						errorCardscrapinfotb.setErrorfileurl(url);
					    ServiceReturn sRet = this.importInvalidCardNoService.addErrorCardscrapinfotb(errorCardscrapinfotb);
						//e.printStackTrace();
						continue;
					}					
				}
				z1.close();
				File dleteFile = new File(deleteUrl);
				dleteFile.delete();
			}
		}

		data = "共成功导入" + successCount + "条,请检查记录表是否有损坏的文件!";
		ServiceReturn sRet = new ServiceReturn(true, "SUCCESS");
		JSONObject retObj = super.convertServiceReturnToJson(sRet);
		retObj.put("retmsg", data);
		super.setActionresult(retObj.toString());  
		return AJAX_SUCCESS;
	}

	private List<InvalidCardNo> readFile(ZipFile z1, ZipEntry entry)
			throws Exception {
		// 创建输入流
		InputStream in = z1.getInputStream(entry);
		List<InvalidCardNo> invalidCardNoList = new ArrayList<InvalidCardNo>();

		Cell cell = null;
		Workbook wb = Workbook.getWorkbook(in); // 得到工作薄
		Sheet sheet=null;
		try {
		 sheet = wb.getSheet(0);// 得到工作薄中的第一个工作表

			// 获取第一行的信息
		cell = sheet.getCell(0, 0);
		}
		catch (Exception e) {
	    sheet = wb.getSheet(1);// if工作薄中的第一个工作表不是需要的工作表,取第二个

			// 获取第一行的信息
		cell = sheet.getCell(0, 0);
		}
		String fistInfo = cell.getContents();
		// 行数引从2开始,从第2行开始获取数据,前2行为标题和说明。
		for (int i = 2; i < sheet.getRows(); i++) {

			// 获取列数
			for (int j = 0; j < sheet.getColumns() - 1; j++) {
				j++;
				cell = sheet.getCell(j, i);
				if (!(cell.getContents().trim().equals("") || cell.getContents() == null)) {
					InvalidCardNo info = new InvalidCardNo();
					// 获取第i行,第j列的值
					String tempcard = cell.getContents();
					String cityCode = tempcard.substring(0, 4);
					String cardNo = tempcard.substring(4, 16);
					info.setCitycode(Integer.valueOf(cityCode));
					info.setCardno(cardNo);
					invalidCardNoList.add(info);
				}
			}

		}
		in.close();
		return invalidCardNoList;
	}
}

问题一。 开始引入的包为java.util.* 在windows环境下读取具体excel文件名的时候就乱码了,InputStream in =    z1.getInputStream(entry); 其中entry.getName()乱码,这样就没办法读取到文件了,后来改成
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
的包,乱码解决,可以在windows下正常运行了;

 

问题二:部署到Linux环境下,读取文件路径的时候就乱码了,具体原因为在Linux上解压缩一个从Windows平台压缩的包含有中文文件名的zip文件时,解压缩出来的文件名会是乱码。该问题的根本原因是Windows中文版上压缩一个zip文件时,Windows会使用GBK为文件名编码,这是不合理的。正常的方式应该是象Linux平台一样,默认使用UTF-8编码。

各种转码都试了一遍,也没起作用,在网上搜了个遍有2种方式解决问题:

1. 通过unzip行命令解压,指定字符集
unzip -O CP936 xxx.zip (用GBK, GB18030也可以)
有趣的是unzip的manual中并无这个选项的说明, unzip --help对这个参数有一行简单的说明。

2. 在环境变量中,指定unzip参数,总是以指定的字符集显示和解压文件
/etc/environment中加入2行
UNZIP="-O CP936"
ZIPINFO="-O CP936"

 

发现第一种和我们的不相符,第二中试了没起作用

最后还是将linux当前环境设置为中文环境即可。
修改/etc/sysconfig/i18n 文件
LANG="zh_CN.GB2312" 或者设置为LANG="zh_CN.GBK"都可以;

 

问题三:在Linux下修改成功了,线上环境又是Aix,真是郁闷哦,不过AIX系统下,可以读到文件名,就是在插入数据库的时候乱码了,这个比较好解决了, 对插入数据库的url转码就可以了

url=new String(url.getBytes("ISO8859_1"),"GBK")

 

乱码多种情况就都解决了!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
package com.cliff.common; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import org.apache.tools.zip.ZipOutputStream; /** * * 类名: ZipUtil.java * 描述:压缩/压缩zip处理类 * 创建者:XXX * 创建日期:2015年5月7日 - 下午1:35:02 * 版本: V0.1 * 修改者: * 修改日期: */ public class ZipUtil { /** * * 功能描述:压缩文件 * 创建者:XXX * 创建日期: 2015年5月7日 - 下午1:35:18 * 版本: V0.1 * 修改者: * 修改日期: * @param directory 指定压缩文件路径 压缩到同目录 * @throws IOException * void */ public static void zip(String directory) throws FileNotFoundException, IOException { zip("", null, directory); } /** * * 功能描述:压缩文件 * 创建者:XXX * 创建日期: 2015年5月7日 - 下午1:36:03 * 版本: V0.1 * 修改者: * 修改日期: * @param zipFileName 压缩产生的zip包文件名--带路径,如果为null或空则默认按文件名生产压缩文件名 * @param relativePath 相对路径,默认为空 * @param directory 文件或目录的绝对路径 * void */ public static void zip(String zipFileName, String relativePath, String directory) throws FileNotFoundException, IOException { String fileName = zipFileName; if (fileName == null || fileName.trim().equals("")) { File temp = new File(directory); if (temp.isDirectory()) { fileName = directory + ".zip"; } else { if (directory.indexOf(".") > 0) { fileName = directory.substring(0, directory.lastIndexOf("."))+ "zip"; } else { fileName = directory + ".zip"; } } } ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(fileName)); try { zip(zos, relativePath, directory); } catch (IOException ex) { throw ex; } finally { if (null != zos) { zos.close(); } } } /** * * 功能描述:压缩文件 * 创建者:XXX * 创建日期: 2015年5月7日 - 下午1:37:55 * 版本: V0.1 * 修改者: * 修改日期: * @param zos 压缩输出流 * @param relativePath 相对路径 * @param absolutPath 文件或文件夹绝对路径 * @throws IOException * void */ private static void zip(ZipOutputStream zos, String relativePath, String absolutPath) throws IOException { File file = new File(absolutPath); if (file.isDirectory()) { File[] files = file.listFiles(); for (int i = 0; i < files.length; i++) { File tempFile = files[i]; if (tempFile.isDirectory()) { String newRelativePath = relativePath + tempFile.getName() + File.separator; createZipNode(zos, newRelativePath); zip(zos, newRelativePath, tempFile.getPath()); } else { zipFile(zos, tempFile, relativePath); } } } else { zipFile(zos, file, relativePath); } } /** * * 功能描述:压缩文件 * 创建者:XXX * 创建日期: 2015年5月7日 - 下午1:38:46 * 版本: V0.1 * 修改者: * 修改日期: * @param zos 压缩输出流 * @param file 文件对象 * @param relativePath 相对路径 * @throws IOException * void */ private static void zipFile(ZipOutputStream zos, File file, String relativePath) throws IOException { ZipEntry entry = new ZipEntry(relativePath + file.getName()); zos.putNextEntry(entry); InputStream is = null; try { is = new FileInputStream(file); int BUFFERSIZE = 2 <= 0) { zos.write(buffer, 0, length); } zos.flush(); zos.closeEntry(); } catch (IOException ex) { throw ex; } finally { if (null != is) { is.close(); } } } /** * * 功能描述:创建目录 * 创建者:XXX * 创建日期: 2015年5月7日 - 下午1:39:12 * 版本: V0.1 * 修改者: * 修改日期: * @param zos zip输出流 * @param relativePath 相对路径 * @throws IOException * void */ private static void createZipNode(ZipOutputStream zos, String relativePath) throws IOException { ZipEntry zipEntry = new ZipEntry(relativePath); zos.putNextEntry(zipEntry); zos.closeEntry(); } /** * * 功能描述:压缩文件 * 创建者:XXX * 创建日期: 2015年5月7日 - 下午1:39:32 * 版本: V0.1 * 修改者: * 修改日期: * @param zipFilePath zip文件路径 * @param targetPath 压缩到的位置,如果为null或空字符串则默认压缩到跟zip包同目录跟zip包同名的文件夹下 * void */ public static void unzip(String zipFilePath, String targetPath) throws IOException { InputStream is = null; FileOutputStream fileOut = null; File file = null; ZipFile zipFile = null; try { zipFile = new ZipFile(zipFilePath,"GBK"); String directoryPath = ""; if (null == targetPath || "".equals(targetPath)) { directoryPath = zipFilePath.substring(0, zipFilePath.lastIndexOf(".")); } else { directoryPath = targetPath; } for(Enumeration entries = zipFile.getEntries(); entries.hasMoreElements();){ ZipEntry entry = (ZipEntry)entries.nextElement(); file = new File(directoryPath+"/"+entry.getName()); if(entry.isDirectory()){ file.mkdirs(); }else{ //如果指定文件的目录不存在,则创建之. File parent = file.getParentFile(); if(!parent.exists()){ parent.mkdirs(); } is = zipFile.getInputStream(entry); fileOut = new FileOutputStream(file); int readLen = 0; byte[] buffer = new byte[4096]; while ((readLen = is.read(buffer, 0, 4096)) >= 0) { fileOut.write(buffer, 0, readLen); } fileOut.close(); is.close(); } } zipFile.close(); } catch (IOException ex) { throw ex; } finally { if(null != zipFile){ zipFile = null; } if (null != is) { is.close(); } if (null != fileOut) { fileOut.close(); } } } /** * * 功能描述:生产文件 如果文件所在路径不存在则生成路径 * 创建者:XXX * 创建日期: 2015年5月7日 - 下午1:41:04 * 版本: V0.1 * 修改者: * 修改日期: * @param fileName 文件名 带路径 * @param isDirectory 是否为路径 * @return * File */ public static File buildFile(String fileName, boolean isDirectory) { File target = new File(fileName); if (isDirectory){ target.mkdirs(); } else { if (!target.getParentFile().exists()) { target.getParentFile().mkdirs(); target = new File(target.getAbsolutePath()); } } return target; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值