• Android读写assets、raw、sdard和工程文件的方法


      Android开发离不开对文件的操作,前面的文章“Android简易数据存储之SharedPreferences”和“Android数据存储之SQLite的操作”,分别讲解了简单的数据的存储和数据库数据的操作。然而,前面的两篇文章都未涉及具体文件的操作。下面来看下Android是怎么操作其内置目录文件及外部sdcard数据的。

      环境:Android studio、海马玩模拟器

      资源文件:

        /assets目录下test.txt

    aaaaaaaaaaaaaa
    bbbbbbb

        /res/raw(需要手工创建)目录下rawfile.txt

    raw file
    ddddddddddd
    eeeeeeeeee
    ffffffffff

      一、读取assets目录下的文件

                //读写assets目录下的文件
                InputStream is = getResources().getAssets().open("test.txt");
                Reader in = new InputStreamReader(is);
                BufferedReader bufferedReader = new BufferedReader(in);
                String line = null;
                while (null != (line = bufferedReader.readLine()) ){
                    System.out.println("assets file==========" + line);
                }
                bufferedReader.close();
                in.close();
                is.close();

      由于assets下的文件不会再R.java中生成相应的ID,因此Android提供了AssetManager的方法访问assets下的资源。

      二、读取raw目录下的文件

                //读取raw目录下的文件,raw位于res目录下,需要手工创建
                is = getResources().openRawResource(R.raw.rawfile);
                in = new InputStreamReader(is);
                bufferedReader = new BufferedReader(in);
                line = null;
                while (null != (line = bufferedReader.readLine()) ){
                    System.out.println("rawfile==========" + line);
                }
                bufferedReader.close();
                in.close();
                is.close();

      三、读写工程内部文件

               //读写工程内部文件
                FileOutputStream fileOutputStream = openFileOutput("projectfile.txt", Context.MODE_PRIVATE);
                OutputStreamWriter osw = new OutputStreamWriter(fileOutputStream);
                BufferedWriter bw = new BufferedWriter(osw);
                bw.write("ooooooooooooooooooo");
                bw.close();
                osw.close();
                fileOutputStream.close();
    
                FileInputStream fileInputStream = openFileInput("projectfile.txt");
                InputStreamReader isr = new InputStreamReader(fileInputStream);
                char[] input = new char[fileInputStream.available()];
                isr.read(input);
                isr.close();
                fileInputStream.close();
                String str = new String(input);
                System.out.println("project file=============" + str);

      四、读写sdcard文件

      1、AndroidManifest.xml中添加权限控制

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

      2、读写sdcard文件

                //读写sdcard,需要在AndroidManifest.xml中添加权限说明
                //<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
                File file = Environment.getExternalStorageDirectory();//获取sdcard路径
                if(file.exists()){//判断是否存在sdcard
                    System.out.println("sdcard file path========" + file.getAbsolutePath());
                    File myfile = new File(file, "myfile_sdcard.txt");
                    myfile.createNewFile();
                    FileOutputStream fos = new FileOutputStream(myfile);
                    fos.write("AAAAAAAAAAa".getBytes());
                    fos.flush();
                    fos.close();
                }
    
                //读取sdcard文件
                File file1 = new File(file, "myfile_sdcard.txt");
                InputStream inputStream = new FileInputStream(file1);
                Reader reader = new InputStreamReader(inputStream);
                BufferedReader bufferedReader1 = new BufferedReader(reader);
                String iline = null;
                while(null != (iline = bufferedReader1.readLine())){
                    System.out.println("from sdcard myfile_sdcard.txt============" + iline);
                }
                bufferedReader1.close();
                reader.close();
                inputStream.close();

      五、将APP运行到模拟器中,此时可以看到如下的输出结果

    09-13 09:44:57.520    2243-2243/com.example.ibm.dataoperate I/System.out﹕ assets file==========aaaaaaaaaaaaaa
    09-13 09:44:57.524    2243-2243/com.example.ibm.dataoperate I/System.out﹕ assets file==========bbbbbbb
    09-13 09:44:57.528    2243-2243/com.example.ibm.dataoperate I/System.out﹕ rawfile==========raw file
    09-13 09:44:57.528    2243-2243/com.example.ibm.dataoperate I/System.out﹕ rawfile==========ddddddddddd
    09-13 09:44:57.532    2243-2243/com.example.ibm.dataoperate I/System.out﹕ rawfile==========eeeeeeeeee
    09-13 09:44:57.532    2243-2243/com.example.ibm.dataoperate I/System.out﹕ rawfile==========ffffffffff
    09-13 09:44:57.544    2243-2243/com.example.ibm.dataoperate I/System.out﹕ project file=============ooooooooooooooooooo
    09-13 09:44:57.552    2243-2243/com.example.ibm.dataoperate I/System.out﹕ sdcard file path========/mnt/sdcard
    09-13 09:44:57.556    2243-2243/com.example.ibm.dataoperate I/System.out﹕ from sdcard myfile_sdcard.txt============AAAAAAAAAAa

      上述四种操作Android文件的方式,各个处理方式都有所不同。

        1、读取assets目录下的资源文件时需要通过getResources().getAssets()方法获取AssetManager的open方法来进行处理;

        2、而读取raw目录下的资源文件则通过getResources().openRawResource(R.raw.资源名称)的方式来获取;

        3、读写工程其他目录的文件则通过openFileOutput和openFileInput来进行处理;

        4、最后sdcard文件的操作需要额外在AndroidManifest.xml中进行权限的声明,并通过Environment.getExternalStorageDirectory()获取sdcard的路径,剩下的就是Java对文件的操作了。

  • 相关阅读:
    一致性哈希的理解与实践
    nil in Go
    为什么Go没有math.Min/Max(int, int) 函数?
    What happens when I type kubectl run?
    kubelet简要分析
    编译安装nginx和模块
    nginx与tengine添加check模块(nginx_upstream_check_module)
    多台ESXI 6.5 添加 iSCSI 共享存储 --centos 7.4 作为target
    Cannot open the disk '/vmfs/volumes/5e97f429-a56d6ea0-1ef3-000c29a09445/oracle_node1/oracle_node1_1.vmdk' or one of the snapshot disks it depends on.
    RabbitMQ windows2016 镜像模式 haproxy+keepalived
  • 原文地址:https://www.cnblogs.com/rwxwsblog/p/4804133.html
Copyright © 2020-2023  润新知