자바 압축 해제 패키지,Liux 에서 Aix 시스템 에서 난 코드 처리 방법

6054 단어 linux
수요:대량의 데 이 터 는 다단 계 디 렉 터 리 를 포함 하고 디 렉 터 리 구조 가 불확실 하 며 마지막 파일 은 엑셀 이 며 최종 목적 은 엑셀 의 데 이 터 를 데이터베이스 에 가 져 오 는 것 입 니 다.처음에는 페이지 에 올 렸 는데 압축 파일 이 너무 커서 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;
	}
}

문제 도입 을 시작 한 가방 은 자바 util 입 니 다.*windows 환경 에서 구체 적 인 엑셀 파일 이름 을 읽 을 때 혼 란 스 럽 습 니 다.InputStream in=    z1.getInputStream(entry); 그 중에서 entry.getName()이 어 지 러 워 서 파일 을 읽 을 수 없 었 습 니 다.나중에 import org.apache.tools.zip.ZipEntry 로 바 뀌 었 습 니 다.import org.apache.tools.zip.ZipFile; 의 가방,어 지 러 운 코드 가 해결 되 어 windows 에서 정상적으로 운행 할 수 있 습 니 다.
 
문제 2:Linux 환경 에 배치 되 어 파일 경 로 를 읽 을 때 코드 가 어 지 러 워 집 니 다.구체 적 인 이 유 는 Linux 에서 Windows 플랫폼 에서 압축 된 중국어 파일 이름 이 포 함 된 zip 파일 을 압축 할 때 압축 된 파일 이름 이 어 지 러 워 지기 때 문 입 니 다.이 문제 의 근본 원인 은 윈도 중국어 판 에 zip 파일 을 압축 할 때 윈도 가 GBK 를 파일 이름 인 코딩 으로 사용 하 는 것 은 불합리한 것 이다.정상 적 인 방식 은 리 눅 스 플랫폼 처럼 UTF-8 인 코딩 을 기본적으로 사용 해 야 한다.
각종 코드 를 모두 한 번 시험 해 보 았 지만 소 용이 없 었 다.인터넷 에서 두 가지 방법 으로 문 제 를 해결 했다.
1.unzip 줄 명령 을 통 해 압축 을 풀 고 문자 집합 unzip-O CP 936 xxx.zip(GBK,GB 18030 으로 도 가능)을 지정 합 니 다.재 미 있 는 것 은 unzip 의 manual 에 이 옵션 에 대한 설명 이 없습니다.unzip-help 는 이 매개 변수 에 대해 간단 한 설명 을 합 니 다.
2.환경 변수 에 unzip 인 자 를 지정 하고 항상 지정 한 문자 집합 으로 파일/etc/environment 에 UNZIP="-O CP 936"ZIPINFO="-O CP 936"을 추가 합 니 다.
 
첫 번 째 는 우리 의 것 과 맞지 않 는 다 는 것 을 발견 하고,두 번 째 는 시도 해 보 았 지만 소 용이 없 었 다.
마지막 으로 Liux 의 현재 환경 을 중국어 환경 으로 설정 하면 됩 니 다.수정/etc/sysconfig/i18n 파일 LANG="zhCN.GB 2312"또는 LANG="zh 로 설정CN.GBK"모두 가능 합 니 다.
 
문제 3:Linux 에서 수정 에 성 공 했 습 니 다.온라인 환경 은 Aix 입 니 다.정말 답답 합 니 다.하지만 AIX 시스템 에서 파일 이름 을 읽 을 수 있 습 니 다.바로 데이터 베 이 스 를 삽입 할 때 코드 를 어 지 럽 히 는 것 입 니 다.이것 이 해결 되 기 좋 습 니 다. 데이터베이스 에 삽 입 된 url 코드 를 바 꾸 면 됩 니 다.
url=new String(url.getBytes("ISO8859_1"),"GBK")
 
난 장 판 은 여러 가지 상황 이 모두 해결 되 었 다!

좋은 웹페이지 즐겨찾기