2014-11-24 3 views
0

У меня есть этот код, который генерирует XML-файл и сохраняет его во внешнем каталоге.java.io.FileNotFoundException: open failed: 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

Не пытайтесь записать данные в часть только для чтения файловой системы? –

+0

установить разрешения в манифесте, чтобы получить право на запись – Opiatefuchs

ответ

2

... сохраняет во внешний каталог

Это не совсем верно. Вы пытаетесь сохранить его в системном разделе root, который всегда доступен только для чтения.

От Javadoc из Environment.getRootDirectory():

Обратный корень "системы" Раздел, содержащий ядро ​​ОС Android. Всегда присутствовать и монтироваться только для чтения.

Решение: просто сохранить файл в другом месте:

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

Обратите внимание, что:

  • вы должны спросить разрешение на запись на внешний накопитель:

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

  • Внешнее хранилище не всегда доступно. При попытке записи на нем раздел может не монтироваться -yet. (просто будьте осторожны)
+0

О, shucks, intellisense, должно быть, автоматически завершил его в getRootDirectory. В любом случае, спасибо за ответ, сейчас он работает. Как глупо, что я не вижу этого неправильного кода. –

+0

Ах да. Отмеченный. –