#android #ftp #bufferedinputstream
#Android #ftp #bufferedinputstream
Вопрос:
Я использую RetrieveFilestream
метод с BufferedInputStream
в цикле for. Я закрываю все потоки после обработки каждого файла, а также добавляю ожидающую завершения команду ftp.
В моей тестовой среде все работает так, как ожидалось, с несколькими файлами. Но в данных реального времени, где есть 200-300 файлов, он где-то зависает.
Он не выдает никаких исключений, затрудняющих отладку. Не удается отлаживать один за другим. Любая помощь? Вот мой блок кода.
public String LoopThroughFiles(FTPClient myftp, String DirectoryName)
{
boolean flag=false;
String output="";
InputStream inStream=null;
BufferedInputStream bInf= null;
StringBuilder mystring = new StringBuilder();
progressBar = (ProgressBar) findViewById(R.id.progressBar);
try {
flag= myftp.changeWorkingDirectory(DirectoryName);
if(flag==true)
{
FTPFile[] files = myftp.listFiles();
progressBar.setMax(files.length);
String fname="";
myftp.enterLocalPassiveMode();
if(files.length > 0)
{
int n=0;
for (FTPFile file : files)
{
n=n 1;
int r= progressBar.getProgress();
progressBar.setProgress(r n);
fname=file.getName();
// String path= myftp.printWorkingDirectory();
if(fname.indexOf("txt") != -1)
{
inStream = myftp.retrieveFileStream(fname);
int reply = myftp.getReplyCode();
if (inStream == null || (!FTPReply.isPositivePreliminary(reply) amp;amp; !FTPReply.isPositiveCompletion(reply))) {Log.e("error retrieving file",myftp.getReplyString()); }
bInf=new BufferedInputStream (inStream);
int bytesRead;
byte[] buffer=new byte[1024];
String fileContent=null;
while((bytesRead=bInf.read(buffer))!=-1)
{
fileContent=new String(buffer,0,bytesRead);
mystring.append(fileContent);
}
mystring.append(",");
bInf.close();
inStream.close();
boolean isSucess= myftp.completePendingCommand();
if(isSucess == false)
Log.e("error retrieving file","Failed to retrieve the stream for " fname);
}
}
flag= myftp.changeToParentDirectory();
}
}
}
catch (java.net.UnknownHostException e) {
e.printStackTrace();
Log.e("readfile,UnknownHost",e.getMessage());
}
catch (java.io.IOException e) {
e.printStackTrace();
Log.e("readfile,IO",e.getMessage());
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.e("readfile,General",e.getMessage());
}
finally
{
try {
output = mystring.toString();
if(bInf != null)
bInf.close();
if(inStream != null)
inStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.e("readfile,finallyblock",e.getMessage());
}
}
return output;
}
Комментарии:
1. Почему вы не используете
AsyncTask
?2. Я запускаю эту функцию только в AsyncTask
3. Пожалуйста, опубликуйте еще немного кода.
4. Это не зависает пользовательский интерфейс. Но для обработки около 300 текстовых файлов, в каждом из которых есть только одна строка текста, требуется всего 2 минуты или больше. Просто хочу, чтобы он работал быстро. Есть ли какой-нибудь способ? Есть ли какие-либо другие Ftp-клиенты, кроме apache, которые я могу попробовать.