【问题标题】:java.io.FileNotFoundException, open failed: ENOENTjava.io.FileNotFoundException,打开失败:ENOENT
【发布时间】:2016-03-25 04:00:38
【问题描述】:

由于某种原因,我在两次阅读时都收到了fileNotFoundException。值得注意的是,Toast 打印“文件存在!”。我用底部的BufferedReader来测试文件内容是否正确。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_calendar, container, false);

    recipes = new ArrayMap<>();
    filename = "calendar_recipes.txt";

    bText= (EditText) v.findViewById(R.id.bEditText);
    lText= (EditText) v.findViewById(R.id.lEditText);
    dText= (EditText) v.findViewById(R.id.dEditText);

    cal = (CalendarView) v.findViewById(R.id.calendarView);
    date = cal.getDate();


    File file = getActivity().getFileStreamPath(filename);

    if(file.exists())
    {
        Toast.makeText(getActivity(), "File exists!", Toast.LENGTH_SHORT).show();
        try
        {
            FileInputStream fileInputStream = new FileInputStream(getActivity().getFilesDir()+filename);
            ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
            Map recipes = (Map)objectInputStream.readObject();
        }
        catch(ClassNotFoundException | IOException | ClassCastException e) {
            e.printStackTrace();
        }
    }
    else
    {
        Toast.makeText(getActivity(), "File does not exist!!", Toast.LENGTH_SHORT).show();
        file = new File(getActivity().getFilesDir(), filename);
    }

    try {
        BufferedReader in = new BufferedReader(new FileReader(filename));
        String line;
        while ((line = in.readLine()) != null) {
            System.out.println(line);
        }
        in.close();
    }

    catch (IOException e) {
        e.printStackTrace();
    }

Logcat...

03-24 23:54:57.626 14059-14067/com.stringcheese.recipez.recip_ez W/art: Suspending all threads took: 7.202ms
03-24 23:54:58.409 14059-14059/com.stringcheese.recipez.recip_ez W/System.err: java.io.FileNotFoundException: /data/data/com.stringcheese.recipez.recip_ez/filescalendar_recipes.txt: open failed: ENOENT (No such file or directory)
03-24 23:54:58.410 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:456)
03-24 23:54:58.410 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at java.io.FileInputStream.<init>(FileInputStream.java:76)
03-24 23:54:58.410 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at java.io.FileInputStream.<init>(FileInputStream.java:103)
03-24 23:54:58.410 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at com.stringcheese.recipez.recip_ez.CalendarFragment.onCreateView(CalendarFragment.java:80)
03-24 23:54:58.410 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974)
03-24 23:54:58.410 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
03-24 23:54:58.410 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)
03-24 23:54:58.410 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
03-24 23:54:58.410 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617)
03-24 23:54:58.410 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:339)
03-24 23:54:58.410 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:602)
03-24 23:54:58.410 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1259)
03-24 23:54:58.410 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at android.app.Activity.performStart(Activity.java:6026)
03-24 23:54:58.410 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2302)
03-24 23:54:58.410 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413)
03-24 23:54:58.410 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at android.app.ActivityThread.access$800(ActivityThread.java:155)
03-24 23:54:58.410 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317)
03-24 23:54:58.410 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
03-24 23:54:58.410 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at android.os.Looper.loop(Looper.java:135)
03-24 23:54:58.410 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5343)
03-24 23:54:58.410 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
03-24 23:54:58.410 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at java.lang.reflect.Method.invoke(Method.java:372)
03-24 23:54:58.411 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
03-24 23:54:58.411 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:702)
03-24 23:54:58.411 14059-14059/com.stringcheese.recipez.recip_ez W/System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
03-24 23:54:58.411 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at libcore.io.Posix.open(Native Method)
03-24 23:54:58.411 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
03-24 23:54:58.411 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:442)
03-24 23:54:58.411 14059-14059/com.stringcheese.recipez.recip_ez W/System.err:  ... 23 more

【问题讨论】:

  • 请显示完整的例外情况
  • 有什么原因你没有在你调用的同一个 file 对象上调用 FileInputStream 构造函数?
  • 你的清单中有这个吗? &lt;uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /&gt;
  • 检查file.canRead()的值
  • 我看到了/data/data/com.stringcheese.recipez.recip_ez/filescalendar_recipes.txt,我想应该是/data/data/com.stringcheese.recipez.recip_ez/files/calendar_recipes.txt。所以你只需要在文本中添加一个斜线。我建议你编写一个带有静态函数的实用程序类,该函数将字符串作为文件名,并返回对象文件

标签: java android filenotfoundexception


【解决方案1】:

getFilesDir 返回一个文件对象。如果你在它上面调用 onString (你隐式地这样做),它会返回它的路径。如果文件是目录,则路径以斜杠结尾,因此getActivity().getFilesDir()+filename 将导致类似"/data/data/com.yourapp/filescalendar_recipes.txt" 的结果。

您可以使用getActivity().getFilesDir()+File.separator+filename,也可以直接拨打new FileInputStream(file)

【讨论】:

    【解决方案2】:

    我遇到了同样的错误。 This 答案对我有用。

    你只需要像这样在清单中添加一行:

    <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:requestLegacyExternalStorage="true" //Add this Line
    android:label="@string/app_name">
    

    -------

    【讨论】:

    • 在浪费了我一整天之后得到了这个答案。谢谢大佬。
    【解决方案3】:

    您已经使用File file = getActivity().getFileStreamPath(filename); 创建了一个File 实例,这是您正在使用file.exists() 方法检查的实例。然后你正试图用FileInputStream 阅读另一件事。你应该试试FileInputStream fileInputStream = new FileInputStream(file);。这样,您就可以使用已检查的文件创建流。

    【讨论】:

      【解决方案4】:

      较新版本的android有时不支持创建文件夹(对我来说很奇怪,但我经历过),然后:-

      1- 确保该文件夹已创建和或/ 2-将此添加到主要活动 &lt;application android:requestLegacyExternalStorage="true" tools:targetApi="q"&gt;

      【讨论】:

        【解决方案5】:
        public class Printer {
            private String name;
        
            public void setName(String name) {
                this.name = name;
            }
        
            public void print() {
                printString(name);
            }
        
            private void printString(String s) {
                System.out.println(s + " (" + s.length() + ")");
            }
        
            public static void main(String[] args) {
                Printer printer = new Printer();
                printer.print();
            }
        }
        

        【讨论】:

        • 请修复它:(请
        猜你喜欢
        • 2020-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-29
        相关资源
        最近更新 更多