【总】Android之IO流/文件导航

注意:本篇文章是本人阅读相关文章的总结,方便以后查阅,所有内容非原创,侵权删。

本篇文章内容来自于
1.Android基础之IO流

目录

一、File类
--1.1 File类的构造方法
--1.2 File类的创建方法
--1.3 File类的常用方法

二、IO流
1.IO流分类
2.InputStream/OutputStream(字节流基类 拷贝用这个)
3.Reader/Writer(字符流基类 只读或者只写用这个)
4.FileInputStream/FileOutputStream(文件输入输出流,一般都用这个)
5.BufferedInputStream/BufferedOutputStream(字节缓冲流,减少与硬盘的交流次数,加快速度,需要flush()才可写入)
6.IO流如何处理异常
7.FileReader/FileWriter(文件字符流)
8.BufferedReader/BufferedWriter(缓冲字符流,需要flush()才可写入)
9.InputStreamReader/OutputStreamWriter转换流(将字节流转换成字符流)
10.ByteArrayInputStream/ByteArrayOutputStream(数组字符流,可以将流写入到内存中,然后获取所有结果)
11.DataInputStream/DataOutputStream(基本数据流,可以以基本数据的形式写入和读取)
12.ObjectInputStream/ObjectOutputStream(对象操作流,可以序列化或者反序列化)

三、IO流应用
1.处理流(BufferedXXX)配合节点流(XXXInputStream和XXXWriter/Reader)
2.输入流(FileInputStream等)配合使用ByteArrayOutputStream(内存数组流),将输入流内容一次性输出
3.使用ObjectOutputStream将得到的密钥Key对象存储

一、File类

1.1 File类的构造方法

public File(String pathname)
public File(String parent, String child)
public File(File parent, String child)
public File(URI uri)

1.2 File类的创建方法

文件有无后缀都会创建

public boolean createNewFile() //创建文件,文件存在则不创建
public boolean mkdir() //创建文件夹,存在则不创建
public boolean mkdirs() //创建文件夹,父文件夹不存在也会创建

1.3 File类的常用方法

//重命名功能
//把文件重命名为指定的文件路径。如果路径相同,则改名即可;如果路径不同,则改名且将文件移动到指定目录下。
public boolean renameTo(File dest)

//删除功能
//删除文件或者文件夹(其中文件夹中不能有其他文件或文件夹)
public boolean delete() 

//判断功能
public boolean isDirectory()//判断是否是目录
public boolean isFile()//判断是否是文件
public boolean exists()//判断是否存在

//获取功能
public String getAbsolutePath()//获取绝对路径
public String getPath()//获取路径 指在new File(xxx)时传的参数
public String getName()//获取文件/文件夹名
public long length()//获取长度 字节数
public long lastModified()//获取最后一次的修改时间 ms值
public String[] list()//获指定目录下的所有文件/文件夹的名称
public File[] listFiles()//获指定目录下的所有文件/文件夹

二、 IO流

IO程序书写规范:
使用前要导入IO包中的类
使用时要进行IO异常处理
使用后要释放资源

1. IO流分类

输入流/输出流(按流向分)
输入流是写入到内存 InputStream、Reader
输出流是写出到存储设备 OutputStream、Writer

字节流/字符流(按操作类型分)
字节流可操作任何数据 InputStream、OutputStream
字符流只能操作纯字符数据 Reader、Writer

什么时候用字符流?什么时候用字节流?
字符流->用于只读只写,这样就不会出现半个中文的情况
字节流->用于拷贝(如果用字符流,还要进行字节到字符到字节的转换,还会乱码)

节点流/处理流
节点流的的构造参数是物理IO节点,比如public FileInputStream(File file)
处理流的构造参数是已经存在的流(装饰设计模式),比如public BufferedOutputStream(OutputStream out)

常用节点流


常用处理流

2. InputStream/OutputStream 字节流

InputStream是字节输入流的抽象基类

//InputStream的三个重要方法
//都是将内容以字节(byte)的形式读取到输入流中。
int read()
int read(byte[] b)
int read(byte[] b , int off ,int len)

OutputStream是字节输入流的抽象基类

//OutputStream的三个重要方法
void write(byte[] b)
void write(byte[] b, int off, int len)
void write(int b)

3. Reader/Writer 字符流

Reader是字符输入流的抽象基类

//Reader的重要方法
//都是将内容以字符(char)的形式读取到输入流中。
int read()
int read(char[] b)
int read(char[] b , int off ,int len)

Writer是字符输出流的抽象基类

void write(char[] b)
void write(char[] b, int off, int len)
void write(int b)

void write(String str)
void write(String str, int off, int len)
Writer append(char c)
Writer append(CharSequence csq)
Writer append(CharSequence csq, int start, int end)

4.FileInputStream/FileOutputStream

Android-IO流之文件输入输出字节流FileInputStream/FileOutputStream

5.BufferedInputStream/BufferedOutputStream

Android-IO流之缓冲字节流BufferedInputStream/BufferedOutputStream

6.IO流如何处理异常

处理方式一:

