. io .Android上的FileNotFoundException, open failed: ENOENT(无此文件或目录)

时间:2022-01-04 08:35:41

I'm trying to save and write an XML file with some data for my app, but when it tries to open the file it gives an java.io.FileNotFoundException.

我正在为我的应用程序保存并编写一个带有数据的XML文件,但是当它试图打开这个文件时,它会给出一个java.io.FileNotFoundException。

the code i'm using to save the XML file is:

我用来保存XML文件的代码是:

TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount",   "2");
DOMSource source = new DOMSource(doc);

StreamResult result = new StreamResult(new File(getActivity().getFilesDir(),  "rooster.xml"));
System.out.println("test");

The code I'm using to read the file is:

我用来读取文件的代码是:

        File XmlFile = new File(getActivity().getFilesDir(), "file.xml");
        if (!XmlFile.exists()){
            System.out.println("No XML file!");
        }
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(XmlFile);

The logcat it gives is:

它给出的是:

    OpenGL ES Shader Compiler Version: E031.24.00.15
    Build Date: 07/31/14 Thu
    Local Branch:
    Remote Branch: quic/LNX.LA.3.5.2.2_rb1
    Local Patches: NONE
    Reconstruct Branch: AU_LINUX_ANDROID_LNX.LA.3.5.2.2_RB1.04.04.04.087.028 +  NOTHING
