FTPClient에서 디렉토리를 변경하는 방법. 단일 FTPClient InputStream 연결의 여러 디렉토리. 알 수없는 구문 분석기 유형 : "/ Path"는 현재 디렉토리입니다.

사라 스 69 쿠마르

FTPClient.changeWorkingDirectory 및 changeToParentDirectory (). ftpCient에서 디렉토리를 변경하는 방법. 탐색기에서 ftp 경로는 다음과 같습니다 ftp://192.168.10.20. 일단 입력하면 폴더를 볼 수 있습니다 COMPLETED, FAILURE and QRCODEGENERATE. 내 자바 코드에서 먼저 FAILURE폴더 안에 들어가서 해당 파일을 가져옵니다. 그리고이 과정은 성공적으로 완료되었습니다. 그것을 얻은 후 COMPLETED폴더 에 들어가고 싶습니다 . 디렉토리 경로를 이와 같이 변경 /FAILURE해야 COMPLETED하지만 오류가 발생합니다. 하단에 콘솔 오류를 공유했습니다.

연결을 닫고 다시 열면 값을 얻을 수 있습니다. 하지만 그렇게하고 싶지 않습니다. 연결을 닫지 않고 디렉토리를 변경하고 싶습니다.

1. FAILURE먼저 파일과 그 내용에 액세스하고 있습니다.

2. 그런 다음 다시 돌아가서 COMPLETED파일과 그 내용에 액세스하고 싶습니다.

내 JAVA 코드는 다음과 같습니다.

InputStream is = null;
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient.enterLocalPassiveMode();
strDir= "FAILURE";
ftpClient.printWorkingDirectory();
String[] ftpList=ftpClient.listNames();
//Here I'm listing the folders present in parent directory
for(int i =0; i<ftpList.length;i++)
{
    String ftpFilsList=ftpList[i];
    System.out.println(".........::::::::::"+ftpFilsList);
}

//getting into Failure Folder and fetching file

ftpClient.changeWorkingDirectory(ftpClient.printWorkingDirectory()+strDir);
System.out.println("prnt#WorkingDir"+ftpClient.printWorkingDirectory());
is =ftpClient.retrieveFileStream(filename+".json");

int i=0;
String valuesinside="";
while((i = is.read())!=-1)
{
    //valuesinside+=valuesinside+i;
    char c = (char)i;
    valuesinside+=Character.toString(c);
    ftpfilelist=valuesinside;
}
//Successfully Fetched file and its contents
                
//change the directory to COMPLETED Folder
                
String strFullFileName = "";
File fileJson=null;
int intfilecount=00;
String strFileCount="";
strDir = "COMPLETED";
                
ftpClient.changeToParentDirectory();//To go back to previos directory
System.out.println("PARENRT+++++:::::"+ftpClient.printWorkingDirectory());//This shows null
ftpClient.changeWorkingDirectory(strDir);
ftpClient.printWorkingDirectory();
System.out.println("COMPLETED+++++:::::"+ftpClient.printWorkingDirectory());//Shows "/COMPLETED" in the console. but not getting the files.
FTPFile[] fileJsonReader=ftpClient.listFiles(ftpClient.printWorkingDirectory()); 
for(FTPFile ftpFile:fileJsonReader)
{
    String strJsonFileName=null;
    strJsonFileName=ftpFile.getName();
    System.out.println("strJsonFileName:::+++++"+strJsonFileName);
    String strBillNoFile=strJsonFileName.substring(0, strJsonFileName.lastIndexOf("-"));//-01
    System.out.println("strBillNoFile+++++::::::"+strBillNoFile);
    strBillNoFile=strBillNoFile+".json";
    System.out.println("strBillNoFile:::::+++++"+strBillNoFile);
    if(strBillNoFile.equalsIgnoreCase(filename.getName()))
    {
        
        intfilecount=intfilecount+1;
    }
 }

콘솔에서 이와 같은 오류가 발생합니다. 먼저 표시된 폴더 목록을 볼 수 있습니다.

