-1

我正在尝试从 FTP 顺序下载两个文件。第一次下载文件没有任何问题。但是第二个在InputStream初始化时抛出 NullPointerException ftpClient.retrieveFileStream()。我试图改变顺序,但没有任何效果。文件在 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();
        }
    }

日志猫:

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 并打开/关闭方法内部的连接。

4

2 回答 2

0

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

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

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

你可以getExternalFilesDir()改用。

参考:

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

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

并检查回复代码。

于 2013-10-13T13:06:22.913 回答
0

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

于 2014-10-10T20:08:18.087 回答