【发布时间】:2012-03-30 15:36:40
【问题描述】:
我想从互联网上的服务器解析一个 XML 文件并在本地保存一段时间,这样如果连接丢失我仍然可以在应用程序上看到信息。
我能够成功解析来自 Internet 的 XML 文件。我还可以将它保存在缓存目录getCacheDir()、文件目录getFilesDir() 和外部存储中。
现在,我想解析本地 XML 文件,并且仍然想使用与从 Internet 解析 XML 相同的函数。但是,经过几次尝试和数小时的搜索,我无法从缓存目录或文件目录中存储的文件中解析inputstream。该函数作用的唯一目录是外部目录。
所以这段代码有效:
inputstream is;
File file = new File ("/mnt/sdcard/Fmobile/Cache","Newfile.xml");
is = new BufferedInputStream(new FileInputStream(file));
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = factory.newDocumentBuilder();
Document dom = db.parse(is);
虽然以下代码不工作。
inputstream is;
File file = new File (getFilesDir(),"Newfile.xml");
is = new BufferedInputStream(new FileInputStream(file));
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = factory.newDocumentBuilder();
Document dom = db.parse(is); **// Error is given on this line : "Is a directory"**
谁能告诉我上面两个代码有什么区别,或者应该怎么做才能从缓存目录或文件目录中获取输入流。
只是为了让您知道我已尝试将 getFilesDir() 替换为文件的路径。
我搜索过的大多数解决方案都是关于将文件存储在资产或 res 文件夹中,但我不能这样做,因为它是一个会不断变化的动态文件,这就是我需要使用缓存和超时的原因。
对于我在发布此内容时可能犯的任何错误,我深表歉意。这是我的第一篇文章。
原木猫如下:
04-04 11:27:24.579: I/com.example.app1.FMobileActivity(16029): Running Form [2] Local File
04-04 11:27:24.579: I/com.example.app1.FMobileActivity(16029): ProcessForm Data2
04-04 11:27:24.579: I/com.example.app1.FMobileActivity(16029): /data/data/com.example.app1/cache/Newfile2.xml
04-04 11:27:24.589: E/com.example.app1.FMobileActivity(16029): Error occurred in ProcessForm:Is a directory
04-04 11:27:24.589: W/System.err(16029): java.io.IOException: Is a directory
04-04 11:27:24.599: W/System.err(16029): at org.apache.harmony.luni.platform.OSFileSystem.read(Native Method)
04-04 11:27:24.599: W/System.err(16029): at dalvik.system.BlockGuard$WrappedFileSystem.read(BlockGuard.java:165)
04-04 11:27:24.599: W/System.err(16029): at java.io.FileInputStream.read(FileInputStream.java:290)
04-04 11:27:24.599: W/System.err(16029): at java.io.FileInputStream.read(FileInputStream.java:245)
04-04 11:27:24.609: W/System.err(16029): at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:140)
04-04 11:27:24.609: W/System.err(16029): at java.io.BufferedInputStream.read(BufferedInputStream.java:225)
04-04 11:27:24.609: W/System.err(16029): at org.kxml2.io.KXmlParser.setInput(KXmlParser.java:1044)
04-04 11:27:24.609: W/System.err(16029): at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:114)
04-04 11:27:24.609: W/System.err(16029): at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:107)
04-04 11:27:24.609: W/System.err(16029): at com.example.app1.FMobileActivity.GetFormData(FMobileActivity.java:315)
04-04 11:27:24.609: W/System.err(16029): at com.example.app1.FMobileActivity.onCreate(FMobileActivity.java:58)
04-04 11:27:24.609: W/System.err(16029): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-04 11:27:24.609: W/System.err(16029): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1666)
04-04 11:27:24.609: W/System.err(16029): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1727)
04-04 11:27:24.609: W/System.err(16029): at android.app.ActivityThread.access$1500(ActivityThread.java:124)
04-04 11:27:24.609: W/System.err(16029): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:974)
04-04 11:27:24.609: W/System.err(16029): at android.os.Handler.dispatchMessage(Handler.java:99)
04-04 11:27:24.609: W/System.err(16029): at android.os.Looper.loop(Looper.java:130)
04-04 11:27:24.609: W/System.err(16029): at android.app.ActivityThread.main(ActivityThread.java:3859)
04-04 11:27:24.609: W/System.err(16029): at java.lang.reflect.Method.invokeNative(Native Method)
04-04 11:27:24.609: W/System.err(16029): at java.lang.reflect.Method.invoke(Method.java:507)
04-04 11:27:24.609: W/System.err(16029): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
04-04 11:27:24.609: W/System.err(16029): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:647)
04-04 11:27:24.609: W/System.err(16029): at dalvik.system.NativeStart.main(Native Method)
04-04 11:27:24.609: E/com.example.app1.FMobileActivity(16029): Couldn't parse the Form.
04-04 11:27:24.689: D/dalvikvm(16029): GC_EXTERNAL_ALLOC freed 118K, 48% free 2837K/5379K, external 2743K/2773K, paused 33ms
【问题讨论】:
-
您是否确定错误出现在该行而不是
FileInputStream构造函数上?请发布完整的堆栈跟踪。
标签: java android xml parsing inputstream