`

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")

 

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

 

分享到:
评论

相关推荐

    Java 11 压缩包版 -jdk11.0.12

    这个"Java 11 压缩包版 - jdk11.0.12"包含了Java Development Kit的最新稳定版本,允许开发者在Windows操作系统上搭建Java开发环境。下面将详细介绍如何安装、配置以及使用Java 11,同时也会涉及一些相关的重要知识...

    解决Linux操作系统下Java的中文乱码问题

    在Linux操作系统中,Java应用程序处理中文字符时可能会遇到乱码问题。这主要涉及到编码格式的不匹配,因为Linux系统默认采用UTF-8编码,而某些Java应用或文件可能使用了GB2312、GBK或其他编码。本篇将详细介绍如何...

    Java带密码解压缩RAR压缩包(内附代码)

    在Java编程环境中,处理RAR压缩包并对其进行解压是一个常见的任务,特别是在自动化脚本或数据迁移等场景下。本文将详细介绍如何使用Java实现这个功能,特别是处理带密码保护的RAR文件,同时支持中文文件名,并能在...

    Linux下中文文件名乱码问题的详解 - CSDN博客1

    文章中提到,作者在项目中遇到了生成的压缩包文件(可能是通过tar或gzip命令创建的)在Linux下显示中文文件名时出现乱码的问题。他们发现,Windows系统默认使用GBK编码,而Linux默认使用UTF-8编码,因此在处理文件名...

    使用Java向服务器上传文件压缩包并实现解压缩

    在这个场景中,我们关注的是如何使用Java来实现文件压缩包的上传以及在服务器上的解压缩。Java作为一种强大的编程语言,提供了丰富的库来支持这样的操作,特别是在涉及到SFTP(Secure File Transfer Protocol)时,...

    基于Java向zip压缩包追加文件

    在Java编程中,向现有的ZIP压缩包追加文件通常需要经过解压、修改、再压缩的步骤,因为标准的Java ZIP库(如`java.util.zip`包)并不直接支持追加到已存在的ZIP文件。本篇文章将深入探讨如何实现这个功能,主要关注...

    Java提取压缩包中的文件.rar

    Java提取压缩包中的文件,文件操作的范畴,操作对象为ZIP格式的压缩文件,将从ZIP中提取出BMP图像文件,要将从压缩包中提取文件,必须先解压压缩包,然后将指定文件拷贝出来,代码中先实现了对zip文件的解压,然后...

    java zip压缩包 解压zip Eclipse项目

    java 打zip压缩包 解压缩包Eclipse项目20111011 java 打zip压缩包 解压缩包Eclipse项目20111011java 打zip压缩包 解压缩包Eclipse项目20111011

    java7_64_AIX.rar

    "java7_64_AIX.rar"这个压缩包包含了适用于AIX系统的IBM JDK 1.7的64位版本,这在市面上可能并不常见,因此对于需要在AIX环境下运行Java 7应用程序的开发者来说尤为珍贵。 首先,我们需要了解IBM JDK 1.7在AIX系统...

    Java从压缩包中提取文件

    Java从压缩包中提取文件

    java 11下载,版本 11.0.17, linux各版本

    对于Linux用户来说,Java 11的Linux版本是必不可少的,因为Linux是许多服务器和开发环境的首选操作系统。Linux有多种发行版,如Ubuntu、CentOS、Fedora、Debian等,而Java 11的Linux安装包通常可以跨多个发行版通用...

    AIX JDK1.8 64位

    在AIX环境下,使用JDK1.8 64位,开发者可以编写符合Java 8规范的代码,利用新的语言特性,如lambda表达式、方法引用、Stream API等。同时,由于是64位版本,它能够支持更大的内存分配,适合处理大数据和复杂的多线程...

    Java8 Linux版本

    Linux版本的Java 8针对Linux平台进行了优化,确保在该操作系统上的性能和稳定性。 在Linux上安装Java 8 JDK(Java Development Kit 8)是开发者和系统管理员必须掌握的一项技能。首先,你需要访问Oracle官网下载...

    linux下java环境gdal编译好的文件

    在Linux环境下,Java开发者经常需要处理与GDAL(Geospatial Data Abstraction Library)相关的项目。GDAL是一个开源的地理空间数据处理库,它提供了多种数据格式的读写能力,并支持空间几何操作和坐标系统转换。这个...

    jdk11环境 Linux压缩包

    Linux版本的JDK 11是为Linux操作系统设计的,确保了Java程序在Linux环境下的兼容性和高效运行。 **下载与安装** 1. **下载**: 首先,你需要从Oracle官方网站或者第三方可靠的源下载JDK 11的Linux压缩包。在本例中...

    JAVA 安装包,jdk18(win、linux)

    本压缩包提供了适用于Windows和Linux操作系统的JDK18安装包,这将帮助用户在不同平台上搭建Java开发环境。 标题中的“JAVA 安装包,jdk18(win、linux)”表明这个压缩文件包含了两个版本的JDK18,分别是针对...

    JAVA_1.8.0压缩包

    这个压缩包简化了Java开发环境的安装过程,用户可以直接下载并解压,然后在系统环境变量中进行配置,以确保系统能够找到Java的执行路径。这对于初学者和专业开发者来说都是一个方便的步骤,避免了在线安装过程中可能...

    Java从压缩包中提取文件.rar

    总的来说,"Java从压缩包中提取文件.rar"这个资源为Java开发者提供了一个学习和参考的实例,涵盖了Swing GUI的创建以及使用Java处理压缩文件的方法,特别是从RAR文件中提取内容。无论是初学者还是有经验的开发者,都...

    Java中压缩与解压--中文文件名乱码解决办法

    尤其是在Windows系统下,文件名通常采用GB2312或GBK编码,而Java中的`ZipInputStream`和`ZipOutputStream`类默认使用的是Unicode编码,这种编码差异导致了中文文件名在压缩与解压过程中的乱码现象。 #### 二、解决...

    java-jdk1.8-jdk-8u181-linux-x64.zip

    这个压缩包文件“java-jdk1.8-jdk-8u181-linux-x64.zip”包含了适用于64位Linux系统的JDK 1.8更新181版本。JDK(Java Development Kit)是开发者编写、调试和运行Java应用程序所必需的一套工具,包括Java编译器、...

Global site tag (gtag.js) - Google Analytics