04-04 18:30:41.206  13423-13423/com.carmel.roosterapp D/OpenGLRenderer﹕ Enabling debug mode 0
04-04 18:30:41.256  13423-13423/com.carmel.roosterapp I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@41b417c0 time:8749586
04-04 18:31:01.896  13423-13423/com.carmel.roosterapp I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@41b417c0 time:8770221
04-04 18:31:07.666  13423-13423/com.carmel.roosterapp I/Timeline﹕ Timeline: Activity_launch_request id:com.carmel.roosterapp time:8775992
04-04 18:31:07.956  13423-13423/com.carmel.roosterapp I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@41c18a58 time:8776280
04-04 18:31:08.376  13423-13482/com.carmel.roosterapp W/dalvikvm﹕ VFY: unable to find class referenced in signature (Ljavax/naming/Reference;)
04-04 18:31:08.376  13423-13482/com.carmel.roosterapp I/dalvikvm﹕ Could not find method javax.naming.Reference.get, referenced from method com.mysql.jdbc.ConnectionPropertiesImpl$ConnectionProperty.initializeFrom
04-04 18:31:08.376  13423-13482/com.carmel.roosterapp W/dalvikvm﹕ VFY: unable to resolve virtual method 21843: Ljavax/naming/Reference;.get (Ljava/lang/String;)Ljavax/naming/RefAddr;
04-04 18:31:08.376  13423-13482/com.carmel.roosterapp D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0004
04-04 18:31:08.376  13423-13482/com.carmel.roosterapp W/dalvikvm﹕ VFY: unable to find class referenced in signature (Ljavax/naming/Reference;)
04-04 18:31:08.376  13423-13482/com.carmel.roosterapp E/dalvikvm﹕ Could not find class 'javax.naming.StringRefAddr', referenced from method com.mysql.jdbc.ConnectionPropertiesImpl$ConnectionProperty.storeTo
04-04 18:31:08.376  13423-13482/com.carmel.roosterapp W/dalvikvm﹕ VFY: unable to resolve new-instance 2099 (Ljavax/naming/StringRefAddr;) in Lcom/mysql/jdbc/ConnectionPropertiesImpl$ConnectionProperty;
04-04 18:31:08.376  13423-13482/com.carmel.roosterapp D/dalvikvm﹕ VFY: replacing opcode 0x22 at 0x0006
04-04 18:31:08.376  13423-13482/com.carmel.roosterapp D/dalvikvm﹕ DexOpt: unable to opt direct call 0x5555 at 0x14 in Lcom/mysql/jdbc/ConnectionPropertiesImpl$ConnectionProperty;.storeTo
04-04 18:31:08.546  13423-13482/com.carmel.roosterapp I/dalvikvm﹕ Could not find method java.lang.management.ManagementFactory.getThreadMXBean, referenced from method com.mysql.jdbc.MysqlIO.appendDeadlockStatusInformation
04-04 18:31:08.546  13423-13482/com.carmel.roosterapp W/dalvikvm﹕ VFY: unable to resolve static method 21024: Ljava/lang/management/ManagementFactory;.getThreadMXBean ()Ljava/lang/management/ThreadMXBean;
04-04 18:31:08.546  13423-13482/com.carmel.roosterapp D/dalvikvm﹕ VFY: replacing opcode 0x71 at 0x0079
04-04 18:31:08.966  13423-13482/com.carmel.roosterapp I/System.out﹕ Connectie met Database!
04-04 18:31:09.126  13423-13482/com.carmel.roosterapp I/System.out﹕ test
04-04 18:31:11.146  13423-13423/com.carmel.roosterapp I/System.out﹕ No XML file!
04-04 18:31:11.156  13423-13423/com.carmel.roosterapp W/System.err﹕ java.io.FileNotFoundException: /data/data/com.carmel.roosterapp/files/rooster.xml: open failed: ENOENT (No such file or directory)
04-04 18:31:11.156  13423-13423/com.carmel.roosterapp W/System.err﹕ at libcore.io.IoBridge.open(IoBridge.java:409)
04-04 18:31:11.156  13423-13423/com.carmel.roosterapp W/System.err﹕ at java.io.FileInputStream.<init>(FileInputStream.java:78)
04-04 18:31:11.156  13423-13423/com.carmel.roosterapp W/System.err﹕ at libcore.net.url.FileURLConnection.connect(FileURLConnection.java:82)
04-04 18:31:11.156  13423-13423/com.carmel.roosterapp W/System.err﹕ at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:117)
04-04 18:31:11.156  13423-13423/com.carmel.roosterapp W/System.err﹕ at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:183)
04-04 18:31:11.156  13423-13423/com.carmel.roosterapp W/System.err﹕ at com.carmel.roosterapp.RoosterPagina.getRooster(RoosterPagina.java:135)
04-04 18:31:11.156  13423-13423/com.carmel.roosterapp W/System.err﹕ at com.carmel.roosterapp.RoosterPagina$DoInBackground.onPostExecute(RoosterPagina.java:370)
04-04 18:31:11.156  13423-13423/com.carmel.roosterapp W/System.err﹕ at com.carmel.roosterapp.RoosterPagina$DoInBackground.onPostExecute(RoosterPagina.java:155)
04-04 18:31:11.156  13423-13423/com.carmel.roosterapp W/System.err﹕ at android.os.AsyncTask.finish(AsyncTask.java:632)
04-04 18:31:11.166  13423-13423/com.carmel.roosterapp W/System.err﹕ at android.os.AsyncTask.access$600(AsyncTask.java:177)
04-04 18:31:11.166  13423-13423/com.carmel.roosterapp W/System.err﹕ at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
04-04 18:31:11.166  13423-13423/com.carmel.roosterapp W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:102)
04-04 18:31:11.166  13423-13423/com.carmel.roosterapp W/System.err﹕ at android.os.Looper.loop(Looper.java:136)
04-04 18:31:11.166  13423-13423/com.carmel.roosterapp W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5146)
04-04 18:31:11.166  13423-13423/com.carmel.roosterapp W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
04-04 18:31:11.166  13423-13423/com.carmel.roosterapp W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:515)
04-04 18:31:11.166  13423-13423/com.carmel.roosterapp W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)
04-04 18:31:11.166  13423-13423/com.carmel.roosterapp W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
04-04 18:31:11.176  13423-13423/com.carmel.roosterapp W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
04-04 18:31:11.176  13423-13423/com.carmel.roosterapp W/System.err﹕ Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
04-04 18:31:11.186  13423-13423/com.carmel.roosterapp W/System.err﹕ at libcore.io.Posix.open(Native Method)
04-04 18:31:11.186  13423-13423/com.carmel.roosterapp W/System.err﹕ at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
04-04 18:31:11.186  13423-13423/com.carmel.roosterapp W/System.err﹕ at libcore.io.IoBridge.open(IoBridge.java:393)
04-04 18:31:11.186  13423-13423/com.carmel.roosterapp W/System.err﹕ ... 18 more
04-04 18:31:11.186  13423-13423/com.carmel.roosterapp I/Choreographer﹕ Skipped 129 frames!  The application may be doing too much work on its main thread.

