【问题标题】:Reading txt file from an ftp server and returning it from AsyncTask从 ftp 服务器读取 txt 文件并从 AsyncTask 返回
【发布时间】:2014-05-20 23:42:47
【问题描述】:

我的ftp server 中有一个txt file。我要做的就是读取该文件,检索内容并使用AsyncTask 将其保存为字符串。据我从 logcat 中了解到,我可以连接 ftp server 并且可以更改目录。但是我无法读取文本文件的上下文,也不知道如何从我的AsyncTask 类中返回它。

这些是我的代码:

MainActivity.java

package com.example.ftpdenemeleri;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;

public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FtpAsync task1 = new FtpAsync();
    task1.execute();

    }
}

FtpAsync.java

package com.example.ftpdenemeleri;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPCmd;
import android.os.AsyncTask;

public class FtpAsync extends AsyncTask <Void, Void, String>{

@Override
protected void onPreExecute() {
   super.onPreExecute();      
}

@Override
protected String doInBackground(Void... params) {
    // TODO Auto-generated method stub

    FTPClient ftpClient = new FTPClient();
    try {
        ftpClient.connect("hostname", 21);

        System.out.println(ftpClient.getReplyString());
        ftpClient.sendCommand(FTPCmd.USER, "user");
        System.out.println(ftpClient.getReplyString());
        ftpClient.sendCommand(FTPCmd.PASS, "pass");
        System.out.println(ftpClient.getReplyString());
        ftpClient.sendCommand(FTPCmd.CWD, "/home/www/bitirme");
        InputStream is = new      BufferedInputStream(ftpClient.retrieveFileStream("beaglesays.txt")); 
        System.out.println("Input Stream has opened.");

      } catch (IOException ex) {
        System.err.println(ex);
    }
    return null; 
}

protected void onPostExecute() {
        // TODO: check this.exception 
        // TODO: do something with the feed
    }
}

【问题讨论】:

    标签: android ftp android-asynctask return-value


    【解决方案1】:

    你的代码必须是这样的:

     package com.example.ftpdenemeleri;
    
    import java.io.BufferedInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    import org.apache.commons.net.ftp.FTPClient;
    import org.apache.commons.net.ftp.FTPCmd;
    import android.os.AsyncTask;
    
    public class FtpAsync extends AsyncTask <Void, Void, String>{
    
    @Override
    protected void onPreExecute() {
    super.onPreExecute();      
    }
    
    @Override
    protected String doInBackground(Void... params) {
    // TODO Auto-generated method stub
    
    FTPClient ftpClient = new FTPClient();
    try {
        ftpClient.connect("hostname", 21);
    
        System.out.println(ftpClient.getReplyString());
        ftpClient.sendCommand(FTPCmd.USER, "user");
        System.out.println(ftpClient.getReplyString());
        ftpClient.sendCommand(FTPCmd.PASS, "pass");
        System.out.println(ftpClient.getReplyString());
        ftpClient.sendCommand(FTPCmd.CWD, "/home/www/bitirme");
        InputStream is = new           BufferedInputStream(ftpClient.retrieveFileStream("beaglesays.txt")); 
        System.out.println("Input Stream has opened.");
    
    Scanner s = new Scanner(is).useDelimiter("\\A"); // Convert your stream into string
            return s.hasNext() ? s.next() : ""; //send the string to onPostExecute()
    
    
      } catch (IOException ex) {
        System.err.println(ex);
    }
    return null; 
    }
    
    
    protected void onPostExecute(String result) {
        // TODO: check this.exception 
        // TODO: do something with the feed
    Log.i("Result : ",result);
        }
    }
    

    【讨论】:

    • 嗨@AosKhalifa,当我尝试按照您的建议使用扫描仪时,其余代码变得无法访问。我已经使用 System.out.println 对其进行了测试,并且收到了“无法访问的代码”警告。
    【解决方案2】:

    有很多方法可以将 InputStream 完全读入 String。最简单的方法是使用来自Apache Commons IOIOUtils.toString()

    因此,假设更改是从doInBackground() 返回所述字符串并在onPostExecute() 中接收它。

    【讨论】:

    • 我尝试过使用 IOUtils.toString() 但我想我做不到。
    【解决方案3】:

    尝试清楚地理解AsyncTask。 一些事情: (1) 类似问题:Howto do a simple ftp get file on Android (2) 在 doInBackground() 中获取内容后 - 将内容作为字符串返回(目前您返回 null)。 (3) 在 onPostExecute(String result) 中添加参数,这将是文件的内容。

    【讨论】:

    • 我已经看到了这个问题,但是由于我对 java 和 android 有点陌生,我不知道如何处理 InputStream 和 InputStreamReader,这就是我不明白的一点。关于 AsyncTask,你是对的,我仍然不知道如何从 doInBackground 将字符串传递给 onPostExecute。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 2018-05-12
    • 2015-03-20
    • 1970-01-01
    • 2021-08-10
    • 2020-11-07
    相关资源
    最近更新 更多