【Android基础】I/O流

流类结构图

在这里插入图片描述

一、分类

1、按流向分

  • 输入流:从文件中读到程序中
  • 输出流:从程序中输出到文件中

2、按数据传输单位分

  • 字节流:以字节为单位传输数据的流
  • 字符流:以字符为单位传输数据的流
字节流字符流
输入流InputStreamReader
输出流OutputStreamWriter

3、按功能分

  • 节点流:直接与数据源打交道的流。
    直接使用节点流读写不方便,为了更快的读写文件,才有了处理流。
  • 处理流:不直接与数据源打交道,与其他的"流"打交道。
    处理流的构造方法总是要带一个其他的流对象做参数。

常用节点流:

InputStreamOutputStreamReaderWriter
文件流FileInputStreamFileOutputStreamFileReaderFileWriter
数组流ByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter
字符串流××StringReaderStringWriter

常用处理流:

InputStreamOutputStreamReaderWriter
缓冲流BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter
转换流InputStreamReaderOutputStreamWriter××
数据流DataInputStreamDataOutputStream××
对象流ObjectInputStreamObjectOutputStream××
打印流PrintStream×PrintWriter×

二、4大流基本方法

1、InputStream基本方法

返回值类型方法名方法简介
intread()从输入流中读取数据的下一个字节,返回读到的字节值。若遇到流的末尾,返回-1
intread(byte b[])从输入流中读取b.length个字节的数据并存储到缓冲区数组b中。返回的是实际读到的字节总数
intread(byte b[], int off, int len)读取len个字节的数据,并从数组b的off位置开始写入到这个数组中
longskip(long n)跳过和丢弃此输入流中数据的n个字节,返回实际跳过的字节数
intavailable()返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数
voidclose()关闭此输入流并释放与此流关联的所有系统资源

多个流关闭规则为:先关闭外层流,再关闭内层流。
一般情况下是,先打开的后关闭,后打开的先关闭;
另一种情况是看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b。

2、OutputStream基本方法

返回值类型方法名方法简介
voidwrite(int b)将指定的字节写出此输出流
voidwrite(byte[] b)将b.length个字节从指定的byte数组写出此输出流
voidwrite(byte[] b, int off, int len)将指定byte数组中从偏移量off 开始的len个字节写出此输出流
voidflush()刷新此输出流并强制写出所有缓冲的输出字节
voidclose()关闭此输出流并释放与此流有关的所有系统资源(含刷新操作)

3、Reader基本方法

返回值类型方法名方法简介
intread()读取单个字符,返回作为整数读取的字符。如果已到达流的末尾返回-1
intread(char[] cbuf)将字符读入数组,返回读取的字符数
intread(char[] cbuf, int off, int len)读取 len 个字符的数据,并从数组cbuf的off位置开始写入到这个数组中
voidclose()关闭该流并释放与之关联的所有资源
longskip(long n)跳过n个字符。

4、Writer基本方法

返回值类型方法名方法简介
voidwrite(int c)写入单个字符
voidwrite(char[] cbuf)写入字符数组
voidwrite(char[] cbuf, int off, int len)写入字符数组的某一部分
voidwrite(String str)写出字符串到关联的数据源中去
write(String str, int off, int len)写字符串的某一部分
voidclose()关闭此流。会先刷新,再关闭
voidflush()刷新该流的缓冲,将缓冲的数据全写到目的地

三、实战演练

1、FileInputStream:读取文件内容

  • openFileInput(String filename)
    打开应用程序私有目录下的的指定私有文件以读出数据,返回一个FileInputStream对象
        FileInputStream fis = null;
        try {
            //1、创建输入流
            fis = openFileInput("temp.txt");
            //2、返回这个输入流中可以被读的剩下的bytes字节的估计值;
            int size =  fis.available() ;
            //3、根据输入流中的字节数创建byte数组;
            byte[] array = new byte[size];
            //4、把数据读取到数组中;
            fis.read(array);
            //5、根据获取到的Byte数组新建一个字符串,然后输出;
            String result = new String(array);

            Log.d("MainActivityTemp", "read the content is: " + result);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    //6、关闭流
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

在这里插入图片描述

2、FileOutputStream:将内容写入文件

  • openFileOutput(String fileName,int mode)
    打开应用程序私有目录下的的指定私有文件以写入数据,返回一个FileOutputStream对象。如果文件不存在就创建这个文件。

mode有四种

  • Context.MODE_PRIVATE:
    默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容。
  • Context.MODE_APPEND:
    模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
  • Context.MODE_WORLD_READABLE:
    表示当前文件可以被其他应用读取。
  • Context.MODE_WORLD_WRITEABLE:
    表示当前文件可以被其他应用写入。
        FileOutputStream fos = null;
        //要写入的内容
        String content = "Hello,今天是2020年10月29日";
        try {
            //1、创建输出流
            fos = openFileOutput("temp.txt", MODE_PRIVATE);
            //2、把string转换为byte数组并写入
            fos.write(content.getBytes());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    //3、关闭流
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

文件在/data/user/0/包名/files/temp.txt下
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值