Does someone know how to solve this problem? Thanks in advance

有人知道如何解决这个问题吗?谢谢提前

EDIT: the whole write code is: (sorry, some names and comments are in Dutch)

编辑:整个编写代码是:(抱歉,有些名字和评论是荷兰语)

public class DoInBackground extends AsyncTask<Void, Void, Void> implements DialogInterface.OnCancelListener {

    private ProgressDialog dialog;

    private static final String TAG = "LOL123";

    private boolean isNetworkAvailable(Context context) {
        ConnectivityManager connectivityManager
                = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null;
    }

    public boolean hasInternetAccess(Context context) {
        if (isNetworkAvailable(context)) {
            try {
                HttpURLConnection urlc = (HttpURLConnection)
                        (new URL("http://clients3.google.com/generate_204")
                                .openConnection());
                urlc.setRequestProperty("User-Agent", "Android");
                urlc.setRequestProperty("Connection", "close");
                urlc.setConnectTimeout(1500);
                urlc.connect();
                return (urlc.getResponseCode() == 204 &&
                        urlc.getContentLength() == 0);
            } catch (IOException e) {
                Log.e(TAG, "Error checking internet connection", e);
            }
        } else {
            Log.d(TAG, "No network available!");
        }
        return false;
    }

    protected void onPreExecute() {
        super.onPreExecute();
        dialog = new ProgressDialog(getActivity());
        dialog.setMessage("Laden...");
        dialog.setTitle("Rooster Updaten");
        dialog.setIndeterminate(false);
        dialog.setCancelable(true);
        dialog.show();

    }

