【问题标题】:NullPointerException throws when i try to download files from FTP当我尝试从 FTP 下载文件时抛出 NullPointerException
【发布时间】:2013-10-13 12:17:54
【问题描述】:

我正在尝试从 FTP 顺序下载两个文件。第一次下载文件没有任何问题。但是当InputStream 使用ftpClient.retrieveFileStream() 初始化时,第二个抛出 NullPointerException。我试图改变顺序,但没有任何效果。文件在 FTP 上存在且可用。

代码

FTPClient ftpClient;

    @Override
    protected void onPreExecute() {
        String server = "xxxxxxxxxxxxxxxxxxxxx";
        int port = 21;
        String user = "xxxxxx";
        String pass = "xxxxxx";
        long fileSize = 0;

        try {
            ftpClient = new FTPClient();
            ftpClient.connect(server, port);
            ftpClient.login(user, pass);
            ftpClient.enterLocalPassiveMode();
            fileSize += getFileSize(ftpClient, CARDS_DB);
            fileSize += getFileSize(ftpClient, IMG_DB);
            showDialog(PROGRESS_DLG_ID);
            downloadProgress.setMax((int) fileSize);
        } catch (Exception e) {
            Log.e("ERROR", e.toString());
        }
    }

    @Override
    protected Boolean doInBackground(String... strings) {

        final String PATH = getExternalCacheDir().toString() + "/";
        int total = 0;

        try {
            downloadFile(ftpClient, PATH, CARDS_DB, total);
            downloadFile(ftpClient, PATH, IMG_DB, total);
        } catch (Exception e) {
            Log.e("EXCEPTION", e.toString());
            return false;
        } finally {
            try {
                if (ftpClient.isConnected()) {
                    ftpClient.logout();
                    ftpClient.disconnect();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        return true;
    }

    private void downloadFile(FTPClient ftpClient, String PATH, String fileName, int total) {
        try {
            File downloadFile = new File(PATH + fileName);
            OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(downloadFile));
            InputStream inputStream;
            inputStream = ftpClient.retrieveFileStream(fileName); //here i have exception at second method invocation.

            byte[] bytesArray = new byte[8192];
            int bytesRead;
            while ((bytesRead = inputStream.read(bytesArray)) != -1) {
                total += bytesRead;
                outputStream.write(bytesArray, 0, bytesRead);
                publishProgress(total);
            }
            outputStream.close();
            inputStream.close();

        } catch (Exception ex) {
            Log.d("ERROR", "Error: " + ex.getMessage());
            ex.printStackTrace();
        }
    }

LOGCAT:

10-13 14:51:29.519 W/System.err(9554): java.lang.NullPointerException
10-13 14:51:29.529 W/System.err(9554):  at com.FHS.ActivityMain$DBLoad.downloadFile(ActivityMain.java:170)
10-13 14:51:29.529 W/System.err(9554):  at com.FHS.ActivityMain$DBLoad.doInBackground(ActivityMain.java:141)
10-13 14:51:29.529 W/System.err(9554):  at com.FHS.ActivityMain$DBLoad.doInBackground(ActivityMain.java:102)
10-13 14:51:29.529 W/System.err(9554):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
10-13 14:51:29.529 W/System.err(9554):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
10-13 14:51:29.529 W/System.err(9554):  at java.util.concurrent.FutureTask.run(FutureTask.java:138)
10-13 14:51:29.529 W/System.err(9554):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
10-13 14:51:29.529 W/System.err(9554):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
10-13 14:51:29.529 W/System.err(9554):  at java.lang.Thread.run(Thread.java:1019)

已解决 问题解决了。我只需要在每次调用方法 downloadFile() 时初始化 FTPClient 并打开/关闭方法内部的连接。

【问题讨论】:

  • ActivityMain.java:170 是哪一行?
  • @ssantos - 他在源代码中注意到了这一点 - 寻找评论

标签: java android ftp inputstream


【解决方案1】:

我认为问题在于这行代码:

final String PATH = getExternalCacheDir().toString() + "/";

因为getExternalCacheDir() 方法将仅在缓存不为空时返回缓存目录。如果没有缓存,就没有目录。

您可以改用getExternalFilesDir()

参考:

编辑:请将代码修改为将 ftpClient 初始化为:

int reply;
ftp.connect(server,port);
reply = ftp.getReplyCode();

并检查回复代码。

【讨论】:

  • 使用 getExternalFilesDir() 无效。同样的例外在同一个地方。
  • 你确定 FTP hsd 超过两个文件..?
  • FTP 有很多文件,但我想直接加载 2 个文件。不再。它们存在于服务器上。但在第一次加载后 - 第二次抛出异常。
【解决方案2】:

我认为您的解决方案掩盖了您的问题,即您在关闭流之前没有在 downloadFile() 中调用 ftpClient.completePendingCommand()。

【讨论】:

    猜你喜欢
    • 2014-07-15
    • 2011-07-12
    • 2016-05-08
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    相关资源
    最近更新 更多