Android7.0以上File.createTempFile异常:java.io.IOException: Unable to create temporary file

一.File.createTempFile的介绍

java IO中常用类File 有File.createTempFile(String prefix, String suffix, File directory) 方法会在指定的目录中一个新的空文件。
deleteOnExit()方法被调用来删除用此方法创建的文件

public static File createTempFile(String prefix, String suffix,File directory)
                         throws IOException{}

参数介绍:

prefix – 前缀字符串定义的文件名;必须至少有三个字符长

suffix – 后缀字符串定义文件的扩展名;如果为null后缀”.tmp” 将被使用

directory – 该目录中的文件被创建。对于默认的临时文件目录nullis来传递

二,7.0以上的问题和解决

创建文件的代码

File tm=Environment.getExternalStorageDirectory();
        Log.e("TAG", "==========="+tm);
        String extension="txt";
        try {
            File mTmpFile = File.createTempFile("/Download/", "." + extension, tm);
            Log.e("TAG", "mTmpFile=============="+mTmpFile.getAbsolutePath());
            .....
            .....
            .....
            .....

        } catch (IOException e) {
            Log.e("TAG", "=========="+e.toString());
            e.printStackTrace();
        }

在7.0一下的手机上没有问题但是在7.0以上的手机就会出现问题,log如下:

07-10 16:11:24.595 16482-16482/com.phone.test_http W/System.err: java.io.IOException: Unable to create temporary file
07-10 16:11:24.603 16482-16482/com.phone.test_http W/System.err:     at java.io.File.generateTempFile(File.java:1773)
07-10 16:11:24.604 16482-16482/com.phone.test_http W/System.err:     at java.io.File.createTempFile(File.java:1860)

可以看到这是系统抛出的一个异常信息,显示无法创建临时文件,这个必须比较7.0以前和7.0以后createTempFile 方法有什么区别了,同过源码的对比发现,7.0以后对文件进行了校验判断

static File generateFile(String prefix, String suffix, File dir)
            throws IOException
        {
           ....
           ....
           ...
            String name = prefix + Long.toString(n) + suffix;
            File f = new File(dir, name);
            //name.equals(f.getName()) 发现这个判断为false所以抛出异常了
            if (!name.equals(f.getName()) || f.isInvalid()) {
                if (System.getSecurityManager() != null)
                    throw new IOException("Unable to create temporary file");
                else
                    throw new IOException("Unable to create temporary file, " + f);
            }
            return f;
        }

主要原因是 name.equals(f.getName()) 发现这个判断为false所以抛出异常了,然后开始检查自己传入的参数

File mTmpFile = File.createTempFile("/Download/", "." + extension, tm);

发现第一个参数 /Download/ 是有分隔符号的,加上分割符号的目的是用来增加一层目录的,之所以在7.0一下的系统没事,是因为7.0一下没有做相关的校验操作,去掉第一个参数为分割符号就ok了。

File mTmpFile = File.createTempFile("Download", "." + extension, tm);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值