    @Override
    protected Void doInBackground(Void... unused) {
        if (hasInternetAccess(getActivity())) {
            //haal llnr/docentcode op
            SharedPreferences settings = getActivity().getSharedPreferences(PREFS_NAME, 0);
            String code = settings.getString("Code", null);

            String[] dagen;
            dagen = new String[5];
            dagen[0] = "maandag";
            dagen[1] = "dinsdag";
            dagen[2] = "woensdag";
            dagen[3] = "donderdag";
            dagen[4] = "vrijdag";
            int aantDagen = dagen.length;

            // bepaal de dag van de week
            //Calendar c = Calendar.getInstance();
            //int dayOfWeek = c.get(Calendar.DAY_OF_WEEK)-2;

            String url = "jdbc:mysql://carmelrooster.nl:3306/";
            String dbName = "systeemnieuw";
            String tblName = "leerlingrooster";
            String driver = "com.mysql.jdbc.Driver";
            String userName = "app";
            String password = "password";
            String Llnr = code;
            try {
                Class.forName(driver).newInstance();
                Connection conn = DriverManager.getConnection(url + dbName, userName, password);

                System.out.println("Connectie met Database!");

                //maak een nieuw DOM Document
                DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder documentBuilder = docFactory.newDocumentBuilder();

                //root elements
                Document doc = documentBuilder.newDocument();
                Element rootElement = doc.createElement("rooster");
                doc.appendChild(rootElement);

                Statement stmt = conn.createStatement();
                for (int i = 0; i < aantDagen; i++ ) {

                    ResultSet res = stmt.executeQuery("SELECT u1,u2,u3,u4,u5,u6,u7,u8 FROM " + tblName +" WHERE dag = '" + dagen[i] + "' and llnr = '" + Llnr + "'");
                    while (res.next()) {
                        String eerste = res.getString("u1");
                        eerste = eerste.replace("<br />", " ");
                        eerste = eerste.replace("<c>", " ");
                        eerste = eerste.replace("</c>", " ");
                        String tweede = res.getString("u2");
                        tweede = tweede.replace("<br />", " ");
                        tweede = tweede.replace("<c>", " ");
                        tweede = tweede.replace("</c>", " ");
                        String derde = res.getString("u3");
                        derde = derde.replace("<br />", " ");
                        derde = derde.replace("<c>", " ");
                        derde = derde.replace("</c>", " ");
                        String vierde = res.getString("u4");
                        vierde = vierde.replace("<br />", " ");
                        vierde = vierde.replace("<c>", " ");
                        vierde = vierde.replace("</c>", " ");
                        String vijfde = res.getString("u5");
                        vijfde = vijfde.replace("<br />", " ");
                        vijfde = vijfde.replace("<c>", " ");
                        vijfde = vijfde.replace("</c>", " ");
                        String zesde = res.getString("u6");
                        zesde = zesde.replace("<br />", " ");
                        zesde = zesde.replace("<c>", " ");
                        zesde = zesde.replace("</c>", " ");
                        String zevende = res.getString("u7");
                        zevende = zevende.replace("<br />", " ");
                        zevende = zevende.replace("<c>", " ");
                        zevende = zevende.replace("</c>", " ");
                        String achtste = res.getString("u8");
                        achtste = achtste.replace("<br />", " ");
                        achtste = achtste.replace("<c>", " ");
                        achtste = achtste.replace("</c>", " ");

                        Element dag = doc.createElement(dagen[i]);
                        rootElement.appendChild(dag);

                        //set attribute to dag element
                        dag.setAttribute("id", String.valueOf(i));

                        //1e uur elements
                        Element uur1 = doc.createElement("eerste");
                        uur1.appendChild(doc.createTextNode(eerste));
                        dag.appendChild(uur1);

                        //2e uur elements
                        Element uur2 = doc.createElement("tweede");
                        uur2.appendChild(doc.createTextNode(tweede));
                        dag.appendChild(uur2);

                        //3e uur elements
                        Element uur3 = doc.createElement("derde");
                        uur3.appendChild(doc.createTextNode(derde));
                        dag.appendChild(uur3);

                        //4e uur elements
                        Element uur4 = doc.createElement("vierde");
                        uur4.appendChild(doc.createTextNode(vierde));
                        dag.appendChild(uur4);

                        //5e uur elements
                        Element uur5 = doc.createElement("vijfde");
                        uur5.appendChild(doc.createTextNode(vijfde));
                        dag.appendChild(uur5);

                        //6e uur elements
                        Element uur6 = doc.createElement("zesde");
                        uur6.appendChild(doc.createTextNode(zesde));
                        dag.appendChild(uur6);

                        //7e uur elements
                        Element uur7 = doc.createElement("zevende");
                        uur7.appendChild(doc.createTextNode(zevende));
                        dag.appendChild(uur7);

                        //8e uur elements
                        Element uur8 = doc.createElement("achste");
                        uur8.appendChild(doc.createTextNode(achtste));
                        dag.appendChild(uur8);
                    }
                }
                conn.close();
                //write contents into xml file
                TransformerFactory transformerFactory = TransformerFactory.newInstance();
                Transformer transformer = transformerFactory.newTransformer();
                transformer.setOutputProperty(OutputKeys.INDENT, "yes");
                transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
                DOMSource source = new DOMSource(doc);

                StreamResult result = new StreamResult(new File(getActivity().getFilesDir(), "file.xml"));
                System.out.println("test");
                //Output to console for testing
                //StreamResult result = new StreamResult(System.out);

            } catch (ParserConfigurationException pce) {
                pce.printStackTrace();
            } catch (TransformerException tfe) {
                tfe.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (java.lang.InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

The whole read code is:

整个读取代码是:

public String[] getRooster() throws Exception {
String[] dagen;
dagen = new String[5];
dagen[0] = "maandag";
dagen[1] = "dinsdag";
dagen[2] = "woensdag";
dagen[3] = "donderdag";
dagen[4] = "vrijdag";
int aantDagen = dagen.length;

// bepaal de dag van de week
Calendar c = Calendar.getInstance();
int dayOfWeek = c.get(Calendar.DAY_OF_WEEK)-2;
File XmlFile = new File(getActivity().getFilesDir(), "file.xml");
if (!XmlFile.exists()){
    System.out.println("No XML file!");
}
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(XmlFile);

doc.getDocumentElement().normalize();

NodeList nList = doc.getElementsByTagName(dagen[dayOfWeek]);
Node nNode = nList.item(0);

String dag = nNode.getNodeName().substring(0,1).toUpperCase() + nNode.getNodeName().substring(1);
Element eElement = (Element) nNode;

String eerste = ("1e : " + eElement.getElementsByTagName("eerste").item(0).getTextContent());
String tweede = ("2e : " + eElement.getElementsByTagName("tweede").item(0).getTextContent());
String derde = ("3e : " + eElement.getElementsByTagName("derde").item(0).getTextContent());
String vierde = ("4e : " + eElement.getElementsByTagName("vierde").item(0).getTextContent());
String vijfde = ("5e : " + eElement.getElementsByTagName("vijfde").item(0).getTextContent());
String zesde = ("6e : " + eElement.getElementsByTagName("zesde").item(0).getTextContent());
String zevende = ("7e : " + eElement.getElementsByTagName("zevende").item(0).getTextContent());
String achtste = ("8e : " + eElement.getElementsByTagName("achste").item(0).getTextContent());
return new String[] {dag, eerste, tweede, derde, vierde, vijfde, zesde, zevende, achtste};

2 个解决方案

#1


1  

If you use an emulator, probably you didn't set memory for the emulator device. Go to AVD Manager, choose your device, click "Edit", fill in "Internal Storage".

如果使用仿真器,可能没有为仿真器设备设置内存。进入AVD Manager,选择您的设备,点击“编辑”,填写“内部存储”。

Also you have to add

你还要加上

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

#2


1  

Thanks to greenapps I found my solution. As he said my streamresult wasn't doing anything.

多亏了绿色应用,我找到了我的解决方案。就像他说的,我的streamresult什么都没做。

I fixed it by replacing

我把它换了。

File XmlFile = new File(getActivity().getFilesDir(), "file.xml");

with

FileInputStream XmlFile = getActivity().openFileInput("file.xml");

and replacing

和替换

StreamResult result = new StreamResult(new File(getActivity().getFilesDir(),  "rooster.xml"));

with

StreamResult result = new StreamResult(getActivity().openFileOutput("rooster.xml", getActivity().MODE_PRIVATE));

#1


1  

If you use an emulator, probably you didn't set memory for the emulator device. Go to AVD Manager, choose your device, click "Edit", fill in "Internal Storage".

如果使用仿真器,可能没有为仿真器设备设置内存。进入AVD Manager,选择您的设备,点击“编辑”,填写“内部存储”。

Also you have to add

你还要加上

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

#2


1  

Thanks to greenapps I found my solution. As he said my streamresult wasn't doing anything.

多亏了绿色应用,我找到了我的解决方案。就像他说的,我的streamresult什么都没做。

I fixed it by replacing

我把它换了。

File XmlFile = new File(getActivity().getFilesDir(), "file.xml");

with

FileInputStream XmlFile = getActivity().openFileInput("file.xml");

and replacing

和替换

StreamResult result = new StreamResult(new File(getActivity().getFilesDir(),  "rooster.xml"));

with

StreamResult result = new StreamResult(getActivity().openFileOutput("rooster.xml", getActivity().MODE_PRIVATE));