File dir = Environment.getExternalStorageDirectory();
File file = new File(dir, "abc.txt");
File dst = new File(dir, "dst1.text");

FileInputStream fis = null;
FileOutputStream fos = null;
try {
    fis= new FileInputStream(file);
    fos= new FileOutputStream(dst);

    //读写步骤 
    ...
} catch (Exception e) {
    e.printStackTrace();
}finally {
    if(fis!=null){
         try {
               fis.close();
         } catch (IOException e) {
               e.printStackTrace();
               fis = null; //手动关流
         }
     }
     if(fos!=null){
         try {
              fos.close();
         } catch (IOException e) {
              e.printStackTrace();
              fos = null; //手动关流
         }
    }
}

处理方式二:

File dir = Environment.getExternalStorageDirectory();
File file = new File(dir, "abc.txt");
File dst = new File(dir, "dst1.text");

FileInputStream fis = null;
FileOutputStream fos = null;
try {
    fis= new FileInputStream(file);
    fos= new FileOutputStream(dst);

    //读写步骤 
    ...
} catch (Exception e) {
    e.printStackTrace();
}finally { 

          //能关一个是一个
            try {
                if (fis != null) {
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (fos != null) {
                    try {
                        fos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
}

7.FileReader/FileWriter

Android-IO流之文件字符流FileReader/FileWriter

8. BufferedReader/BufferedWriter

Android-IO流之缓冲字符流BufferedReader/BufferedWriter

9.InputStreamReader/OutputStreamWriter转换流(extends Reader)

Android-IO流之转换流InputStreamReader/OutputStreamWriter

10.ByteArrayInputStream/ByteArrayOutputStream

Android-IO流之数组内存字节流ByteArrayInputStream/ByteArrayOutputStream

11.DataInputStream/DataOutputStream数据流

Android-IO流之数据流DataInputStream/DataOutputStream

12.ObjectInputStream/ObjectOutputStream对象操作流

Android-IO流之对象操作流ObjectInputStream/ObjectOutputStream

三、IO流应用

1.处理流(BufferedXXX)配合节点流(XXXInputStream/OutputStream和XXXWriter/Reader)

实例:当系统提供的方法返回的是FileOutputStream时,想写入字符串,则配合使用缓存流BufferedWriter和转换流OutputStreamWriter

        String data = "hello my life";
        FileOutputStream fileOutputStream = openFileOutput("hello.txt", Context.MODE_PRIVATE);
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
        bw.write(data);
        bw.close();

实例:当系统提供的方法返回是FileInputStream时,想读出字符串信息。则配合使用BufferedReader和InputStreamReader

        FileInputStream fileInputStream = openFileInput("hello.txt");
        BufferedReader br = new BufferedReader(new InputStreamReader(fileInputStream));
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }
        Log.d("xl", sb.toString());
        br.close();

2. 输入流(FileInputStream等)配合使用ByteArrayOutputStream(内存数组流),将输入流内容一次性输出

实例:将文件中的内容读出显示

            String fileName = "sdcontent.txt";
            File dir = Environment.getExternalStorageDirectory();
            File file = new File(dir, fileName);

            FileInputStream fis = new FileInputStream(file);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            byte[] buffer = new byte[1024];
            int len = -1;
            while ((len = fis.read(buffer)) != -1) {
                baos.write(buffer,0,len);
            }

            Log.d("xl", baos.toString());
            fis.close();

3.使用ObjectOutputStream将得到的密钥Key对象存储

//生成随机秘钥
SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey();
//序列化秘钥到磁盘上
FileOutputStream fos = new FileOutputStream(new File("heima.key"));
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(secretKey);

//从磁盘里读取秘钥
FileInputStream fis = new FileInputStream(new File("heima.key"));
ObjectInputStream ois = new ObjectInputStream(fis);
Key key = (Key) ois.readObject();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,547评论 4 374
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,787评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,175评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,752评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,169评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,056评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,195评论 2 321
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,980评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,724评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,872评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,344评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,667评论 3 264
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,379评论 3 245
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,202评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,992评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,189评论 2 286
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,987评论 2 279

推荐阅读更多精彩内容

  • 一、流的概念和作用。 流是一种有顺序的,有起点和终点的字节集合,是对数据传输的总成或抽象。即数据在两设备之间的传输...
    布鲁斯不吐丝阅读 9,955评论 2 95
  • 在经过一次没有准备的面试后,发现自己虽然写了两年的android代码,基础知识却忘的差不多了。这是程序员的大忌,没...
    猿来如痴阅读 2,744评论 3 10
  • # 3.1 File # ## 3.1.1 File基本概念 ## 1.基本概念 -File类用于表示文件(目录)...
    闫子扬阅读 435评论 0 0
  • 阿兰德波顿真是很好玩,他说成熟的爱就是一种有性关系的友谊,大家相处和睦,令人愉悦,彼此回应,而不成熟的爱则是一场溺...
    翻译小垃圾阅读 137评论 0 0
  • 我很确信啊。因为我一次一次的印证到,当我内心平静的时候,我能感受到这个世界上很多很多快乐的东西。这种内心平静就是当...
    weeklybright阅读 57评论 0 0