.....................:::::::::::::::COMPLETED
.......................:::::::::::::::FAILURE
.......................:::::::::::::::QRCODEGENERATE
prnt#WorkingDir/FAILURE
PARENT+++++:::::::null
COMPLETED+++++:::::/COMPLETED
org.apache.commons.net.ftp.parser.ParserInitializationException: Unknown parser type: "/COMPLETED" is current directory.
at org.apache.commons.net.ftp.parser.DefaultFTPFileEntryParserFactory.createFileEntryParser(DefaultFTPFileEntryParserFactory.java:132)
    at org.apache.commons.net.ftp.FTPClient.initiateListParsing(FTPClient.java:2263)
    at org.apache.commons.net.ftp.FTPClient.listFiles(FTPClient.java:2046)
    at com.restService.FtpJson.FTPAuthJSONReader(FtpJson.java:130)
    at com.restService.JsonFailCompleted.getMessage(JsonFailCompleted.java:27)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:52)
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:124)
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:167)
    at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:219)
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:79)
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:469)
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:391)
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:80)
    at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:253)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:248)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:244)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:244)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:265)
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:232)
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:680)
    at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:394)
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:346)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:366)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:319)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:205)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.thetransactioncompany.cors.CORSFilter.doFilter(CORSFilter.java:209)
    at com.thetransactioncompany.cors.CORSFilter.doFilter(CORSFilter.java:244)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:610)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:503)
    at java.lang.Thread.run(Unknown Source)

이 문제를 해결하도록 도와주세요. 미리 감사드립니다

해결책

----- 바로는 inputStream을 폐쇄 is.close()하고Boolean result = ftpClient.completePendingCommand();

InputStream에서 nullPointerException 발생

is =ftpClient.retrieveFileStream(filename+".json");여기서 폴더에 요청 된 파일 이름이 없으면 NullPointerException이 발생합니다. 변경하지 않고 처리하는 방법 retrieveFileStream?

소리 마귀

최신 정보:

이 방법을 사용하기 때문에 문제가 발생한 것으로 보입니다.이 방법 retrieveFileStream();은 추가 프로세스가 필요하며 서버가 완료되면 연결이 끊어 지거나 이상하게 작동합니다. 다음은 API 참조의 핵심 부분 정보입니다 .

retrieveFileStream-서버에서 명명 된 파일을 읽을 수있는 InputStream을 반환합니다. 현재 파일 유형이 ASCII 인 경우 반환 된 InputStream은 파일의 줄 구분 기호를 로컬 표현으로 변환합니다. 당신은 당신이 완료 될 때의 InputStream을 닫아야합니다 그것을 읽는. InputStream 자체는 닫힐 때 부모 데이터 연결 소켓닫는 것을 처리합니다 .

파일 전송을 완료하려면 completePendingCommand를 호출 하고 반환 값을 확인하여 성공 여부를 확인 해야합니다 . 그렇지 않으면 후속 명령이 예기치 않게 작동 할 수 있습니다.

당신이 증기를 닫아야합니다 그래서 is.close();다음 사용합니다 ftpClient.completePendingCommand();. 이 작업이 완료되면 연결이 여전히 활성 상태 if(ftp.isConnected() == true){...}인지 확인할 수 있으며 그렇지 않은 경우 다시 연결 ftp.connect(...);한 다음 다음 명령으로 이동하여 작업 디렉토리를 변경할 수 있습니다.

//Open the stream
is =ftpClient.retrieveFileStream(filename+".json");

//Process the stream data
int i=0;
String valuesinside="";
while((i = is.read())!=-1)
{
    //valuesinside+=valuesinside+i;
    char c = (char)i;
    valuesinside+=Character.toString(c);
    ftpfilelist=valuesinside;
}

//Close the stream and complete the command
is.close();
Boolean result = ftpClient.completePendingCommand();

//check if connection is alive
if(ftp.isConnected() == false){
    //reconnect here with your server details
    //...
}

//Now move onto the next commands
ftpClient.changeToParentDirectory();/
ftpClient.changeWorkingDirectory("COMPLETED");
System.out.println("PARENRT+++++:::::"+ftpClient.printWorkingDirectory());

또는 API를 사용하는 대신 스트림을 수동으로 관리하는 다른 방법을 사용할 수 있습니다 retrieveFile(fileName, outputStream);. 예를 들어 .

ParserInitializationException 오류 :

오류가 발생하는 다른 이유에 대해 더 자세히 알고 싶다면 여기 아파치 FTPClient 문서 를 참조하십시오 .

ParserInitializationException-선택한 파서 팩토리에서 parserKey 매개 변수를 확인할 수없는 경우 발생합니다. DefaultFTPEntryParserFactory에서 이것은 parserKey가 org.apache.commons.net.ftp.FTPFileEntryParser 인터페이스를 구현하는 클래스의 정규화 된 클래스 이름이 아니거나 그러한 파서 또는 if 클래스에 매핑되는 인식 된 키 중 하나를 포함하는 문자열이 아닐 때 발생합니다. 로더 보안 문제로 인해로드되지 않습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관