Android 中的文件操作的9个实例

本文详细介绍了在Android平台上进行文件操作的9个典型实例,涵盖了读写文件、权限管理等核心内容,帮助开发者深入理解Android文件系统的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

权限:

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


package tech.androidstudio.filereadandwritetwentyexamples;

import android.graphics.drawable.Drawable;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try {
            //实例1:复制一张图片,一个字节一个字节的读取
            example1CopyImage();
            //实例2,通过字节数组来拷贝图片,效率高很多
            example2CopyImage();
            //实例3 使用字节流的缓冲区复制一张图片
            example3CopyImage();
            //实例4 ----得到某个目录下的所有目录和文件--分别以字符串和文件的形式存储到数组中,例如获取外部存储的 公共目录 的内容
            example4ListDirAndFiles();
            //实例5 ----过滤文件名的过滤器,过滤文件或文件夹
            example5FileFilter();
            //实例6 使用递归列出指定目录下的所有内容,包括子目录中的内容
            //递归,有一个条件就是必须要有退出的条件。
            example6ListFiles();
            //实例7 得到指定目录下的所有的目录包括子目录下的,存到集合中,然后存到cache/record.text 文件中
            example7ListDirectorys();
            //实例8 打印流,字节输出流
            example8PrintStream();
            //实例9,字符输出流
            example9PrintWriter();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    //实例1:复制一张图片,一个字节一个字节的读取
    public void example1CopyImage() throws IOException {
        InputStream inputStream = getResources().openRawResource(R.raw.a);
        FileOutputStream fos = new FileOutputStream(getCacheDir().getPath()+"/1.bmp");

        int num;
        while((num=inputStream.read())!=-1){
            fos.write(num);
        }
        //关闭流
        inputStream.close();
        fos.close();
    }

    //实例2,通过字节数组来拷贝图片,效率高很多
    public void example2CopyImage() throws IOException {
        InputStream inputStream = getResources().openRawResource(R.raw.a);
        FileOutputStream fos = new FileOutputStream(getCacheDir().getPath()+"/2.bmp");
        //创建一个1024个字节的 字节数组
        byte[] arr = new byte[1024];
        int len=0;
        while((len=inputStream.read(arr))!=-1){
            fos.write(arr,0,len);
        }
        fos.close();
        inputStream.close();
    }

    //实例3 使用字节流的缓冲区复制一张图片
    public void example3CopyImage() throws IOException{
        BufferedInputStream bis =
                new BufferedInputStream(getResources().openRawResource(R.raw.a));
        BufferedOutputStream bos =
                new BufferedOutputStream(new FileOutputStream(getCacheDir().getPath()+"/3.bmp"));
        byte[] arr = new byte[1024];
        int len=0;
        while ((len=bis.read(arr))!=-1){
            bos.write(arr,0,len);
        }

        bis.close();
        bos.close();
    }

    //实例4 ----得到某个目录下的所有目录和文件--分别以字符串和文件的形式存储到数组中,例如获取外部存储的 公共目录 的内容
    //需要权限<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    //需要权限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    public void example4ListDirAndFiles(){
        File directory = Environment.getExternalStorageDirectory();
        //得到某个目录下的所有目录和文件--以字符串的形式存储到数组中
        Log.d("kodulf","实例4 得到某个目录下的所有目录和文件--以字符串的形式存储到数组中");
        String[] list = directory.list();
        for(String filename:list){
            Log.d("kodulf","文件名 "+filename);
        }

        //得到某个目录下的所有目录和文件--以File形式存储到数组中
        Log.d("kodulf","实例4 得到某个目录下的所有目录和文件----以File形式存储到数组中");
        File[] files = directory.listFiles();
        for (File file:files){
            if(file.isDirectory()){
                Log.d("kodulf","目录 "+file.getName());
            }else{
                Log.d("kodulf","文件名 "+file.getName());
            }
        }
    }

    //实例5 ----过滤文件名的过滤器,过滤文件或文件夹
    public void example5FileFilter() throws IOException{

        File cacheDir = getCacheDir();
        FilterByName filterByName = new FilterByName();
        File[] files = cacheDir.listFiles(filterByName);
        for (File file :files){
            Log.d("kodulf","实例5 cacheDir里面的以bmp结尾的文件 "+file.getName());
        }

        FilterByFile filterByFile = new FilterByFile();
        File[] files1 = cacheDir.listFiles(filterByFile);
        for (File file :files1){
            Log.d("kodulf","实例5 cacheDir里面的文件 "+file.getName());
        }
    }

    //值接收以 bmp结尾的
    class FilterByName implements FileFilter {

        @Override
        public boolean accept(File pathname) {
            String name = pathname.getName();

            if(name.endsWith("bmp")){
                return true;
            }
            return false;
        }
    }

    //只接收文件的,不接受文件夹的。
    class FilterByFile implements FileFilter{

        @Override
        public boolean accept(File pathname) {
            if(pathname.isFile()){
                return true;
            }
            return false;
        }
    }

    //实例6 使用递归列出指定目录下的所有内容,包括子目录中的内容
    //递归,有一个条件就是必须要有退出的条件。
    public void example6ListFiles() throws IOException{
        Log.d("kodulf","实例6++++++++开始+++++++++++++");
        File directory = Environment.getExternalStorageDirectory();
        listFils(directory);
        Log.d("kodulf","实例6+++++++结束++++++++++++++");
    }

    public void listFils(File sourceFile){
        File[] files = sourceFile.listFiles();
        if(files!=null){
            for (File file:files){
                if (file.isDirectory()){
                    Log.d("kodulf", "目录名 " + file.getName());
                    listFils(file);
                }else{
                    Log.d("kodulf","文件名 "+file.getName());
                }
            }
        }
    }

    //实例7 得到指定目录下的所有的目录包括子目录下的,存到集合中,然后存到cache/record.text 文件中
    //1:得到指定目录下的所有的Java文件包括子目录下的,存到集合中
    //2:遍历集合,把集合中每个File对象写入到文件中
    public void example7ListDirectorys() throws IOException{
        Log.d("kodulf", "实例7++++++++开始+++++++++++++");
        List<File> directorys = new ArrayList<File>();
        File externalStorageDirectory = Environment.getExternalStorageDirectory();
        listDirectorys(externalStorageDirectory, directorys);

        File recordFile = new File(getCacheDir(),"record.text");
        BufferedWriter bw = new BufferedWriter(new FileWriter(recordFile));
        for (File file:directorys){
            bw.write(file.getName());
            bw.newLine();
            bw.flush();
        }

        bw.close();

        Log.d("kodulf", "实例7++++++++结束+++++++++++++");
    }

    public void listDirectorys(File sourceFile,List<File> directorys){
        directorys.add(sourceFile);
        File[] files = sourceFile.listFiles();
        if(files!=null){
            for (File file :files){
                if(file.isDirectory()){
                    listDirectorys(file, directorys);
                    Log.d("kodulf","add file"+file.getName());
                }
            }
        }
    }

    //实例8 打印流,字节输出流
    public void example8PrintStream() throws IOException{
        Log.d("kodulf", "实例8++++++++开始+++++++++++++");
        /*打印流:
         PrintStream:字节输出流,字节输出流的基本功能都具备了,又增加了打印功能
                     可以操作的目的:
					 File类型的文件
					 字符串类型的文件
					 字节输出流

		*/
        PrintStream ps = new PrintStream(getCacheDir().getPath()+"/print.txt");
        //ps.write(97);// 00000000 00000000 00000000 01100001---->自动砍掉了前三个字节--->01100001
        //ps.write(353);//  00000000 00000000 00000001 01100001---->自动砍掉了前三个字节--->01100001
        //System.out.println(353);
        //ps.println(353);//按照数据原样儿写入到目的,也就是数据的表现形式,内部用了 String.valueOf()
        ps.write(String.valueOf(353).getBytes());
        ps.close();
        Log.d("kodulf", "实例8++++++++结束+++++++++++++");
    }

    //实例9,字符输出流
    public void example9PrintWriter() throws IOException{
        Log.d("kodulf", "实例9++++++++开始+++++++++++++");
		/*
		 PrintWriter:字符输出流,字符输出流的基本功能都具备了,增加了打印功能
		             可以操作的目的:
						 File类型的文件
						 字符串类型的文件
						 字节输出流
						 字符数出流
		*/

        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(getCacheDir().getPath()+"/print.txt")));

        //PrintWriter pw = new PrintWriter(System.out,true);//自动刷新

        PrintWriter pw = new PrintWriter(new FileWriter("qq.txt"),true);//自动刷新

        String line = null;

        while((line = br.readLine())!=null)
        {
            if("over".equals(line))
                break;
            pw.println(line);
            //pw.write(line);
            //pw.write("\r\n");
            //pw.flush();
        }
        br.close();
        pw.close();
        Log.d("kodulf", "实例9++++++++结束+++++++++++++");
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值