[摘]Android IO流读写文件实例2

Android  2019年5月29日 pm7:33发布6年前 (2019)更新 城堡大人
120 0 0

一、超类:

字节流: InputStream(读入流) OutputStream(写出流)

字符流: Reader(字符 读入流) Writer (字符写出流)

二、文件操作流

字节流: FileInputStream ,FileOutputStream

字符流: FileReader, FileWriter(用法与字节流基本相同,不写)

        //1.指定要读 的文件目录及名称
        File file =new File("文件路径");
        //2.创建文件读入流对象
        FileInputStream fis =new FileInputStream(file);
        //3.定义结束标志,可用字节数组读取
        int i =0 ;
        while((i = fis.read())!=-1){
            //i 就是从文件中读取的字节,读完后返回-1
        }
        //4.关闭流
        fis.close();
        //5.处理异常

        //1.指定要写到的文件目录及名称
        File file =new File("文件路径");
        //2.创建文件读入流对象
    FileOutputStream fos =new FileOutputStream(file);
        //3.定义结束标志
        fos.write(要写出的字节或者字节数组);
        //4.刷新和关闭流
        fos.flush();
        fos.close();
        //5.处理异常

三、缓冲流:

字节缓冲流: BufferedInputStream,BufferedOutputStream

字符缓冲流:BufferedReader ,BufferedWriter

缓冲流是对流的操作的功能的加强,提高了数据的读写效率。既然缓冲流是对流的功能和读写效率的加强和提高,所以在创建缓冲流的对象时应该要传入要加强的流对象。

//1.指定要读 的文件目录及名称
        File file =new File("文件路径");
        //2.创建文件读入流对象
        FileInputStream fis =new FileInputStream(file);
        //3.创建缓冲流对象加强fis功能
BufferedInputStream bis =new BufferedInputStream(fis);
        //4.定义结束标志,可用字节数组读取
        int i =0 ;
        while((i = bis.read())!=-1){
            //i 就是从文件中读取的字节,读完后返回-1
        }
        //5.关闭流
        bis.close();
        //6.处理异常

        //1.指定要写到的文件目录及名称
        File file =new File("文件路径");
        //2.创建文件读入流对象
    FileOutputStream fos =new FileOutputStream(file);
        //3.创建缓冲流对象加强fos功能
BufferedOutputStream bos=new BufferedOutputStream(fos);
        //4.向流中写入数据
        bos.write(要写出的字节或者字节数组);
        //5.刷新和关闭流
        bos.flush();
        bos.close();
        //6.处理异常

由以上看出流的操作基本相同,此流与文件流操作是几乎一样的只是将文件流作为参数传入缓冲流的构造方法中堆文件流读写文件的功能进行加强

注1:在字符读入缓冲流BufferedReader 中还提供了读一行的方法 readLine() 可以读取一行文本
在字符写出缓冲流BufferedWriter 中还提供了写人一个行行分隔符的方法writeLine(),用于写出时换行

注2:此处用到的是GoF设计模式中的装潢(装饰)模式

注3:创建缓冲流的对象的装逼模式:

BufferedInputStream bis =new BufferedInputStream(
new FileInputStream(new File("文件路径"))); 

注4:缓冲流参数只要是一中超类的子类就行

四、对象流

ObjectInputStream ,ObjectOutputStream
不同于以上两种类型的流这里只能用字节对对象进行操作原因可以看上篇的编码表比照原理

ObjectOutputStream对象的序列化:
将java程序中的对象写到本地磁盘里用ObjectOutputStream
eg:将Person类的对象序列化到磁盘

1.创建Person类
    注1:此类要实现Serializable接口,此接口为标志性接口
    注2:此类要有无参的构造函数
    注3:一旦序列化此类不能再修改
    class Person implements Serializable{
        public Person(){}
    }
2.创建对象流对象
    注:要增强功能可以将传入文件缓冲流
    ObjectOutputStream oos =new ObjectOutputStream(
    new FileOutputStream(new File("文件路径")));
3.写入对象 ,一般会将对象用集合存储起来然后直接将集合写入文件
    List<Person> list =new ArrayList<>();
    list.add(new Person());
    ...(可以添加多个)
    oos.writeObject(list);
4.关闭流,处理异常
    oos.flush();
    oos.close();

ObjectInputStream对象的反序列化:
从本地磁盘里用ObjectInputStream将对象文件读入java程序


注1:用集合接收的时候要强转
1.创建对象流对象
    ObjectInputStream ois =new ObjectInputStream(
    new FileInputStream(new File("文件路径")));
2.读入对象
    List<Person> list =new ArrayList<>();
    List =(List<Person>)ois.readObject();
3.关闭流,处理异常
    ois.close();

五、转换流:

这类流是用于将字符转换为字节输入输出,用于操作字符文件,属于字符流的子类,所以后缀为reader,writer;前缀inputstream,outputstream;注 :要传入字节流作为参赛

InputStreamReader: 字符转换输出流

