Android文件拷贝

最近项目中协助做了个小的测试程序,需要拷贝文件。代码如下:

    // fixed for raw data test.
    private static final String RAW_DATA_TEST = "***123***";
    private static final String EXTERNAL_STORAGE = "/mnt/sdcard2";
    private static final String INTERNAL_STORAGE = "/mnt/sdcard";
    private static final String RAW_DATA_CFG_FILE_NAME = "config.xml";
    // fixed for raw data test.
    static public boolean handleRawDataTest(Context context, String input) {
        if (RAW_DATA_TEST.equals(input)) {
            Log.d(TAG, "handleRawDataTest");

            if (!copyRawDataCfgFile()) {
                Log.d(TAG, "handleRawDataTest, get Raw Data Cfg file failed!");
                Toast.makeText(context,
                    context.getString(R.string.raw_data_cfg_file_not_exist),
                    Toast.LENGTH_SHORT).show();
                return false;
            }

            Intent intent = new Intent();
            intent.setComponent(new ComponentName("com.goodix.rawdata",
                                        "com.goodix.rawdata.RawDataTest"));
            context.startActivity(intent);
            return true;
        }

        return false;
    }

    public static boolean copyRawDataCfgFile() {
        String state = Environment.getExternalStorageState();
        if (!Environment.MEDIA_MOUNTED.equals(state)) {
            return false;
        }

        String srcFileName = EXTERNAL_STORAGE + File.separator + RAW_DATA_CFG_FILE_NAME;
        String destFileName = INTERNAL_STORAGE + File.separator + RAW_DATA_CFG_FILE_NAME;
        Log.d(TAG, "copyRawDataCfgFile, srcFileName = " + srcFileName + ", destFileName = " + destFileName);
        try {
            if (copyFile(srcFileName, destFileName, true)) {
                Log.d(TAG, "copyRawDataCfgFile, successfull!");
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        Log.d(TAG, "copyRawDataCfgFile, fail!");
        return false;
    }

    public static boolean copyFile(String srcFileName, String destFileName, boolean reWrite)
        throws IOException {
        Log.d(TAG, "copyFile, begin");
        File srcFile = new File(srcFileName);
        File destFile = new File(destFileName);
        if(!srcFile.exists()) {
            Log.d(TAG, "copyFile, source file not exist.");
            return false;
        }
        if(!srcFile.isFile()) {
            Log.d(TAG, "copyFile, source file not a file.");
            return false;
        }
        if(!srcFile.canRead()) {
            Log.d(TAG, "copyFile, source file can't read.");
            return false;
        }
        if(destFile.exists() && reWrite){
            Log.d(TAG, "copyFile, before copy File, delete first.");
            destFile.delete();
        }

        try {
            InputStream inStream = new FileInputStream(srcFile);
            FileOutputStream outStream = new FileOutputStream(destFile);
            byte[] buf = new byte[1024];
            int byteRead = 0;
            while ((byteRead = inStream.read(buf)) != -1) {
                outStream.write(buf, 0, byteRead);
            }
            outStream.flush();
            outStream.close();
            inStream.close();
        } catch (IOException e) {
            throw e;
        } catch (Exception e) {
            e.printStackTrace();
        }

        Log.d(TAG, "copyFile, success");
        return true;
    }      

代码比较简单,但是中间报了个很奇怪的异常,纠结了很长时间,幸好在临下班前找到问题根结所在。记下这次事件,以此勉之。

异常如下:

01-01 00:14:31.070: E/StrictMode(3297): A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
01-01 00:14:31.070: E/StrictMode(3297): java.lang.Throwable: Explicit termination method 'close' not called
01-01 00:14:31.070: E/StrictMode(3297): 	at dalvik.system.CloseGuard.open(CloseGuard.java:184)
01-01 00:14:31.070: E/StrictMode(3297): 	at java.io.FileInputStream.<init>(FileInputStream.java:80)
01-01 00:14:31.070: E/StrictMode(3297): 	at com.android.dialer.SpecialCharSequenceMgr.copyFile(SpecialCharSequenceMgrProxy.java:768)
01-01 00:14:31.070: E/StrictMode(3297): 	at com.android.dialer.SpecialCharSequenceMgr.copyRawDataCfgFile(SpecialCharSequenceMgrProxy.java:702)
01-01 00:14:31.070: E/StrictMode(3297): 	at com.android.dialer.SpecialCharSequenceMgr.handleRawDataTest(SpecialCharSequenceMgrProxy.java:674)
01-01 00:14:31.070: E/StrictMode(3297): 	at com.android.dialer.SpecialCharSequenceMgr.handleCharsForTest(SpecialCharSequenceMgrProxy.java:618)
01-01 00:14:31.070: E/StrictMode(3297): 	at com.android.dialer.SpecialCharSequenceMgr.handleChars(SpecialCharSequenceMgrProxy.java:88)
01-01 00:14:31.070: E/StrictMode(3297): 	at com.android.dialer.dialpad.DialpadFragment.afterTextChanged(DialpadFragment.java:451)
01-01 00:14:31.070: E/StrictMode(3297): 	at android.widget.TextView.sendAfterTextChanged(TextView.java:7626)
01-01 00:14:31.070: E/StrictMode(3297): 	at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:9424)

在网上也搜过“java.io.Closeable for information on avoiding resource leaks”和“java.lang.Throwable: Explicit termination method ‘close‘ not called”,都没找到和我这个问题类似的情况,一般都是cursor导致的内存泄漏的问题。最终,在反复查看代码才发现,原来问题的根结在我拷贝文件的目标目录未指定正确。出现问题的时候,我指定了INTERNAL_STORAGE为“/mnt/sdcard0”,在调用到new
FileOutputStream(destFile)时会抛出异常,原因是并没有这个目录。手机内部存储根目录是“/mnt/sdcard”,这个路径实际指向了“/storage/sdcard0”。

时间: 2024-09-20 14:58:55

Android文件拷贝的相关文章

【Android】把外部文件拷贝的AVD安卓模拟器上的sdcard上,并且在AVD中浏览sdcard的文件

首先,实现这一切的大前提是,你的AVD安卓模拟器,在启动之前,有设置好sdcard的大小,如下图.同时,你的AVD安卓模拟器,要处于启动状态.否则无法执行如下的操作. 这里以<[Android]利用adt-bundle在Windows下轻松搭建Android开发环境与Hello world>(点击打开链接)在Windows中安装出来的安卓开发环境为例. 一.把外部文件拷贝的AVD安卓模拟器上的sdcard上 1.在AVD成功开机之后,你先要通过Window->Open Persperct

Android——模拟文件拷贝

模拟文件拷贝:要求:要用progressDialog和子线程来模拟显示拷贝进度:进度完成后在主界面提示拷贝完成,分别使用普通方式和消息机制编写. layout文件: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools=&qu

android文件存储位置切换

最近有个需求,助手的google卫星地图和OpenCycleMap下载的离线地图数据,要能够在内置存储和外置存储空间之间切换,因为离线瓦片数据非常大,很多户外用户希望将这些文件存储在外置TF卡上,不占用内置存储空间,所以把最近研究的整理了下,分享给大家. 需要考虑和遇到的问题(主要是不同手机.不同系统的兼容性): 1.这样获取手机所有挂载的存储器?   Android是没有提供显式的接口的,首先肯定是要阅读系统设置应用“存储”部分的源码,看存储那里是通过什么方式获取的.最后找到StorageMa

文件操作ofstream,open,close,ifstream,fin,按照行来读取数据, fstream,iosin iosout,fio.seekg(),文件写入和文件读写,文件拷贝和文件

 1.ofstream,open,close 写入文件 #include<iostream> #include<fstream> using namespace std; //通过ofstream的方式实现写入文件 open,close void main() { ofstream fout;  //ofstream输出文件 fout.open("E:\\1.txt");//打开文件 fout << "1234abcdef";

【Java】利用文件输入输出流完成把一个文件夹内的所有文件拷贝的另一的文件夹的操作

一.基本目标 使用Java完成如下的操作: 把一个文件夹内的所有文件拷贝的另一的文件夹,例如,在F盘中有a与b两个文件夹: f:/a里面有一堆文件,运行Java程序之后就会全部复制到f:/b,并且完成重命名,在所有文件之前加rename_的前缀,如果里面有文件夹,则文件夹不重命名,里面的文件进行重命名,同样在所有文件之前加rename_的前缀: 二.制作过程 1.首先主函数非常简单,就是调用了上面FileTest类中的copyFolder函数 public class FileCopy { pu

使用IO流实现对特殊文件及文件夹中文件拷贝到指定文件中

本程序可以实现将自己指定的文件类型的文件拷贝到自己想放的文件中,比如一个文件夹中有很多文件,那么我们想把所有的TXT文件拷贝到自己指定的文件中.(靠背笔记) package com.blueZhang; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcept

Android文件监控FileObserver介绍

在前面的Linux文件系统Inotify机制中介绍了Linux对文件变更监控过程.Android系统在此基础上封装了一个FileObserver类来方便使用Inotify机制.FileObserver是一个抽象类,需要定义子类实现该类的onEvent抽象方法,当被监控的文件或者目录发生变更事件时,将回调FileObserver的onEvent()函数来处理文件或目录的变更事件. 事件监控过程 在FileObserver类中定义了一个静态内部类ObserverThread,该线程类才是真正实现文件

apk安装时把程序附带文件拷贝到手机指定目录下

项目已搞定,今天把.apk文件弄到另外一台非调试手机上用,发现一个问题.因为要画图,所以绘图的点的数据保存在一个.txt的文本文件中,上次直接把它用usb传到指定文件夹下的,但是明显不科学,因为用户下载了你的.apk文件,你却告诉他,还要把这个文本文件拷贝到指定的文件夹下,所以,我就要解决这个问题,就是把文本文件打包在apk文件中,安装.apk时就让创建一个程序文件夹,然后把文本文件拷贝到这个目录文件夹里,用户运行程序,就可以绘图,不用再让他拷贝一份绘图的点的坐标的数据.同理,其实我这里还有设计

Android开发进阶:如何读写Android文件

Android主要有四大主要组件组成:Activity.ContentProvider.Service.Intent组成.Android文件的运行主要需要读写四大组件的文件.本文将介绍如何读写Android文件,希望对正在进行Android开发的朋友有所帮助. 文件存放位置 在Android中文件的I/O是存放在/data/data/<package name>/file/filename目录下. 提示:Android是基于linux系统的,在linux的文件系统中不存在类似于Windows的