FileNotFoundException: /storage/emulated/0/JsonParseTutorialCache: open failed: ENOENT (No such file or directory)

21,825

Solution 1

The code in FileCache.java is

public File getFile(String url) {
    String filename = String.valueOf(url.hashCode());
    // String filename = URLEncoder.encode(url);
    File f = new File(cacheDir, filename);
    return f;
}

A new file object has been created, but the file may not exist. So, replace the above code with

public File getFile(String url) {
    String filename = String.valueOf(url.hashCode());
    // String filename = URLEncoder.encode(url);
    File f = new File(cacheDir, filename);
    f.createNewFile();
    return f;
}

Hope, it helps.

Edit : As you're running your code on >= Android 6.0, you gotta request for permission to access External Storage at runtime. Adding those in AndroidManifest.xml isn't enough. You can use this link on how to do it.

Solution 2

In my case, it was:

If targeting Android 10 (API level 29) or higher, set the value of requestLegacyExternalStorage to true in your app's AndroidManifest file.

<manifest ... >
<application android:requestLegacyExternalStorage="true" ... >

Solution 3

You can use Picasso library for showing images in grid view. it is provide one line code for load image. Use Library function for load images--

Picasso.with(context).load("YOURIMAGE").into(imageView);

You can also resize images according to your requirement. and it is also manage internally cache mechanism

Refer Link for more info - http://square.github.io/picasso/

Solution 4

You can also save yourself the f.createNewFile and use File.createTempFile(imageFileName, ".jpg", storageDir)

So your method now becomes

public File getFile(String url) {
    String filename = String.valueOf(url.hashCode());
    // String filename = URLEncoder.encode(url);

    return File.createTempFile(filename, ".jpg", cacheDir);
}
Share:
21,825
luongkhanh
Author by

luongkhanh

Updated on April 17, 2021

Comments

  • luongkhanh
    luongkhanh about 3 years

    I'm using GridView to load json data holding images. When I built project it happened some exceptions

    AndroidManifest.xml:

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

    FileCache class:

    public class FileCache {
    
    private File cacheDir;
    
    public FileCache(Context context) {
        // Find the dir to save cached images
        if (android.os.Environment.getExternalStorageState().equals(
                android.os.Environment.MEDIA_MOUNTED))
            cacheDir = new File(
                    android.os.Environment.getExternalStorageDirectory(),
                    "JsonParseTutorialCache");
        else
            cacheDir = context.getCacheDir();
        if (!cacheDir.exists())
            cacheDir.mkdirs();
    }
    
    public File getFile(String url) throws IOException {
        String filename = String.valueOf(url.hashCode());
        // String filename = URLEncoder.encode(url);
        File f = new File(cacheDir, filename);
        f.createNewFile();
        return f;
    }
    
    public void clear() {
        File[] files = cacheDir.listFiles();
        if (files == null)
            return;
        for (File f : files)
            f.delete();
     }
    

    }

    Logcat:

    W/System.err: java.io.IOException: open failed: ENOENT (No such file or directory)
    W/System.err:     at java.io.File.createNewFile(File.java:939)
    W/System.err:     at    com.totoroads.android.app.FileCache.getFile(FileCache.java:33) 
    W/System.err:     at com.totoroads.android.app.ImageLoader.getBitmap(ImageLoader.java:64)
    W/System.err:     at com.totoroads.android.app.ImageLoader.access$000(ImageLoader.java:29)
    W/System.err:     at com.totoroads.android.app.ImageLoader$PhotosLoader.run(ImageLoader.java:155)
    W/System.err:     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
    W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
    W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
    W/System.err:     at java.lang.Thread.run(Thread.java:818)
    W/System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
    W/System.err:     at libcore.io.Posix.open(Native Method)
    W/System.err:     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
    W/System.err:     at java.io.File.createNewFile(File.java:932)
    W/System.err:   ... 9 more
    

    I want to download, read and display images on GridView, How to fix those exceptions?