Java IO流 详解(字节流、字符流、输入流、输出流、刷新)

您所在的位置:网站首页 java输入字母输出数字 Java IO流 详解(字节流、字符流、输入流、输出流、刷新)

Java IO流 详解(字节流、字符流、输入流、输出流、刷新)

#Java IO流 详解(字节流、字符流、输入流、输出流、刷新)| 来源: 网络整理| 查看: 265

一、IO流概述

          I:Input输入  从其他存储设备【读】数据到内存中  输入过程         O:OutPut输出  从内存中【写】数据到其他存储设备  输出过程

二、IO流分类         1.根据数据的类型分为:

                【字节流】和【字符流】

                【字节流】:以字节为基本单位,读写数据的流                             字节输入流:以字节为基本单位,读数据                             字节输出流:以字节为基本单位,写出数据                 【字符流】:以字符为基本单位,读写数据的流                             字符输入流:以字符为基本单位,读数据                             字符输出流:以字符为基本单位,写出数据

        2.根据数据的流向分为:

                【输入流】和【输出流】

                【输入流】:把数据从 其他存储设备 上【读取】到 内存 中的流                            字节输入流:以字节为基本单位,读数据                            字符输入流:以字符为基本单位,读数据                 【输出流】:把数据从 内存 中【写出】到 其他 存储 设备中的流                            字节输出流:以字节为基本单位,写出数据                            字符输出流:以字符为基本单位,写出数据

        3.IO流的顶层父类

                - 字节输入流:顶层父类:InputStream --> 抽象类   常见子类:FileInputStream                 - 字节输出流:顶层父类:OutputStream --> 抽象类   常见子类:FileOutputStream                 - 字符输入流:顶层父类:Reader --> 抽象类   常见子类:FileReader                 - 字符输出流:顶层父类:Writer --> 抽象类   常见子类:FileWriter

 

三、字节输出流OutPutStream

        OutputStream 输出流顶层父类             java.io.OutputStream抽象类是所有【字节输出流】的父类,用来【写】出字节输出流

            成员方法:

                - public void close():关闭次输出流并释放与此流相关联的任何系统资源                 - close方法,当完成流的操作时,必须调用此方法,释放系统资源,否则数据写入不完整或消失                 - public abstract void write(int b):将指定的字节写入输出流【一个字节一个字节写入到硬盘】                 - public void write(byte b[]):将 b.length字节从指定的字节数组写入到此输出流【以字节数组的形式写入到硬盘】                 - public void write(byte b[],int off, int len):将指定范围的字节数组的字节数据写到此输出流中【将字节数组中某一段字节数据写到硬盘】

           方法逐个演示:

                1.写出单个字节数据

// 1.创建字节输出流对象 路径文件必须真实存在 FileOutputStream fos1 = new FileOutputStream("day12_File类与递归&IO流&字符流&字节流\\resources\\a.txt"); // 2.写出 单个字节的数据 fos1.write(72); // 写入的一个字节数据,我们是往文本文档写入字节数据,但是因为是文本类型,需要将字节数据转换成文本数据,文本就是字符 fos1.write(105); fos1.write(33); // 3.关闭流,释放资源 fos1.close();

        (运行结束,会在对应的文件中生成对应的字节,代码中写入的数字为ASCII码,每个数字对应一个字母)

                 2.写出字节数组数据

//1.创建字节输出流对象 真实存在的路径 FileOutputStream fos1 = new FileOutputStream("day12_File类与递归&IO流&字符流&字节流\\resources\\a.txt"); // 2.创建字节数组 byte[] bytes = {97,98,99}; // 3.写出字节数组中的字节数据 fos1.write(bytes); // 4.关闭流,释放资源 fos1.close();

 (运行结束,会在对应的文件中生成对应的字节,代码中写入的数字为ASCII码,每个数字对应一个字母)

                3.写出指定范围字节数组的数据

// 1.创建字节输出流对象 真实存在的路径 FileOutputStream fos1 = new FileOutputStream("day12_File类与递归&IO流&字符流&字节流\\resources\\a.txt"); // 2.创建字节数组 byte[] bytes = {97,98,99}; // 3.写出字节数组中的字节数据 fos1.write(bytes,1,2); // 4.关闭流,释放资源 fos1.close();

 (运行结束,会在对应的文件中生成对应的字节,代码中写入的数字为ASCII码,每个数字对应一个字母)

                4.数组追加续写

// 1.创建字节输出流对象 真实存在的路径 FileOutputStream fos1 = new FileOutputStream("day12_File类与递归&IO流&字符流&字节流\\resources\\a.txt",true); // 2.创建字节数组 byte[] bytes = {97,98,99,100}; // 3.写出字节数组中的字节数据 fos1.write(bytes,1,2); // 4.关闭流,释放资源 fos1.close();

               

