为什么 FTP 下载不能与 Java 一起正常工作
Why does the FTP download not work properly with Java
我目前正在 Java 开发一个小型清单生成器程序。我想将创建的文件上传和下载到我的 FTP 服务器 (ftps)。我正在使用以下代码进行下载:
public static void downloadfile(){
FTPSClient con = null;
System.out.println("Download Status: 5%");
try
{
System.out.println("Download Status: 20%");
con = new FTPSClient();
con.connect(url);
if (con.login(user, psw))
{
System.out.println("Download Status: 50%");
con.enterLocalPassiveMode(); // important!
con.setFileType(FTP.BINARY_FILE_TYPE);
String data = "E:\Downloads\Testdokument.txt";
OutputStream out = new FileOutputStream(new File(data));
boolean result = con.retrieveFile("Testdokument.txt", out);
out.close();
System.out.println(result);
if (result) {
System.out.println("Download Status: 100%");
} else if(result == false) {
System.out.println("Download won't work");
}
con.logout();
con.disconnect();
}
}
catch (Exception e)
{
System.out.println("download failed");
e.printStackTrace();
}
}
问题是下载本身工作正常。但是下载的文件是空的。如果我用图像尝试它,它不是 "readable"。上传反而完美无缺。我将 Apache Common IO Library 用于 FTP 函数。
如果我下载文件,控制台首先显示状态 5%、20%、50%,然后添加虚假陈述后,下载将无法运行...
我不知道为什么文件本身正在下载但不包含任何内容。
有什么想法吗?
您没有正确地使用 java 中的资源。
任何时候创建代表资源的对象,都必须关闭它。你打开一个新的 FileOutputStream
,那是一个资源。任何实现 AutoCloseable
的东西绝对是您必须关闭的资源。试试这个:
try (OutputStream out = new FileOutputStream(data /* no need to wrap in File */)) {
// do your stuff with out here
}
第二个注意事项:你的异常处理很糟糕;请停止犯这个常见错误。异常包含 4 位有用的信息:类型、消息、跟踪和原因。您实际上是将 4 个中的 3 个扔进了垃圾箱。只需将 throws Exception
添加到您的主要方法和您的 downloadFile
方法。它可以节省您的输入时间并使您的错误消息更有用。
我找到了解决方案。
我添加了以下两个东西,现在可以使用了
con.execPBSZ(0);
con.execPROT("P");
不知道那代表什么,但我会找出来的。
我知道这个答案是题外话,但我想为用户 rzwitserloot 提供一个例子,它表明 printStackTrace()
没有隐藏任何重要信息。这不适合评论:
public class Main
{
public static void doSomething()
{
int array[] = {1, 2, 3};
int b = array[3]; // throws Exception
}
public static void test() throws Exception
{
try
{
doSomething();
}
catch (Exception e)
{
throw new Exception("something bad happened", e);
}
}
public static void main(String[] args) throws Exception
{
try
{
test();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
产生输出:
java.lang.Exception: something bad happened
at Main.test(Main.java:18)
at Main.main(Main.java:26)
Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at Main.doSomething(Main.java:7)
at Main.test(Main.java:14)
... 1 more
另请参阅 Oracle 的文档:
我目前正在 Java 开发一个小型清单生成器程序。我想将创建的文件上传和下载到我的 FTP 服务器 (ftps)。我正在使用以下代码进行下载:
public static void downloadfile(){
FTPSClient con = null;
System.out.println("Download Status: 5%");
try
{
System.out.println("Download Status: 20%");
con = new FTPSClient();
con.connect(url);
if (con.login(user, psw))
{
System.out.println("Download Status: 50%");
con.enterLocalPassiveMode(); // important!
con.setFileType(FTP.BINARY_FILE_TYPE);
String data = "E:\Downloads\Testdokument.txt";
OutputStream out = new FileOutputStream(new File(data));
boolean result = con.retrieveFile("Testdokument.txt", out);
out.close();
System.out.println(result);
if (result) {
System.out.println("Download Status: 100%");
} else if(result == false) {
System.out.println("Download won't work");
}
con.logout();
con.disconnect();
}
}
catch (Exception e)
{
System.out.println("download failed");
e.printStackTrace();
}
}
问题是下载本身工作正常。但是下载的文件是空的。如果我用图像尝试它,它不是 "readable"。上传反而完美无缺。我将 Apache Common IO Library 用于 FTP 函数。
如果我下载文件,控制台首先显示状态 5%、20%、50%,然后添加虚假陈述后,下载将无法运行...
我不知道为什么文件本身正在下载但不包含任何内容。
有什么想法吗?
您没有正确地使用 java 中的资源。
任何时候创建代表资源的对象,都必须关闭它。你打开一个新的 FileOutputStream
,那是一个资源。任何实现 AutoCloseable
的东西绝对是您必须关闭的资源。试试这个:
try (OutputStream out = new FileOutputStream(data /* no need to wrap in File */)) {
// do your stuff with out here
}
第二个注意事项:你的异常处理很糟糕;请停止犯这个常见错误。异常包含 4 位有用的信息:类型、消息、跟踪和原因。您实际上是将 4 个中的 3 个扔进了垃圾箱。只需将 throws Exception
添加到您的主要方法和您的 downloadFile
方法。它可以节省您的输入时间并使您的错误消息更有用。
我找到了解决方案。
我添加了以下两个东西,现在可以使用了
con.execPBSZ(0);
con.execPROT("P");
不知道那代表什么,但我会找出来的。
我知道这个答案是题外话,但我想为用户 rzwitserloot 提供一个例子,它表明 printStackTrace()
没有隐藏任何重要信息。这不适合评论:
public class Main
{
public static void doSomething()
{
int array[] = {1, 2, 3};
int b = array[3]; // throws Exception
}
public static void test() throws Exception
{
try
{
doSomething();
}
catch (Exception e)
{
throw new Exception("something bad happened", e);
}
}
public static void main(String[] args) throws Exception
{
try
{
test();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
产生输出:
java.lang.Exception: something bad happened
at Main.test(Main.java:18)
at Main.main(Main.java:26)
Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at Main.doSomething(Main.java:7)
at Main.test(Main.java:14)
... 1 more
另请参阅 Oracle 的文档: