FTP 路径/目录更改。单个 FTPClient 输入流中的多个目录连接。未知解析器类型:"/Path" 是当前目录



FTPClient.changeWorkingDirectory & changeToParentDirectory((.如何在 ftpCient 中更改目录。在资源管理器中,ftp 路径如下所示ftp://192.168.10.20.输入此内容后,我可以看到文件夹COMPLETED, FAILURE and QRCODEGENERATE.在我的java代码中,我首先进入文件夹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)

请帮我解决这个问题。提前致谢

溶液

-----刚刚关闭了输入流is.close()Boolean result = ftpClient.completePendingCommand();

在输入流中抛出空指针异常

is =ftpClient.retrieveFileStream(filename+".json");此处,如果文件夹没有请求的文件名,则会引发 NullPointerException。如何在不改变retrieveFileStream的情况下处理它?

更新:

看起来问题是由您在retrieveFileStream();使用此方法引起的,这需要一些额外的进程,并且服务器在完成后要么断开连接,要么行为异常。以下是来自 api 引用的关键部分信息:

检索文件流 - 返回一个输入流,命名文件来自 可以读取服务器。如果当前文件类型为 ASCII,则 返回的输入流会将文件中的行分隔符转换为 本地代表。完成输入流的读取后,必须将其关闭。输入流本身将负责关闭父数据连接套接字时关闭

要完成文件传输,您必须调用 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);

解析器初始化异常错误:

如果您对发生错误的其他原因感兴趣,请参阅此处的apache FTPClient文档:

ParserInitializationException - 如果 parserKey 参数,则抛出 无法由选定的解析器工厂解析。在 默认FTPEntryParserFactory,当parserKey是 既不是实现 interface org.apache.commons.net.ftp.FTPFileEntryParser 也不是字符串 包含映射到此类解析器的已识别键之一,或者如果 类装入器安全问题会阻止其装入。

最新更新