OutputStreamWriter:字符转换输入流

需求:读取键盘输入的一行文本,再将输入的写到本地磁盘上
//1.获取键盘输入的字节流对象in
InputStream in =Stream.in;
/*2.用转换流将字节流对象转换为字符流对象,方便调用字符缓冲流的readeLine()方法*/
InputStreamReader isr =new InputStreamReader(in);
/*5.创建字符转换输出流对象osw,方便把输入的字符流转换为字节输出到本地文件。*/
OutputStreamWriter osw =new OutputStreamWriter(new
    FileOutputStream(new File("文件名")));

/*3.现在isr是字符流,可以作为参数传入字符缓冲流中*/
BufferedReader br =new BufferedReader(isr);

/*4.可以调用字符缓冲流br的readLine()方法度一行输入文本*/
String line =null;
while((line =br.readLine()){
    osw.write(line);//osw是字符流对象,可以直接操作字符串

}


注:InputStreamReader isr =new InputStreamReader(new "各种类型的字节输入流都行即是:后缀为InputStream就行");
OutputStreamWriter osw =new OutputStreamWriter(new
    "后缀为OutputStream就行");

六、区别记忆

1.对象流是可以读写几乎所有类型的只要是对象就行,而字节字符流,只能读写单个字节字符或者字节字符数组,以上没有读写字节字符数组的;注意对象流只有字节流!

2.字符和字节循环读入的结束条件int i=0; (i =fis.read())!=-1

用字符数组复制文件(fr 读入流 ,fw写出流),字节流也是相同的用法

 int i = 0;
  char[] c = new char[1024];
     while((i = fr.reade()) !=-1)){
         fw.write(c,0,i);
     }

3.对象流里面套缓冲流的情景:
new ObjectInputStream(new BufferedInputStream(new FileInputStream(new File(“文件路径”))));

4.记忆流及其功能的方法:
前缀表示功能,后缀表示流的类型;
比如说FileInputStream 前缀:File,表示操作的磁盘,后缀:intputstream,表示是字节输入流。
同理 FileReader:表示操作文件的字符流
ObjectInputStream :操作对象的字节输入流

5.拓展:获取键盘输入的字符的缓冲流的写法:
new BufferedReader(new InputStreamReader(System.in)));
将字节以字符形式输出到控制台的字符缓冲流的写法:
new BufferedWriter( new OutputStreamWriter(System.out))

本文摘抄于《AndroidIO流读写文件

 历史上的今天

  1. 2023: Android广播在子线程中运行(0条评论)
  2. 2022: [NDK开发]Android JNI开发之动态注册(0条评论)
  3. 2021: 哑孩子:第一次来到人间(0条评论)
版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

AS全工程搜索并替换字符串

1、Studio打开工程,选中要所有的项目。2、右键选择“Replace in Path..”3、搜索要替换的字符串,find 键 替换即可4、然后会弹出提示框提示替换多少。可自行选择注:如果替换的字符串过多,请记住备份工程文件,因为谁也说不准替换完了之后会出现什么错误,所以请谨慎...

JNI之对象数组使用

前言上一篇《JNI之数组简单操作》介绍的是jintArray的使用,今天就介绍对象数组。 jarray               (数组)   jobjectArray         (object数组)   jbooleanArray       (boolean数组) ...

乔叶:比明天年轻

常常听到有人叹息着说:“我比昨天又衰老了一天。”我想,他为什么不说自己还比明天年轻了一天呢?和许多人一样,小时候我一直想的是明天会比今天更接近长大,这多么好。现在我已经长大了,才知道长大并不仅仅是长大,同时也意味着衰老。然而知道了这个又有什么用呢?即使让我从小时候重新来过,我一样也得长大和衰老。但...

[摘]View的基础知识

前言这边文章总结得不错,对View的总结很到位。因此摘抄于此,方便自己学习。View的基础知识了解View,可以有效的使用ViewmTop mLeft mRight mBottomView的位置主要通过它的四个顶点来决定,对应View的四个属性。mTop 左上角纵坐标mLeft ...

史铁生:秋天的怀念

双腿瘫痪后,我的脾气变得暴怒无常。望着望着天上北归的雁阵,我会突然把面前的玻璃砸碎;听着听着收音机里甜美的歌声,我会猛地把手边的东西摔向四周的墙壁。这时,母亲就悄悄地躲出去,在我看不见的地方偷偷地注意着我的动静。当一切恢复沉寂,她又悄悄地进来,眼圈红红地看着我。“听说北海的花儿都开了,我推着你去走走...

王单单:在江边喝酒

古人说的话,我不信江水清不清,月亮都是白的 这样的夜晚,浪涛拍击被缚的旧船江风吹着渔火,晃荡如心事 这一次,兄弟我有言在先只许喝酒,不准流泪谁先喊出命中的疼,罚酒一杯 兄弟你应该知道,回不去了所有的老去都在一夜之间兄弟你只管喝,不言钱少酒家打烊...