중국어 FTP 환경 에서 comons - net, FTPClient. listFiles () 방법 으로 null 의 문제 및 해결 방법 을 되 돌려 줍 니 다.
명령 행 에 FTP 를 연결 하고 ls - l 을 실행 하면 데이터 날 짜 를 되 돌려 주 는 곳 이 이상 합 니 다.
인용 하 다.
-rw-rw-rw- 1 username nobody 145 6 월 22 16 시 56 xxxx. csv
drw-rw-rw- 1 username nobody 145 6 월 22 2010 bakdir
실패 원인 은 바로 여기 입 니 다. comons - net 패키지 의 FTPListParseEngine 은 socket 을 통 해 원 격 서버 정 보 를 얻 는 것 을 처리 합 니 다.ls – l 의 정 보 를 통 해 파일 이름, 파일 시간, 파일 크기, 파일 권한, 파일 작성 자 를 분석 합 니 다...
public FTPFile[] getFiles() throws IOException {
List tmpResults = new LinkedList();
Iterator iter = this.entries.iterator();
while (iter.hasNext()) {
String entry = (String) iter.next();
//
// commons-net , Unix,WinNT ,
// , , ,
FTPFile temp = this.parser.parseFTPEntry(entry);
tmpResults.add(temp);
}
return (FTPFile[]) tmpResults.toArray(new FTPFile[0]);
}
//listFiles FTPListParseEngine,initiateListParsing
public FTPFile[] listFiles(String pathname) throws IOException{
String key = null;
FTPListParseEngine engine = initiateListParsing(key, pathname);
return engine.getFiles();
}
public FTPListParseEngine initiateListParsing(String parserKey, String pathname)
throws IOException {
if (__entryParser == null) {
// parserKey deprecated , FTPClientConfig
if (null != parserKey) {
__entryParser = __parserFactory.createFileEntryParser(parserKey);
}
// FTPClientConfig, ParseEngine
else {
if (null != __configuration) {
__entryParser = __parserFactory.createFileEntryParser(__configuration);
}
// , , ParseEngine
else {
__entryParser = __parserFactory.createFileEntryParser(getSystemName());
}
}
}
return initiateListParsing(__entryParser, pathname);
}
원인 을 찾 은 후, 우 리 는 목 표를 세우 고, 구체 적 으로 - rw - rw - rw - rw - 1 username nobody 145 6 월 22 16 시 56 xxxx. csv 한 줄 데이터
/**
* <pre>
* IBM FTP
* -rw-rw-rw- 1 chnnlftp nobody 145 6 22 16 56 finance_back_info_20100617150652.csv
* , , , , 。
*
* !!
* </pre>
*/
public class MyFTPEntryParser extends ConfigurableFTPFileEntryParserImpl {
private Class clazz = MyFTPEntryParser.class;
private Log log = LogFactory.getLog(clazz);
/**
* FTP
*/
public FTPFile parseFTPEntry(String entry) {
log.debug(" , : " + entry);
FTPFile file = new FTPFile();
file.setRawListing(entry);
String[] temp = entry.split("\\s+");
if (temp.length != 8) {
return null;
}
String fileType = temp[0].substring(0, 1);
if ("d".equals(fileType)) {
file.setType(FTPFile.DIRECTORY_TYPE);
} else {
file.setType(FTPFile.FILE_TYPE);
file.setSize(Integer.valueOf(temp[4]));
}
file.setName(temp[7]);
file.setUser(temp[3]);
Calendar date = Calendar.getInstance();
Date fileDate;
// 【6 22 2010】
if(temp[6].matches("\\d{4}")){
try {
fileDate = new SimpleDateFormat("yyyyMM dd")
.parse(temp[6] + temp[5]);
} catch (ParseException e) {
throw new RuntimeException(" ", e);
}
// 【6 22 16 56】
} else {
int yyyy = date.get(Calendar.YEAR);
try {
fileDate = new SimpleDateFormat("yyyyMM ddHH mm")
.parse(yyyy + temp[5] + temp[6]);
} catch (ParseException e) {
throw new RuntimeException(" ", e);
}
}
date.setTime(fileDate);
file.setTimestamp(date);
return file;
}
// =====================================================================
// FTP, , FTP
// parseFTPEntry, 。
// =====================================================================
public MyFTPEntryParser() {
this("");
}
public MyFTPEntryParser(String regex) {
super("");
}
protected FTPClientConfig getDefaultConfiguration() {
return new FTPClientConfig(clazz.getPackage().getName()
+ clazz.getSimpleName(), "", "", "", "", "");
}
}
// ftpClient.listNames() ,
ftpClient.configure(new FTPClientConfig(package.MyFTPEntryParser));
// package.MyFTPEntryParser:
참고:
http://www.blogjava.net/wodong/archive/2008/08/21/wodong.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
AS를 통한 Module 개발1. ModuleLoader 사용 2. IModuleInfo 사용 ASModuleOne 모듈...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.