Android Studio从URL检索文件并解析内容

gmxoilav  于 2023-05-12  发布在  Android
关注(0)|答案(2)|浏览(192)

我一辈子都不知道如何弄清楚从URL检索文本文件并阅读其内容这一最简单的任务。我找到的所有代码都是5-12年前的,不起作用。由于android API 30+,主线程上的任何网络请求给予android.os.NetworkOnMainThreadException.我在这部分使用了Kotlin。
我不能使用DownloadManager(除非有一种方法可以临时存储文件并检索内容),因为文件不需要下载到本地存储,只能读取。我看到的最接近的是:Android - How can I read a text file from a url?

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) {
}

但是这个密码不起作用。

b4lqfgs4

b4lqfgs41#

所以在三天后想跳下悬崖。我找到了答案。当然,这是在问了这个问题几分钟后(第一个问题,所以要友好。)。唯一的问题是你需要一个SSL证书的HTTPS服务器检索文件。我的服务器是http,但我可以在那里得到一个证书,并修复。为了测试,我抛出了一个github存储库并链接到原始文本文件。这是我的解决方案,如果这节省你3天倒一个给我。

Thread {
            try {
                val url = URL("https://raw.githubusercontent.com/USERNAME/NeedHTTPSdontWanaSSL/main/info.txt")
                val uc: HttpsURLConnection = url.openConnection() as HttpsURLConnection
                val br = BufferedReader(InputStreamReader(uc.getInputStream()))
                var line: String?
                val lin2 = StringBuilder()
                while (br.readLine().also { line = it } != null) {
                    lin2.append(line)
                }
                Log.d("The Text", "$lin2")
            } catch (e: IOException) {
                Log.d("texts", "onClick: " + e.getLocalizedMessage())
                e.printStackTrace()
            }
        }.start()

Credit:answered Aug 12,2018 at 9:29 Aishik kirtaniya Android - How can I read a text file from a url?

hsvhsicv

hsvhsicv2#

这个怎么样?

import java.net.URL

val s = "https://www.someplace.com/dir/file.txt"
val text = URL(s).openStream().readAllBytes().decodeToString()

如果你愿意的话,可以把它 Package 在一些异常处理中。只要您不保留对中间流的引用,它将立即符合垃圾收集的条件。流在被垃圾收集时将被关闭,因此我不需要添加一个调用来显式地关闭它。

相关问题