Android如何写文件到sdcard目录或指定目录,读指定目录中指定文件的内容

 首先在AndroidManifest中添加读写权限:









public class FileWriteReadActivity extends Activity {
    private static final String TAG="FileWriteReadActivity";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_new_bd_meige);
        //将内容为"test read file222" 的文本文件baa.txt存到/sdcard目录下
        writeFile("test read file222","/sdcard","baa.txt");


        try {
            Thread.sleep(3000);
            //从/sdcard目录中读baa.txt文件中的内容
            String fileActivateData = getFileActivateData("/sdcard","baa.txt");
            Log.e(TAG,"fileActivateData==="+fileActivateData);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }


    /**
     * 写文本文件到指定目录下
     * @param content 文本内容 "test read file222"
     * @param rootPath 指定要存放的目录 此示例中是/sdcard
     * @param authName 文件名称 "baa.txt"
     */
    public void writeFile(String content,String rootPath,String authName) {
        try {
            //判断实际是否有SD卡,且应用程序是否有读写SD卡的能力,有则返回true
            if (Environment.getExternalStorageState().equals(
                    Environment.MEDIA_MOUNTED)) {
                String path = rootPath;
                File dir = new File(path);
                if (!dir.exists()) {
                    dir.mkdirs();
                }
                File targetFile = new File(path +"/"+authName);
                Log.e("FilePackUtil", "targetFile.getPath()===" + targetFile.getPath());
//                方式一:使用RandomAccessFile是在原有的文件基础之上追加内容,
//                RandomAccessFile raf = new RandomAccessFile(targetFile, "rw");
//                raf.seek(targetFile.length()); //光标移到原始文件最后,再执行写入
//                raf.write(content.getBytes());
//                raf.close();

//                方式二:而使用outputstream则是要先清空内容再写入
                FileOutputStream fileOutputStream = new FileOutputStream(targetFile);
                byte[] buffer=content.getBytes();
                fileOutputStream.write(buffer, 0, buffer.length);// 开始写入数据到这个文件。
                fileOutputStream.flush();
                fileOutputStream.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 读取指定目录下指定文件的内容
     * @param fileAbsolutePaht 指定的目录 /sdcard
     * @param txtName 指定的文件 "baa.txt"
     * @return
     */
    private String getFileActivateData(String fileAbsolutePaht,String txtName) {
        ArrayList result = new ArrayList();
        File file = new File(fileAbsolutePaht);
        File[] files = file.listFiles();
        if (files != null) {
            //筛选指定目录下是否有指定文件
            for (int i = 0; i < files.length; ++i) {
                if (!files[i].isDirectory()) {
                    String fileName = files[i].getName();
                    if (fileName.equals(txtName)) {
                        result.add(fileName);
                    }
                }
            }
            
            //若有指定文件,则读文件内容
            if (result.size() != 0) {
                return readTxtFile(fileAbsolutePaht + "/"+ result.get(0));
            }
        }
        return "";
    }


    /**
     * 读文件中的内容 
     * @param strFilePath /sdcard/baa.txt
     * @return
     */
    public String readTxtFile(String strFilePath) {
        String path = strFilePath;
        Log.e("FilePackUtil", "strfilePath===" + path);
        String content = ""; //文件内容字符串
        //打开文件
        File file = new File(path);
        //如果path是传递过来的参数,可以做一个非目录的判断
        if (file.isDirectory()) {
            Log.d("TestFile", "The FaceAuthFile doesn't not exist.");
        } else {
            try {
                InputStream instream = new FileInputStream(file);
                if (instream != null) {
                    InputStreamReader inputreader = new InputStreamReader(instream);
                    BufferedReader buffreader = new BufferedReader(inputreader);
                    String line;
                    //分行读取
                    while ((line = buffreader.readLine()) != null) {
                        content += line;
                    }
                    instream.close();
                }
            } catch (java.io.FileNotFoundException e) {
                Log.d("TestFile", "The File doesn't not exist.");
            } catch (IOException e) {
                Log.d("TestFile", e.getMessage());
            }
        }
        return content;
    }
}

踩坑提醒:

若报错/sdcard/....:open failed:EACCES(Permission denied) 则表示没有权限向sdcard中写文件

解决方法:

1、更换文件存储目录为外部存储。如使用getExternalCacheDir(),存放路径一般是/storage/sdcard/Android/data/<应用包名>/cache目录。 

2、将应用打包成系统应用。在AndroidManifest.xml 中manifest节点下添加 android:sharedUserId="android.uid.system",还需要系统签名。

你可能感兴趣的:(android,java,开发语言)