一、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();

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

  1. java IO编程详解

    java IO编程详解 一.Socket 1. Sock概述 Socket,套接字就是两台主机之间逻辑连接的端点.TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP协议是应用层协议 ...

  2. IO流1(字节流+字符流+输入流+输出流+节点流+处理流)

    一(IO流简介) 大多数应用程序都需要实现与设备间的数据传输,如键盘输入数据.显示器显示程序运行的结果等.在Java中,将这种通过不同输入输出设备之间的数据传输抽象表述为"流",程 ...

  3. Java IO用法详解

    一.java io 概述 1.1 相关概念 Java IO Java IO即Java 输入输出系统.不管我们编写何种应用,都难免和各种输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,这 ...

  4. Java IO最详解

    初学java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见 ...

  5. Java IO操作详解

    在Java编程中,IO(输入输出)是重要的组成部分,Java应用常常需要从外界输入数据或者把数据输出到外界. Java IO的核心用一句话概括:抽象类或接口之中的抽象方法会根据实例化子类的不同,会完成 ...

  6. 【java IO序列化详解】

    唐门崛起 序列化 1.对象序列化和反序列化 2.JDK类库中的序列化API 3.为什么实现了Serializable接口,就可以被序列化 4.serialVersionUID 4.1 serialVe ...

  7. Java 常用IO流(字节流和字符流)详解

    一,简介及分类 IO流用来处理设备之间的数据传输:JAVA对数据的操作是通过流的方式:JAVA用于操作流的类都在IO包中 流按流向分为两种:输入流,输出流. 流按操作类型分为两种: 字节流 : 字节流 ...

  8. java io流详解_一文带你看懂JAVA IO流,史上最全面的IO教学啦

    一.IO流是什么 惯例引用百科的回答流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列.从流中取得数据的操作称为提取操作,而向流中添加数据的操作 ...

  9. Java 中IO流详解(附实例代码/面试题)

    Java I/O流详解 前言 一.I/O流是什么? 二.IO流分类: 1. 流程图: io流对象 2. io流的优缺点: 3. io 流Java中用途有哪些? 三.一些 io 实例 四.面试题: 前言 ...

  10. c++文件流读取一行_「软帝学院」Java挑战者专栏:IO流详解2

    软帝学院笔记Day18 IO流(字符流FileReader) 1.字符流是什么 字符流是可以直接读写字符的IO流 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符 ...

最新文章

  1. ftp 追加远程文件_ftp上传,完成ftp定时上传、下载只需3步
  2. Hadoop 学习笔记 (十一) MapReduce 求平均成绩
  3. 满园尽是503,记曾经的一次IIS 7性能考验
  4. linux系统管理常用命令
  5. 【Android应用保护技术探索之路系列】之一:Android应用保护技术开篇
  6. Vue之通过代理设置跨域访问
  7. leetcode 844. 比较含退格的字符串
  8. graphics 位深度_热门上海乐家人才公寓深度解析又是一个神
  9. Jenkins远程命令执行漏洞(CVE-2018-1000861复现)
  10. spark学习-34-Spark的BroadcastManager广播管理器
  11. tensorflow保存和恢复模型saver.restore
  12. 丝蛋白行业调研报告 - 市场现状分析与发展前景预测
  13. 2019年开发者必读!20位阿里技术大牛们帮你列了一份经典书单!...
  14. 苹果屏蔽更新描述文件_iOS屏蔽更新描述文件以及超级详细安装方法分享
  15. 苹果直营店_请谨慎选择百邦苹果售后维修,亲身体验,倒不如直接去直营店呢...
  16. 离散数学-7 二元关系
  17. 考过HCIP入职心仪公司,分享华为认证学习经历及心得
  18. git 常见问题汇总(更新中)
  19. .net 2.0 下的FTP搜索引擎实现
  20. IDEA安装MAVEN

热门文章

  1. Java编程(8)-数组波峰波谷
  2. 再见阳朔-记在2010圣诞
  3. 微信小程序使用高德地图Web服务爬取企业数据
  4. 基于Android的校园外卖系统app
  5. 五子棋对弈程序c语言,求大神说一下五子棋人机对弈的算法,最好有代码 良辰多谢了...
  6. sip网络电话代码含义
  7. 「镁客·请讲」观界科技刘天成:全景摄录产品一定会在B端爆发
  8. 用Unity实现LOL游戏中聊天对话框的功能
  9. wap.php,wap.php
  10. 使用sshj包报错“TransportException [HOST_KEY_NOT_VERIFIABLE] Could not verify `ssh-ed25519` host key”