我找不到任何地方对文件进行简单FTP访问的示例,并且FTPClient类(有几个示例使用)未出现在Android类索引中。我有http访问工作,但我怎么做一个简单的FTP获取?我想要做的就是下载(例如): ftp://tgftp.nws.noaa.gov/data/observations/metar/stations/KABQ.TXT 它不应该要求登录,更改目录等。 只是将该URL提供给http访问方法似乎不起作用。
这类似于以下问题: unable to read file from ftp in android?
我尝试了一个简单的:
StringBuilder response = new StringBuilder();
URLConnection ftpConn;
try {
URL netUrl = new URL("ftp://tgftp.nws.noaa.gov/data/observations/metar/stations/KABQ.TXT");
ftpConn = netUrl.openConnection();
BufferedInputStream bufRd = new BufferedInputStream(ftpConn.getInputStream());
int temp;
while ((temp = bufRd.read()) != -1) {
response.append(temp);
}
bufRd.close();
} catch (Exception e) {
return "Failure";
}
但它在getInputStream上获得异常: 无法连接到服务器:无法配置数据端口
此外,必须有一种更智能的方法将数据从流缓冲区中拉出,而不是逐字节,不存在?我也找不到。
最后,我需要同时进行http和ftp访问,是否有任何理由不对两种访问类型都使用URLConnection?或者对于ftp使用HttpConnection和为ftp使用URLConnection是否更好?
谢谢!
答案 0 :(得分:9)
呼!我终于明白了。我放弃了在webOS和WPF / C#中工作的简单方法,你只需要做一个ftp :: // ......你必须使用FTPClient包。
修复库访问(项目|属性| Java构建路径|库|添加JAR ...)后,我调整了调用,直到它开始工作。这是我的FTPClient调用的序列。直到我将它设置为被动模式才会起作用。
mFTPClient = new FTPClient();
mFTPClient.connect("tgftp.nws.noaa.gov");
mFTPClient.login("anonymous","nobody");
mFTPClient.enterLocalPassiveMode();
mFTPClient.changeWorkingDirectory("/data/forecasts/taf/stations");
InputStream inStream = mFTPClient.retrieveFileStream("KABQ.TXT");
InputStreamReader isr = new InputStreamReader(inStream, "UTF8");
答案 1 :(得分:2)
我还在网上找到了“逐字节”问题的答案。这似乎可以将InputStream类型直接转换为String类型:
String theStr = new Scanner(inStream).useDelimiter("\\A").next();
答案 2 :(得分:1)
我还在不使用第三方库的情况下寻找一个简单的ftp下载示例。没找到,所以在这里发布我的解决方案。
默认情况下,URLConnection使用带有空密码的用户名'anonymous',这是许多ftp服务器不接受的,因为它们需要电子邮件作为'anonymous'的密码。要在您的应用中使用以下代码,只需添加try..catch并确保从流中读取不是阻止UI线程。
URL url = new URL("ftp://ftp.mozilla.org/README");
URLConnection cn = url.openConnection();
cn.setRequestProperty ("Authorization", "Basic " + Base64.encodeToString("anonymous:a@b.c".getBytes(), Base64.DEFAULT));
final File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
FileOutputStream fos = new FileOutputStream(dir.getPath() + "/README");
InputStream is = cn.getInputStream();
int bytesRead = -1;
byte[] buf = new byte[8096];
while ((bytesRead = is.read(buf)) != -1) {
fos.write(buf, 0, bytesRead);
}
if(is != null)is.close();
if(fos != null){ fos.flush(); fos.close(); }
希望这会为你节省一些时间。