提问人:HermannGo 提问时间:11/3/2023 更新时间:11/3/2023 访问量:43
从服务器读取文本文件 (.txt)
Read text file (.txt) from a server
问:
Android Studio - 爪哇 几天来,我一直在尝试从我的网站上读取文本文件。 在互联网上找到的例子是行不通的。 “Error”始终在“catch”中输出(参见下面的代码)。 URL 的路径正确无误。我通过下载对其进行了测试。 添加了 Internet 权限。 问题出在哪里?
try{
URL yahoo = new URL("https://www.robl.de/data/HS.txt");
URLConnection yc = yahoo.openConnection();
BufferedReader in = new BufferedReader(
new InputStreamReader(
yc.getInputStream()));
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
catch ( IOException e ) {
e.printStackTrace();
inputLine="error";
}
try{
URL llll = new URL("http://www.robl.de/data/HS.txt");
URLConnection conLLL = llll.openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader( conLLL.getInputStream()));
while ( ( strLine = br.readLine() ) != null)
System.out.println(strLine);
br.close();
}
catch(Exception ex)
{
ex.printStackTrace();
strLine="error";
}
答:
0赞
Deepak sharma
11/3/2023
#1
听起来您遇到了 NetworkOnMainThreadException,这是在尝试在 Android UI 线程上执行网络操作时发生的。Android 要求在后台线程上发出网络请求。下面介绍如何修改代码以使用 AsyncTask 在后台线程上执行网络操作:
import android.os.AsyncTask;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
public class NetworkFileReader extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urlString) {
StringBuilder content = new StringBuilder();
try {
URL url = new URL(urlString[0]);
URLConnection urlConnection = url.openConnection();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
String line;
while ((line = bufferedReader.readLine()) != null) {
content.append(line).append("\n");
}
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
return "Error: " + e.getMessage();
}
return content.toString();
}
@Override
protected void onPostExecute(String result) {
// This is where you would handle the result of the network operation
// For example, updating the UI or storing the data
System.out.println(result);
}
}
// Usage:
new NetworkFileReader().execute("https://www.robl.de/data/HS.txt");
请确保在 Activity 或 Fragment 中适当地执行此 AsyncTask,并在 onPostExecute 方法中处理结果。
此外,请确保您在AndroidManifest.xml中拥有互联网权限:
<uses-permission android:name="android.permission.INTERNET" />
请注意,AsyncTask 在 API 级别 30 及更高版本中已弃用。对于现代 Android 开发,请考虑使用 Kotlin 协程或 Java 并发实用程序(如 Executors)。但是,AsyncTask 仍然是出于教育目的或在遗留代码库中快速解决此问题的有效方法。enter code here
评论
0赞
HermannGo
11/5/2023
在 Deepak Sharma Das sieht gut aus.Mein Problem ist jetzt, ich kann den Import: “import android.os.AsyncTask;” nicht in das Projekt einbinden, da es ein Libgdx Projekt ist
0赞
HermannGo
11/5/2023
在迪帕克·夏尔马(Deepak Sharma):看起来不错。我现在的问题是,我可以导入:“import android.os.AsyncTask;”不要将其包含在项目中,因为它是 Libgdx 项目
0赞
Reilas
11/3/2023
#2
作为参考,请使用 URL#openStream 方法。
URL u = new URI("https://www.robl.de/data/HS.txt").toURL();
try (BufferedReader r = new BufferedReader(new InputStreamReader(u.openStream()))) {
r.lines().forEach(System.out::println);
}
评论