gpt4 book ai didi

java - InputStream 有什么问题?

转载 作者:行者123 更新时间:2023-11-29 20:57:43 25 4
gpt4 key购买 nike

APP IDEA:我正在努力从 Web 获取 XML 文件并将其存储在内部存储中。当用户单击 MainActivity 中的“搜索”按钮时,我的应用会检查是否存在 Internet 连接。

  1. 如果有 Internet 连接,那么我应该从给定的 URL 获取 XML 并将其存储在内部存储上的文件中。

  2. 如果没有互联网连接,我应该只使用存储的文件。

出了什么问题:出现的问题是,如果我启用了 WiFi,它不会通过网络解析 InputStream - 因此不会有输出(当用户单击“搜索”时它不会在 XML 中找到该词,尽管它存在)。但是,如果 WiFi 关闭,则它会在存储的文件中找到完全相同的单词。 (请查看下面的示例代码以获得更多说明)。

我的代码(在 HandleXML.java 中):

 public void handlingOnlineXML(Context ctx) throws XmlPullParserException, IOException {
InputStream is;

/*
* Fetching the XML file from the Web
*/
URL url = new URL("http://meteo.arso.gov.si/uploads/probase/www/observ/surface/text/sl/observation_si_latest.xml");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestMethod("GET");
conn.setDoInput(true);
// Starts the query
conn.connect();
int response = conn.getResponseCode();
Log.d(TAG,"The response is: " + response);
is = conn.getInputStream();

/*
* Initiating XMLPullParser and sending the InputStream
* into parseXMLandStoreIt method
*/
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();



/*
* Saving Input Stream to a Internal Storage file
*/
InputStream ins = is;
try {
final File file = new File(ctx.getFilesDir(), "data.xml");
final OutputStream output = new FileOutputStream(file);

try {
final byte[] buffer = new byte[1024];
int read;

while ((read = ins.read(buffer)) != -1)
output.write(buffer, 0, read);

output.flush();
} finally {
output.close();
}
} catch (Exception e) {
e.printStackTrace();
}
xpp.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES
, false);
xpp.setInput(is, null);
parseXMLAndStoreIt(xpp);
is.close();
ins.close();

}

/*******************************************************************
* Here I handle the XML data from a file stored on local storage
******************************************************************/

public void handlingStoredXML(Context ctx)throws XmlPullParserException, IOException{
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();

xpp.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES
, false);

//File file = new File(ctx.getFilesDir(), "data.xml")
File file = new File(ctx.getFilesDir()+"/data.xml");
if(file.exists()) {
Log.d(TAG, "File Found!");
}
else{
Log.d(TAG, "There's no file!");
}

InputStream is = ctx.openFileInput("data.xml");

try {

xpp.setInput(is, null);
parseXMLAndStoreIt(xpp);
}finally {
is.close();
}
}

我的结论: 通过观察 logcat 中的行为和一些行切换,我想我注意到代码的安排很重要。如果我把

xpp.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES
, false);
xpp.setInput(is, null);

在保存文件过程之前,WiFi ON 选项将起作用,而 WiFi OFF 选项将不起作用。但是,如果将上述内容放在保存文件过程之后(如此处的示例代码中所示),则WiFi ON 选项将不起作用,而 WiFI OFF 选项将起作用。

这真的很奇怪,我不知道是什么原因造成的。我认为问题是 InputStream 在第一次使用后被删除了?

例如:

如果我使用 InputStream 来保存文件,它将被删除,因此没有任何内容可以放入 xpp.setInput(is,null);
parseXMLAndStoreIt(xpp);

或者相反,如果我使用 InputStream 进行在线解析,它会被清空并且不会保存任何内容?

LOGCAT(当 WiFi 关闭时有效,但打开时无效):RATECE 是我在点击“搜索”时输入的单词

11-26 10:25:10.791  29471-29471/com.example.myweatherapp.myweatherapp D/Input Location:﹕ RATECE
11-26 10:25:10.791 29471-29471/com.example.myweatherapp.myweatherapp D/Input Location:﹕ RATECE
11-26 10:25:10.821 29471-29487/com.example.myweatherapp.myweatherapp D/TAG﹕ The response is: 200

我还使用 IF 语句检查文件是否存在 - 我可以确认应用程序找到了上述文件。

LOGCAT(WiFi 关闭不工作,打开时工作):

11-26 10:43:44.021  30709-30709/com.example.myweatherapp.myweatherapp D/Input Location:﹕ RATECE
11-26 10:43:44.021 30709-30709/com.example.myweatherapp.myweatherapp D/TAG﹕ File Found!
11-26 10:43:44.021 30709-30709/com.example.myweatherapp.myweatherapp D/TAG﹕ File Found!

请帮帮我。

最佳答案

您正在阅读 InputStream is 两次。这是不可能的。通过第一次阅读,您已经“消费”了它。如果解析器第二次尝试读取流,则会收到类似“流已消耗”的错误。你必须调整你的设计。例如,只需始终使用文件进行解析。或者使用 StringBuider 读取 String 中的响应,然后解析该字符串。然后您还可以保存该字符串。

关于java - InputStream 有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27145389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com