【问题标题】:Downloading txt file from ftp server从 ftp 服务器下载 txt 文件
【发布时间】:2023-05-22 10:27:01
【问题描述】:

我尝试从 FTP 服务器下载一个简单的 txt 文件已经有一段时间了。

我正在使用此代码:

 String server = "ftp.server.com";
    int port = 21;
    String user = "user";
    String pass = "pass";

    FTPClient ftpClient = new FTPClient();
    try {

        ftpClient.connect(server, port);
        ftpClient.login(user, pass);
        ftpClient.enterLocalPassiveMode();
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

        String remoteFile1 = "/test.txt";
        File downloadFile1 = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "test.txt");
        OutputStream outputStream1 = new BufferedOutputStream(new FileOutputStream(downloadFile1));
        boolean success = ftpClient.retrieveFile(remoteFile1, outputStream1);
        outputStream1.close();

        if (success) {
            System.out.println("File #1 has been downloaded successfully.");
        }

    } catch (IOException ex) {
        System.out.println("Error: " + ex.getMessage());
        ex.printStackTrace();
    } finally {
        try {
            if (ftpClient.isConnected()) {
                ftpClient.logout();
                ftpClient.disconnect();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

但是 Android Studio 向我抛出了一个错误:

02-27 17:40:31.106  15373-15373/.upload_file_sample E/AndroidRuntime﹕ FATAL EXCEPTION: main
android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
        at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
        at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
        at java.net.InetAddress.getByName(InetAddress.java:289)
        at org.apache.commons.net.SocketClient.connect(SocketClient.java:203)
        at .upload_file_sample.MainActivity.DownloadDatabase(MainActivity.java:104)
        at .upload_file_sample.MainActivity$2.onClick(MainActivity.java:89)
        at android.view.View.performClick(View.java:4232)
        at android.view.View$PerformClick.run(View.java:17298)
        at android.os.Handler.handleCallback(Handler.java:615)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4921)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
        at dalvik.system.NativeStart.main(Native Method)

我不知道为什么。我仔细检查了我的 FTP 登录数据,但它们是正确的。我正在使用 apache-commons-net 库顺便说一句。有人可以帮我吗?

【问题讨论】:

    标签: android ftp


    【解决方案1】:

    在异步任务中添加您的代码。始终确保您不在主线程中进行 api 调用。检查这里的 asyntask 示例

    AsyncTask Android example

    【讨论】:

    • 哦,我明白了,谢谢。所以我猜对了,与 ftp 服务器的连接花费了太多时间,以至于主线程“等待太久”?我现在下载了文件,我在手机上看到了它,但是如果我将手机插入我的电脑并通过 USB 浏览它,文件就不会出现。你知道为什么吗?
    • 无法从主线程调用 api。它必须从不同的线程调用
    • 好的 :) 为什么我在我的电脑上看不到文件?
    • 您是否使用 asynctask 下载了文件?
    • 是的,错误消失了,当我使用文件浏览器应用程序浏览手机时,我可以看到它,但是当我用 USB 电缆插入时,我看不到手机上的文件
    【解决方案2】:

    致命异常:主 android.os.NetworkOnMainThreadException

    网络任务不能在主线程中运行,所以你必须把你的任务放到一个新线程中。

    new Thread(new Runnable() {
    
        @Override
        public void run() {
            // Your code
        }
    }).start();
    

    【讨论】:

      最近更新 更多