(这里续写是沿着第三个练习续写的,第三个练习写了 “bc”,这里也续写一个“bc”,不续写的话,同一个文件的数据会被覆盖)

        5.写出换行

/* * 需求: 写一首诗 * 鹅鹅鹅, * 曲项向天歌。 * 白毛浮绿水, * 红掌拨清波。 * */ // 1.创建字节输出流对象,关联到 day12\resources\a.txt 真实存在 FileOutputStream fos1 = new FileOutputStream("day12_File类与递归&IO流&字符流&字节流\\resources\\a.txt"); // 2.创建字节数组 byte[] bytes = {97,98,99,100}; // 3.写出字节数组中的字节数据 fos1.write("鹅鹅鹅,".getBytes()); fos1.write("\r\n".getBytes()); fos1.write("曲项向天歌。".getBytes()); fos1.write("\r\n".getBytes()); fos1.write("白毛浮绿水,".getBytes()); fos1.write("\r\n".getBytes()); fos1.write("红掌拨清波。".getBytes()); // 4.关闭流,释放资源 fos1.close();

四、字节输入流InputStream

        java.io.InputStream 抽象类,给类是所有字节输入流的父类,用于读取字节数据

        构造方法:

                概述:java.io.FileInputStream类是InputStream的实现子类,表示字节输入流,用于读取数据

                - public FileInputStream(String name):通过打开与实际文件的连接来创建一个字节输入流对象,该文件由文件系统的路径名 name命名                 - public FileInputStream(File file):通过打开与实际文件的连接来创建一个字节输入流对象,该文件由文件系统中的文件对象file命名

        成员方法:

                - public void close():关闭输入流并释放与此流相关的任何系统资源                 - public abstract int read():从输入流读取数据的下一个字节,每次读取一个字节                 - public int read(byte b[]):从输入流读取一些字节数据,并将它们存储到字节数住b中

        方法逐一演示:

                1.构造方法

