java.io.FileNotFoundException:打开失败:EROFS(只读文件系统)

问题描述:

我有这段代码生成一个XML文件并保存到外部目录。java.io.FileNotFoundException:打开失败:EROFS(只读文件系统)

try //database structure 
    { 
     DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
     //test report elements, does not reflect the real database in the future 
     //mandatory/ username, location, caption, media, time(Actually, it's best if the server determines recieve time) 
     //optional/ 
     //reportdata elements 
     Document doc = docBuilder.newDocument(); 
     Element rootElement = doc.createElement("reportdata"); 
     doc.appendChild(rootElement); 

     //username elements 
     Element username = doc.createElement("username"); 
     username.appendChild(doc.createTextNode("testusername")); 
     rootElement.appendChild(username); 

     //Location ELEMENTS 
     //latitude elements 
     Element lat = doc.createElement("latitude"); 
     lat.appendChild(doc.createTextNode(String.valueOf(latitude))); 
     rootElement.appendChild(lat); 
     //longitude 
     Element longi = doc.createElement("longitude"); 
     longi.appendChild(doc.createTextNode(String.valueOf(longitude))); 
     rootElement.appendChild(longi); 

     //caption text elements 

     Element capt = doc.createElement("caption"); 
     capt.appendChild(doc.createTextNode(captionText.getText().toString())); 
     rootElement.appendChild(capt); 

     //tag elements 
     String[] tagArr = new String[selectItems.size()]; 
     tagArr = selectItems.toArray(tagArr); 
     Element tags = doc.createElement("tags"); 
     rootElement.appendChild(tags); 
     int o = selectItems.size(); 
     for(String s: tagArr) { 
      Element tagname = doc.createElement("tagname"); 
      tagname.appendChild(doc.createTextNode(s)); 
      tags.appendChild(tagname); 
     } 

     TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
     Transformer transformer = transformerFactory.newTransformer(); 
     DOMSource source = new DOMSource(doc); 
     //StreamResult result = new StreamResult(System.out); 
     StreamResult result = new StreamResult(new File(android.os.Environment.getRootDirectory(), "upload_data.xml")); 
     transformer.transform(source, result); 
     Log.d("MESSAGE", result.toString()); 

创建XML文件后,此异常升高

D/XML TransformerException﹕ java.io.FileNotFoundException: /system/upload_data.xml: open failed: EROFS (Read-only file system) 

任何方式解决这一问题?

+2

不要试图将数据写入文件系统的只读部分? – 2014-11-24 11:36:57

+0

在清单中设置权限以获得写权限 – Opiatefuchs 2014-11-24 11:37:32

...保存到外部目录

这是不完全正确。您正尝试将其保存在始终为只读的root系统分区中。

Environment.getRootDirectory()的Javadoc:

“系统” 的返回根分区保持Android核心OS。始终呈现并安装为只读。

解决方法:只需将文件保存在其他地方:

StreamResult result = new StreamResult(new File(android.os.Environment.getExternalStorageDirectory(), "upload_data.xml")); 

需要注意的是:

  • 你必须要求写权限的外部存储:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

  • 外部存储并不总是可用的。当你尝试写入分区时,分区可能不会被安装。 (只是要小心)
+0

呵呵,intellisense必须自动完成它到getRootDirectory。无论如何,谢谢你回答,它现在正在工作。我多么愚蠢,没有看到错误的代码。 – 2014-11-24 11:49:50

+0

啊是的。标记。 – 2014-11-24 12:54:55