Этот код отлично работает на Java, но когда я запускаю его на платформе Android, он выдает TransformerException
и FileNotFoundException
. Почему это бросает такие исключения? Это напугало меня весь день. Код выглядит следующим образом:
public void createXMLInstance() {
try {
docBuilder = dbfac.newDocumentBuilder();
document = docBuilder.newDocument();
createSampleSMS();
createDocumentTree();
printToFile();
System.out.println("Sample SmsML file generated");
} catch (ParserConfigurationException pce) {
pce.printStackTrace();
}
}
private void createDocumentTree() {
Element rootEle = document.createElement("Messages");
document.appendChild(rootEle);
Iterator<SMS> it = smsList.iterator();
while (it.hasNext()) {
SMS msg = (SMS) it.next();
Element msgEle = createMessageElement(msg);
rootEle.appendChild(msgEle);
}
}
private void printToFile() {
try {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new File("SmsML.xml"));
transformer.transform(source, result);
} catch (TransformerException te) {
te.printStackTrace();
}
}
private Element createMessageElement(SMS msg) {
Element contactEle = document.createElement("Contact");
contactEle.setAttribute("Number", msg.contactNumber);
contactEle.setAttribute("Name", msg.sendersName);
Element msgBodyEle = document.createElement("Message");
msgBodyEle.setAttribute("Date", msg.getFormattedDate(msg.fullDate));
msgBodyEle.setAttribute("Time", msg.getFormattedTime(msg.fullDate));
Text messagDescrip = document.createTextNode(msg.messageBody);
msgBodyEle.appendChild(messagDescrip);
contactEle.appendChild(msgBodyEle);
return contactEle;
}
public void createSampleSMS() {
smsList.add(new SMS("079399877339", "Tomas", "this is a sample message"));
smsList.add(new SMS("079398546339", "", "hey how are you Sushan"));
smsList.add(new SMS("079395486339", "Lusan", "i'm glad that you came to see me"));
smsList.add(new SMS("079898899556", "Lusan", "i'm not well today"));
smsList.add(new SMS("078158656522", "Jhu", "he told me he was feeling blue"));
smsList.add(new SMS("079398546339", "Lusan", "oh that's so sad"));
}
РЕДАКТИРОВАТЬ: Получил эту форму printStackTrace ():
01-30 23:08:35.466: I/global(8995): Default buffer size used in BufferedInputStream constructor. It would be better to be explicit if an 8k buffer is required.
01-30 23:08:52.856: W/System.err(8995): javax.xml.transform.TransformerException: java.io.FileNotFoundException: /SmsML.xml (Read-only file system)
01-30 23:08:52.916: W/System.err(8995): at org.apache.xalan.transformer.TransformerIdentityImpl.createResultContentHandler(TransformerIdentityImpl.java:297)
01-30 23:08:52.956: W/System.err(8995): at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:330)
01-30 23:08:52.986: W/System.err(8995): at my.android.pack.SmsMLActivity.printToFile(SmsMLActivity.java:79)
01-30 23:08:53.026: W/System.err(8995): at my.android.pack.SmsMLActivity.create(SmsMLActivity.java:58)
01-30 23:08:53.056: W/System.err(8995): at my.android.pack.SmsMLActivity.onCreate(SmsMLActivity.java:48)
01-30 23:08:53.086: W/System.err(8995): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-30 23:08:53.117: W/System.err(8995): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
01-30 23:08:53.146: W/System.err(8995): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
01-30 23:08:53.176: W/System.err(8995): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
01-30 23:08:53.206: W/System.err(8995): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
01-30 23:08:53.237: W/System.err(8995): at android.os.Handler.dispatchMessage(Handler.java:99)
01-30 23:08:53.266: W/System.err(8995): at android.os.Looper.loop(Looper.java:123)
01-30 23:08:53.296: W/System.err(8995): at android.app.ActivityThread.main(ActivityThread.java:4627)
01-30 23:08:53.336: W/System.err(8995): at java.lang.reflect.Method.invokeNative(Native Method)
01-30 23:08:53.376: W/System.err(8995): at java.lang.reflect.Method.invoke(Method.java:521)
01-30 23:08:53.407: W/System.err(8995): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
01-30 23:08:53.446: W/System.err(8995): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-30 23:08:53.476: W/System.err(8995): at dalvik.system.NativeStart.main(Native Method)
01-30 23:08:53.506: W/System.err(8995): Caused by: java.io.FileNotFoundException: /SmsML.xml (Read-only file system)
01-30 23:08:53.566: W/System.err(8995): at org.apache.harmony.luni.platform.OSFileSystem.openImpl(Native Method)
01-30 23:08:53.596: W/System.err(8995): at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:152)
01-30 23:08:53.627: W/System.err(8995): at java.io.FileOutputStream.<init>(FileOutputStream.java:97)
01-30 23:08:53.656: W/System.err(8995): at java.io.FileOutputStream.<init>(FileOutputStream.java:168)
01-30 23:08:53.686: W/System.err(8995): at java.io.FileOutputStream.<init>(FileOutputStream.java:147)
01-30 23:08:53.726: W/System.err(8995): at org.apache.xalan.transformer.TransformerIdentityImpl.createResultContentHandler(TransformerIdentityImpl.java:287)
01-30 23:08:53.756: W/System.err(8995): ... 17 more