从java代码下载Ftp文件

从java代码下载Ftp文件,java,ftp-client,apache-commons-net,Java,Ftp Client,Apache Commons Net,我有这个代码来下载一个文件 import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import org.apache.commons.net.ftp.FTPClient; public class NetTest { public static void main(String[] args){ FTPClient client = new FTPClient(

我有这个代码来下载一个文件

    import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.commons.net.ftp.FTPClient;
public class NetTest {
public static void main(String[] args){
FTPClient client = new FTPClient( );
OutputStream outStream;
    try {
这是服务器和密码的一部分

   client.connect( "servername" );
    client.login("noman123", "pass");
    String remoteFile = "/a.txt";
    outStream = new FileOutputStream( "a.txt" );
简单填充下载,但此行出错

    client.retrieveFile( remoteFile, outStream );
} catch(IOException ioe) {
    System.out.println( "Error communicating with FTP server." );
} finally {
    try {
        client.disconnect( );
    } catch (IOException e) {
        System.out.println( "Problem disconnecting from FTP server" );
    }
}

}
}
它给了我一些错误,比如 我希望你能理解我现在面临的问题

java.net.SocketException:软件导致的连接中止:套接字写入错误 位于java.net.SocketOutputStream.socketWrite0(本机方法) 位于java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109) 位于java.net.SocketOutputStream.write(SocketOutputStream.java:153) 在sun.nio.cs.streamncoder.writeBytes上(streamncoder.java:221) 位于sun.nio.cs.streamncoder.implFlushBuffer(streamncoder.java:291) 位于sun.nio.cs.streamncoder.implFlush(streamncoder.java:295) 位于sun.nio.cs.streamncoder.flush(streamncoder.java:141) 位于java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229) 位于java.io.BufferedWriter.flush(BufferedWriter.java:254) 在org.apache.commons.net.ftp.ftp.\uu发送(ftp.java:496) 位于org.apache.commons.net.ftp.ftp.sendCommand(ftp.java:470) 位于org.apache.commons.net.ftp.ftp.sendCommand(ftp.java:547) 位于org.apache.commons.net.ftp.ftp.port(ftp.java:872) 位于org.apache.commons.net.ftp.FTPClient.openDataConnection(FTPClient.java:667) 位于org.apache.commons.net.ftp.FTPClient.retrieveFile(FTPClient.java:1595) 位于FtpDownloadDemo.main(FtpDownloadDemo.java:25)


确保您可以ping服务器并手动登录,但假设您在那里一切正常,我还需要做两件事

1) 根据FTP客户端文档,检查您是否真正连接

// After connection attempt, you should check the reply code to verify success.
reply = client.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply))
        { // print more complete error }
这里有一个完整的例子


2) 可能是因为您试图获取远程文件“/a.txt”,您试图获取根目录,而ftp服务器未设置为允许您访问。在ftp客户端设置为将用户转储到的任何目录中尝试“a.txt”。

确保您可以ping服务器并手动登录,但假设您在那里一切正常,我还需要做两件事

1) 根据FTP客户端文档,检查您是否真正连接

// After connection attempt, you should check the reply code to verify success.
reply = client.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply))
        { // print more complete error }
这里有一个完整的例子


2) 可能是因为您试图获取远程文件“/a.txt”,您试图获取根目录,而ftp服务器未设置为允许您访问。试试“a.txt”在ftp客户端设置为将用户转储到哪个目录中。

关闭防火墙。在本期中

关闭防火墙。在本期中

有关给定示例代码的文档,如果您位于防火墙后,则应调用FTPClient的enterLocalPassiveMode方法。

上的文档给出了一个示例代码,如果您在防火墙后面,您应该调用FTPClient的enterLocalPassiveMode方法。

阅读本文

解决此问题时,请使用启动程序

-Djava.net.preferIPv4Stack=true

阅读这篇文章

解决此问题时,请使用启动程序

-Djava.net.preferIPv4Stack=true


您应该打印堆栈跟踪,而不是打印自定义消息,堆栈跟踪很可能会为您提供有关发生情况的有用信息。(
ioe.printStackTrace()
)我已经这样做了,但是它给了我不可理解的文本,不可理解的文本可能非常有用。为什么不编辑您的问题并在底部添加文本内容?您已单击问题下方的“编辑”,添加文本并保存编辑?可能相关:这表明存在防火墙问题。而不是打印自定义消息,您应该打印堆栈跟踪,它很可能会为您提供有关发生情况的有用信息。(
ioe.printStackTrace()
)我已经这样做了,但是它给了我不可理解的文本,不可理解的文本可能非常有用。为什么不编辑您的问题并在底部添加文本内容?您已单击问题下方的编辑,添加了您的文本并保存了编辑?可能相关:这表明存在防火墙问题。我刚刚这样做,它显示我已连接并在根目录上,但当我尝试访问某些数据时失败。我刚刚这样做,它显示我已连接并在根目录上,但当我尝试访问某些数据时失败。