// 创建字节输入流对象,关联数据源文件路径 真实存在的路径 FileInputStream fileInputStream1 = new FileInputStream("day12_File类与递归&IO流&字符流&字节流\\resources\\a.txt"); FileInputStream fileInputStream2 = new FileInputStream(new File("day12_File类与递归&IO流&字符流&字节流\\resources\\a.txt")); // 创建字节输入流对象,关联数据源文件路径 不存在的路径,会报异常:系统找不到指定的文件 FileInputStream fileInputStream3 = new FileInputStream("day12_File类与递归&IO流&字符流&字节流\\resources\\a1.txt");                 2.读取单个字节数据 // 创建字节输入流对象,关联数据源文件路径 真实存在的 FileInputStream fileInputStream1 = new FileInputStream("day12_File类与递归&IO流&字符流&字节流\\resources\\a.txt"); // 定义一个Int类型的变量,用来存储读取到的数据 int len; // 使用循环的方式读取数据 while ((len = fileInputStream1.read()) != -1){ // while循环中的条件,fis每读取一个字节,会优先复制给len变量,然后拿len变量与 -1 进行比较 System.out.print((char) len); } // 关闭流 fileInputStream1.close();         

        (输出语句中如果不加  char  强转字符的话,打印出来的就是ASCII码,需要强转成字符类型)

                3.读取字节数组长度的字节数据 public static void main (String[] args) throws IOException { // 创建字节输入流对象,关联数据源文件路径 真实存在的 FileInputStream fileInputStream1 = new FileInputStream("day12_File类与递归&IO流&字符流&字节流\\resources\\a.txt"); // 创建byte[] 数组,长度暂定为2,用来存储读取到的字节数据 byte[] bytes = new byte[8192]; // 定义一个int类型的变量,用来存储读取到的字节个数 int len; //while循环的方式来遍历读取本中的数据 while ((len = fileInputStream1.read(bytes)) != -1){ System.out.println(new String(bytes,0,len)); } // 关闭流 fileInputStream1.close(); /* * 使用数组读取的话,每次读取多个字节,减少系统之间的IO操作次数,从而提高了读写的效率,建议开发中如此使用 * */ }         

                (因为数组不能强转,所以用来String的一个方法用来打印数组)    

五、字节流操作文本文件可能存在的问题

          1.当使用字节流读取文本文档的时候,可能会有一些问题,遇到中文字符的时候,可能不会显示完整的字符           2.因为一个中文符可能占用多个字节存储,所以Java提供了字符流类,专门来操作文本文件,以字符为单位读写数据

六、字符输入流Reader

        java.io.Reader类:抽象类,表示用于读取字符流的所有类的超类,可以读取字符信息到内存中

        构造方法:

                概述:java.io.FileReade类,继承Reader类,表示字符输入流,用来读取字符数据对象

                 - public FileReader(String fileName):FileReader类对象,给定要读取的文件的名称                  - public FileReader(File file):FileReader类对象,给定要读取的file文件的名称

        成员方法:

                - public abstract void close():关闭此流并释放与此流相关的任何系统资源                 - public int read():从输入流读取一个字符,读取到末尾返回 -1                 - public int read(char cbuf[]):从输入流中读取一些数据,并将它们存储到字符数组cbuf中

         方法逐一演示:

                (字符的输入输出流   和   字节的输入输出流   一样的效果,有些地方就不加以赘述了)

                1.构造方法

// 文件真实存在 FileReader fr1 = new FileReader("day12_File类与递归&IO流&字符流&字节流\\resources\\a.txt"); // 文件不存在,会报出异常 FileReader fr2 = new FileReader("day12_File类与递归&IO流&字符流&字节流\\resources\\a.txt");

                2.读取单个字符数据

// 创建字符输入流对象 FileReader fr1 = new FileReader("day12_File类与递归&IO流&字符流&字节流\\resources\\a.txt"); int len; // 循环读取 while ((len = fr1.read()) != -1){ System.out.print((char) len); } //关闭 fr1.close();                3.读取字符的数组长度的字符数据 // 创建字符输入流对象 FileReader fr1 = new FileReader("day12_File类与递归&IO流&字符流和字节流\\resources\\a.txt"); int len;// 每次读取返回的字符数据 char[] chars = new char[1024]; // 循环读取 while( (len = fr1.read(chars)) != -1 ){ System.out.print(new String(chars,0,len)); } // 关闭流 fr1.close();

        

七、字符输出流Write

         java.io.Writer类,抽象类,用于表示字符输出流的所有类的超类,将指定的字符信息写出到目的地

        构造方法:

                概述:java.io.FileWriter类 是Writer的子类,表示字符输出流,可以用来写出字符数据

                - public FileWriter(String fileName)                 - public FileWriter(String fileName, boolean append)                 - public FileWriter(File file)                 - public FileWriter(File file, boolean append)

                注意:

                1.当你创建一个字符输出流对象时,必须传入一个文件路径                 2.前面2个构造方法,传入的路径,如果没有这个文件,会创建这个文件,如果文件里面有数据,数据会被清空                 3.后面2个构造方法,多了一个append的参数,true表示不清空,false默认清空

        成员方法:

                - public void write(int c)                 - public void write(char cbuf[])                 - public abstract void write(char cbuf[], int off, int len)                 - public void write(String str)                 - public void write(String str, int off, int len)                 - public abstract void flush()                 - public abstract void close()

        方法逐个演示:

                1.构造方法

FileWriter fw1 = new FileWriter("day12_File类与递归&IO流&字符流和字节流\\resources\\a.txt"); FileWriter fw2 = new FileWriter(new File("day12_File类与递归&IO流&字符流和字节流\\resources\\a.txt")); FileWriter fw3 = new FileWriter("day12_File类与递归&IO流&字符流和字节流\\resources\\a.txt",true); FileWriter fw4 = new FileWriter(new File("day12_File类与递归&IO流&字符流和字节流\\resources\\a.txt"),true);

               2.写出单个字符

// 第一步:创建字符输出流对象。关联目的地文件路径 FileWriter fw1 = new FileWriter(new File("day12_File类与递归&IO流&字符流&字节流\\resources\\b.txt")); // 第二步:写入单个字符 fw1.write(97); // 第三步:关闭流 fw1.close();

               

                3.写出字符串

// 第一步:创建字符输出流对象。关联目的地文件路径 FileWriter fw1 = new FileWriter("day12_File类与递归&IO流&字符流和字节流\\resources\\c.txt"); // 第二步:写出字符串 String str = "我今天心情真美丽\r\n嘿嘿哈哈"; fw1.write(str,3,5); // 第三步:关闭流 fw1.close();

         

                4.写出字符数组

// 第一步:创建字符输出流对象。关联目的地文件路径 FileWriter fw1 = new FileWriter("day12_File类与递归&IO流&字符流&字节流\\resources\\c.txt"); // 第二步:写出字符数组 char[] chars = {'我','是','一','个','伟','大','的','人'}; fw1.write(chars); // 第三步:关闭流 fw1.close();

         

 

八、流的关闭和刷新

        - public abstract void flush():刷新缓冲区,流对象可以继续使用         - public abstract void close():关闭流,释放系统资源,关闭流会顺带刷新缓冲区,关闭之后不可操作

// 第一步:创建字符输出流对象。关联目的地文件路径 FileWriter fw1 = new FileWriter("day12_File类与递归&IO流&字符流&字节流\\resources\\d.txt"); // 第二步:写出字符串 String str = "我今天心情真美丽"; fw1.write(str); fw1.write("\r\n"); fw1.write("这是第二行"); fw1.flush(); fw1.write("\r\n"); fw1.write("这是flush之后的数据"); //第三步:关闭流 fw1.close();

        

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3