【Android】从手机存储读取内容并显示在TextView上

实现效果:
1、判断在该目录下是否有一个printf.txt文件,没有则复制一个过去,有则显示内容
这里写图片描述

2、文件的内容:
这里写图片描述

3、手机读取并显示在TextView上
这里写图片描述

部分代码和前一篇读取raw的差不多,故不赘述了,直接上代码,详细见注释

package com.bm.readtxt0126;

import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;

/*
    参考资料:https://www.cnblogs.com/liqw/p/4014760.html
    【Android 建立文件夹、生成文件并写入文本文件内容】
* */

public class MainActivity extends AppCompatActivity {

    String filePath,fileName;

    TextView textView;
    InputStream inputStreamRawTxt;
    Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            textView.setText(msg.obj.toString());
        }
    };

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

        initView();
        initData();
        initEvent();

    }

    private void initView(){

        textView=findViewById(R.id.id_main_text);

    }

    private void initData(){

        filePath=Environment.getExternalStorageDirectory().getAbsolutePath()
                +"/Download/";
        fileName="printf.txt";
        inputStreamRawTxt =getResources().openRawResource(R.raw.printf);

    }

    private void initEvent(){

        //判断是否有该文件夹,没有则创建一个,生成文件夹之后,再生成文件,不然会出错
        makeDirectory(filePath);
        //在线程中执行耗时操作
        new Thread(new Runnable() {
            @Override
            public void run() {

            //判断是否有该文件,没有则创建一个,并返回true
            if (createNewFile(filePath,fileName)){
                //返回true说明创建了新的文件,则写入预设内容,
                //返回false,则说明文件已存在,不需要写入(也不会进入该判断)

                //将输入流转换成字符串,写入文件
                String rawTxtString=Stream2String(inputStreamRawTxt);
                writeTxtToFile(rawTxtString,filePath,fileName);
            }

            //再将文件读取为字符串
            String text=ReadTxtFromSDCard(fileName);
            //显示出来
            Message message=Message.obtain(handler);
            message.obj=text;
            handler.sendMessage(message);

            }
        }).start();
    }

    // 生成文件夹
    public static void makeDirectory(String filePath) {
        File file = null;
        try {
            file = new File(filePath);
            if (!file.exists()) {
                file.mkdir();
            }
        } catch (Exception e) {
            Log.i("error:", e+"");
        }
    }
    // 生成文件
    public boolean createNewFile(String filePath, String fileName) {
        File file = null;
        try {
            file = new File(filePath + fileName);
            if (!file.exists()) {
                file.createNewFile();
                return true;
            }else {
                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    // 将字符串写入到文本文件中
    public void writeTxtToFile(String stringContent, 
                               String filePath, String fileName) {

        String strFilePath = filePath+fileName;
        // 每次写入时,都换行写
        String strContent = stringContent + "\r\n";
        File file = new File(strFilePath);

        try {
            RandomAccessFile raf = new RandomAccessFile(file, "rwd");
            raf.seek(file.length());
            raf.write(strContent.getBytes());
            raf.close();
        } catch (Exception e) {
            Log.e("TestFile", "Error on write File:" + e);
        }
    }

    private String Stream2String(InputStream is) {
        //强制缓存大小为16KB,一般Java类默认为8KB
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(is), 16*1024); 
        StringBuilder sb = new StringBuilder();

        String line = null;
        try {
            while ((line = reader.readLine()) != null) {  //处理换行符
                sb.append(line + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }

    //这是这篇的重点,按ctrl+f关注input的操作
    private String ReadTxtFromSDCard(String filename){

        StringBuilder sb = new StringBuilder("");
        //判断是否有读取权限
        if(Environment.getExternalStorageState().
                equals(Environment.MEDIA_MOUNTED)){

            //打开文件输入流
            try {
                FileInputStream input = new FileInputStream(filePath + filename);
                byte[] temp = new byte[1024];

                int len = 0;
                //读取文件内容:
                while ((len = input.read(temp)) > 0) {
                    sb.append(new String(temp, 0, len));
                }
                //关闭输入流
                input.close();
            } catch (java.io.IOException e) {
                Log.e("ReadTxtFromSDCard","ReadTxtFromSDCard");
                e.printStackTrace();
            }

        }
        return sb.toString();
    }

}


猜你喜欢

转载自blog.csdn.net/bfz_50/article/details/79219268