Java 如何更改FTPClient中的目录。单个FTPClient InputStream connect中的多个目录。未知的分析器类型:"/路径“;是当前目录吗
FTPClient.changeWorkingDirectory&changeToParentDirectory()。如何在ftpCient中更改目录。在资源管理器中,ftp路径如下所示ftp://192.168.10.20。输入后,我可以看到文件夹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,但它
已完成、失败和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;
}
}
请帮我解决这个问题。提前谢谢
解决方案
-----刚刚关闭了inputStreamis.close()
和Boolean result=ftpClient.completePendingCommand()代码>
在InputStream中引发nullPointerException
is=ftpClient.retrieveFileStream(文件名+“.json”)如果文件夹没有请求的文件名,则会抛出NullPointerException。如何处理它而不更改retrieveFileStream
?更新:
问题似乎是因为您使用了此方法retrieveFileStream()代码>,这需要一些额外的进程,并且一旦完成,服务器要么断开连接,要么行为异常。以下是来自以下站点的关键零件信息:
retrieveFileStream-返回一个InputStream,其中一个命名文件来自该InputStream
服务器可以读取。如果当前文件类型为ASCII,则
返回的InputStream将文件中的行分隔符转换为
当地代表。您必须在完成时关闭输入流
从中阅读。InputStream本身将负责关闭
关闭父数据连接套接字时
要完成文件传输,必须调用completePendingCommand和
检查其返回值以验证是否成功。如果不这样做,,
后续命令可能会出现意外行为
因此您需要关闭steamis.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());