FileNotFoundException:/ storage / emulated / 0 / JsonParseTutorialCache:open failed:ENOENT(没有这样的文件或目录)

时间:2016-10-26 10:56:44

标签: java android gridview

我正在使用GridView加载保存图像的json数据。当我构建项目时,它发生了一些例外

的AndroidManifest.xml:

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

FileCache类:

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

我想在GridView上下载,阅读和显示图像,如何修复这些异常?

4 个答案:

答案 0 :(得分:4)

就我而言,是:

如果定位到Android 10(API级别29)或更高版本,请在应用程序的requestLegacyExternalStorage文件中将true的值设置为AndroidManifest

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

答案 1 :(得分:1)

您可以使用Picasso库在网格视图中显示图像。 它为加载图像提供一行代码。 使用库函数加载图像 -

Picasso.with(上下文).load( “<强> YOURIMAGE ”)代入(ImageView的);

您还可以根据需要调整图像大小。 它还管理内部缓存机制

参考链接了解更多信息 - http://square.github.io/picasso/

答案 2 :(得分:1)

FileCache.java中的代码是

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

已创建新文件对象,但该文件可能不存在。所以,用

替换上面的代码
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;
}

希望,这有帮助。

编辑:当您在&gt; = Android 6.0上运行代码时,您必须在运行时请求访问外部存储的权限。在AndroidManifest.xml中添加它们是不够的。您可以使用this link了解如何操作。

答案 3 :(得分:0)

您也可以自己保存f.createNewFile并使用File.createTempFile(imageFileName, ".jpg", storageDir)

所以你的方法现在变成了

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

    return File.createTempFile(filename, ".jpg", cacheDir);
}