Java 如何更改FTPClient中的目录。单个FTPClient InputStream connect中的多个目录。未知的分析器类型:"/路径“;是当前目录吗

Java 如何更改FTPClient中的目录。单个FTPClient InputStream connect中的多个目录。未知的分析器类型:"/路径“;是当前目录吗,java,directory,ftp,ftp-client,cd,Java,Directory,Ftp,Ftp Client,Cd,FTPClient.changeWorkingDirectory&changeToParentDirectory()。如何在ftpCient中更改目录。在资源管理器中,ftp路径如下所示ftp://192.168.10.20。输入后,我可以看到文件夹已完成、失败和QRCODEGENERATE。在java代码中,我首先进入FAILURE文件夹并获取相应的文件。这个过程是成功的。在得到它之后,我想进入COMPLETED文件夹,我的意思是目录路径必须像这样更改/FAILURE到COMPLETED,但它

FTPClient.changeWorkingDirectory&changeToParentDirectory()。如何在ftpCient中更改目录。在资源管理器中,ftp路径如下所示ftp://192.168.10.20。输入后,我可以看到文件夹
已完成、失败和QRCODEGENERATE
。在java代码中,我首先进入
FAILURE
文件夹并获取相应的文件。这个过程是成功的。在得到它之后,我想进入
COMPLETED
文件夹,我的意思是目录路径必须像这样更改
/FAILURE
COMPLETED
,但它出现了错误。我在底部分享了控制台错误

如果我关闭连接并再次打开,则可以获取该值。但是我不想那样做。我想在不关闭连接的情况下更改目录

1.首先,我遇到了
故障
,我正在访问一个文件及其内容

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;
    }
 }
请帮我解决这个问题。提前谢谢

解决方案 -----刚刚关闭了inputStream
is.close()
Boolean result=ftpClient.completePendingCommand()

在InputStream中引发nullPointerException
is=ftpClient.retrieveFileStream(文件名+“.json”)retrieveFileStream

更新: 问题似乎是因为您使用了此方法
retrieveFileStream(),这需要一些额外的进程,并且一旦完成,服务器要么断开连接,要么行为异常。以下是来自以下站点的关键零件信息:

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

要完成文件传输,必须调用completePendingCommand和 检查其返回值以验证是否成功。如果不这样做,, 后续命令可能会出现意外行为

因此您需要关闭steam
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错误: 如果您对错误发生的其他原因感兴趣,请参阅apache网站:

ParserInitializationException-如果parserKey参数 无法由选定的分析器工厂解析。在 DefaultFTPEntryParserFactory,当parserKey为 实现 接口org.apache.commons.net.ftp.FTPFileEntryParser或字符串 包含映射到此类解析器的已识别密钥之一,或者 类加载器安全问题阻止加载它


很抱歉给您带来不便。这次我清楚地阐述和解释了。我正试图从当前文件夹返回并进入另一个文件夹。是的,一种方法是使用我的答案中所示的绝对路径。您的代码看起来像是成功导航到已完成的文件夹,但随后您还使用了不正确的相对路径。只需编辑这一行,不提供额外的路径
ftpClient.listFiles()
我应该在参数
ftpClient.changeWorkingDirectory(strDir)中给出
strDir
而不是
absoluteDirectoryPath
?是的,您可以在那里使用它。一旦您使用了该命令,其他命令就不需要该路径,因为默认情况下它们将使用当前工作目录。关闭输入流后
为.close()
。我可以进入另一个文件夹。谢谢你帮我兄弟。来了50个代表;-)
//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());