Java printWorkingDirectory()提供空值
我在下面写了一段将Excel记录插入db表的代码。Excel文件位于ftp服务器上。 基本上,我正在更改目录第一个abd RETRIVIG文件流Java printWorkingDirectory()提供空值,java,ftp-client,Java,Ftp Client,我在下面写了一段将Excel记录插入db表的代码。Excel文件位于ftp服务器上。 基本上,我正在更改目录第一个abd RETRIVIG文件流 readExcel(String test, String filename) { client.changeWorkingDirectory("/"+test); is = client.retrieveFileStream(filename"); //do the processing } 上面的代码只运行了一次。但现在
readExcel(String test, String filename) {
client.changeWorkingDirectory("/"+test);
is = client.retrieveFileStream(filename");
//do the processing
}
上面的代码只运行了一次。但现在我想在循环中使用上述代码并上传多个文件。我这样做了,发现只有第一个文件得到了正确处理,第二个文件就卡在client.retrieveFileStream()方法的上方。
在我对循环中的第一个文件使用printWorkingDirectory()
方法前后changeWorkingDirectory()
之后,它在前后给出了正确的目录。但这是第二次在循环中,它同时给出null,代码在此之前被卡住<代码>检索文件流()
据我所知,这个问题是因为
changeWorkingDirectory()
被多次调用 changeWorkingDirectory()
返回一个布尔值以指示成功或失败,但它在失败时隐藏了失败的原因。如果您查看源代码:
public boolean changeWorkingDirectory(String pathname) throws IOException
{
return FTPReply.isPositiveCompletion(cwd(pathname));
}
它只是将调用包装到cwd
现在,如果您想知道失败的原因,可以这样编写函数:
readExcel(String test, String filename) {
int returnCode = client.cwd("/"+test);
if ( FTPReply.isPositiveCompletion( returnCode ) ) {
is = client.retrieveFileStream(filename");
//do the processing
}
else {
System.out.println("Cannot cd to " + filename + " errorcode="+returnCode);
}
}
readExcel(String test, String filename) {
client.changeWorkingDirectory("/"+test);
is = client.retrieveFileStream(filename");
//do the processing
if(client.completePendingCommand()) {
//File transfer successful
} else {
//File transfer failed
}
}
然后只需查找您收到的代码的含义。
changeWorkingDirectory()
返回一个布尔值以指示成功或失败,但在失败时它会隐藏失败的原因。如果您查看源代码:
public boolean changeWorkingDirectory(String pathname) throws IOException
{
return FTPReply.isPositiveCompletion(cwd(pathname));
}
它只是将调用包装到cwd
现在,如果您想知道失败的原因,可以这样编写函数:
readExcel(String test, String filename) {
int returnCode = client.cwd("/"+test);
if ( FTPReply.isPositiveCompletion( returnCode ) ) {
is = client.retrieveFileStream(filename");
//do the processing
}
else {
System.out.println("Cannot cd to " + filename + " errorcode="+returnCode);
}
}
readExcel(String test, String filename) {
client.changeWorkingDirectory("/"+test);
is = client.retrieveFileStream(filename");
//do the processing
if(client.completePendingCommand()) {
//File transfer successful
} else {
//File transfer failed
}
}
然后看看你收到的代码的含义。我今天遇到了同样的问题: 使用
client.retrieveFileStream()
循环一次打印正确的工作目录,但第二次使用client.printWorkingDirectory()
仅打印null
在我的例子中,我刚刚将文件下载的类型从client.retrieveFile()
更改为client.retrieveFileStream()
,这要求以后调用client.completePendingCommand()
。文件说:
如果未执行此操作,后续命令可能会意外执行
更改您发布的代码时,将显示如下:
readExcel(String test, String filename) {
int returnCode = client.cwd("/"+test);
if ( FTPReply.isPositiveCompletion( returnCode ) ) {
is = client.retrieveFileStream(filename");
//do the processing
}
else {
System.out.println("Cannot cd to " + filename + " errorcode="+returnCode);
}
}
readExcel(String test, String filename) {
client.changeWorkingDirectory("/"+test);
is = client.retrieveFileStream(filename");
//do the processing
if(client.completePendingCommand()) {
//File transfer successful
} else {
//File transfer failed
}
}
但现在我想在循环中使用上述代码并上传多个文件
我知道这个问题已经得到了回答,所以这是给其他找到它的人的:
如果要上载/下载多个文件(如果所有文件都应进入/位于同一文件夹中!),则只应在开始时更改工作目录,因为:
登录到服务器后,它会将工作目录设置为根目录(例如\
)。如果随后循环浏览文件并每次尝试更改目录,则会发生以下情况:
- 第一个循环迭代:它将切换到您想要的目录,例如。
\subdir
- 第二个循环迭代:当前目录仍然是
,因此它将尝试切换到\subdir
,该目录可能存在,也可能不存在\subdir\subdir
- 第三个循环迭代:当前目录是
,它将尝试切换到\subdir\subdir
\subdir\subdir\subdir
一旦您注销并再次登录,工作目录将再次成为根目录(例如
\
)。我今天遇到了同样的问题:
使用client.retrieveFileStream()
循环一次打印正确的工作目录,但第二次使用client.printWorkingDirectory()
仅打印null
在我的例子中,我刚刚将文件下载的类型从client.retrieveFile()
更改为client.retrieveFileStream()
,这要求以后调用client.completePendingCommand()
。文件说:
如果未执行此操作,后续命令可能会意外执行
更改您发布的代码时,将显示如下:
readExcel(String test, String filename) {
int returnCode = client.cwd("/"+test);
if ( FTPReply.isPositiveCompletion( returnCode ) ) {
is = client.retrieveFileStream(filename");
//do the processing
}
else {
System.out.println("Cannot cd to " + filename + " errorcode="+returnCode);
}
}
readExcel(String test, String filename) {
client.changeWorkingDirectory("/"+test);
is = client.retrieveFileStream(filename");
//do the processing
if(client.completePendingCommand()) {
//File transfer successful
} else {
//File transfer failed
}
}
但现在我想在循环中使用上述代码并上传多个文件
我知道这个问题已经得到了回答,所以这是给其他找到它的人的:
如果要上载/下载多个文件(如果所有文件都应进入/位于同一文件夹中!),则只应在开始时更改工作目录,因为:
登录到服务器后,它会将工作目录设置为根目录(例如\
)。如果随后循环浏览文件并每次尝试更改目录,则会发生以下情况:
- 第一个循环迭代:它将切换到您想要的目录,例如。
\subdir
- 第二个循环迭代:当前目录仍然是
,因此它将尝试切换到\subdir
,该目录可能存在,也可能不存在\subdir\subdir
- 第三个循环迭代:当前目录是
,它将尝试切换到\subdir\subdir
\subdir\subdir\subdir
一旦您注销并再次登录,工作目录将再次成为根目录(例如
\
)。什么是客户端?如何调用此方法?客户端
似乎是apache.commons.net
的FTPClient
…我说得对吗?是的…非常抱歉,我没有提供足够的信息。该客户端正在进行ftp连接。客户端定义为全局变量,并且在调用此方法之前已设置。客户端是什么?如何调用此方法?客户端
似乎是apache.commons.net
的FTPClient
…我说得对吗?是的…非常抱歉,我没有提供足够的信息。该客户端正在进行ftp连接。客户端被定义为全局变量,并且在调用此方法之前已设置。我应该在changedirectory之前调用cwd方法还是在changedirectory方法之后调用cwd方法。第一次FTp回复是250-请求的文件操作可以。第二次循环显示257-路径名crea