我正在尝试从 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 并打开/关闭方法内部的连接。