从Android设备读取服务器上的文本文件

41

我在服务器上有一个文本文件。我想从我的Android应用程序中打开这个文本文件,然后在TextView中显示文本。我找不到任何如何连接到服务器并将数据馈入字符串的基本示例。

如果您能提供任何帮助,将不胜感激。


你如何在服务器上提供文本文件?通过HTTP协议吗? - aioobe
是的,如果我访问http://www.mysite.com/thefile.txt,我可以看到文本。在iPhone上,我能够连接到该文件并将其输入到一个字符串中,然后对其进行任何操作。 - Chris
3个回答

65

尝试以下方法:

try {
    // Create a URL for the desired page
    URL url = new URL("mysite.com/thefile.txt");

    // Read all the text returned by the server
    BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
    String str;
    while ((str = in.readLine()) != null) {
        // str is one line of text; readLine() strips the newline character(s)
    }
    in.close();
} catch (MalformedURLException e) {
} catch (IOException e) {
}

(取自Exampledepot: 获取URL中的文本)

在安卓上应该能正常工作。


3
注意:始终将您的Closeable对象在finally块中关闭,这是确保它们即使在出现异常时也会被关闭的唯一方法。 - Octavian Helm

15

虽然URL.openStream将起作用,但最好使用与Android一起提供的Apache HttpClient库进行HTTP操作。除其他原因外,您可以使用内容编码(gzip),这将使文本文件传输更小(更好的电池寿命,较少的网络使用量)和更快。

有多种使用HttpClient的方法,并且存在几个帮助程序来包装它们并使其更易于使用。有关详细信息,请参见此帖子:Android项目使用httpclient-> http.client(apache),post/get方法(请注意,我在那里包含的HttpHelper确实使用gzip,尽管并非所有都如此)。

而且,无论您使用哪种方法从HTTP检索数据,都应该使用AysncTask(或Handler)来确保在进行网络调用时不会阻塞UI线程。

请注意,您几乎永远不应该只使用URL.openStream(而不设置一些配置,如超时),尽管许多示例显示此操作,因为如果服务器不可用,它将无限期地阻塞(默认情况下,它没有超时):URL.openStream()可能会导致您被挂起


1
这是一个非常老的答案,Android团队现在建议使用标准的java.net库。如果想要一个真正好用的封装(它处理超时和更多内容),请查看Kevin Sawicki的HttpRequest:https://github.com/kevinsawicki/http-request - Charlie Collins
这里上面的被接受的答案很好,但我仍然非常警惕超时。在那个例子中,它们没有被设置,而且 url.openStream 在过去会在服务器无响应时挂起(默认超时时间是/曾经是0,这意味着永远不会超时)。我链接的文章已经消失了,但还有很多其他文章也指出了同样的问题:https://eventuallyconsistent.net/2011/08/02/working-with-urlconnection-and-timeouts/ - Charlie Collins

7
不要忘记在获取网络资源时将Internet权限添加到清单中:(在清单中添加)。

7
这应该是一条评论。 - Mangesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接