我试图从FTP顺序下载两个文件。首先下载文件没有任何问题。但是当InputStream
用ftpClient.retrieveFileStream()
初始化时,第二次抛出NullPointerException。我试图改变序列,但它没有效果。文件存在并在FTP上可用。当我尝试从FTP下载文件时引发NullPointerException
CODE
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
@ssantos - 他在源文件中注明了这一点 - 寻找评论 – kamituel
对,我的坏... – ssantos