Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 199|回复: 0

[默认分类] java中I/O流之字节流和字符流学习总结

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-5-17 11:25:26 | 显示全部楼层 |阅读模式

    一、基本内容

      如果要进行文件内容的操作那么必须依靠数据流完成,而数据流分为两种:   字节流:InputStream(字节输入流)、OutputStream(字节输出流);
      字符流:Reader(字符输入流)、Writer(字符输出流);
      
    字节流理解配图

    字符流理解配图

    字节流与字符流操作的本质区别只有一个:字节流是原生的操作,而字符流是经过处理后的操作。

      在进行网络数据传输、磁盘数据保存所保存所支持的数据类型只有:字节。
      而所有磁盘中的数据必须先读取到内存后才能进行操作,而内存中会帮助我们把字节变为字符。字符更加适合处理中文。
      
    不管使用的是字节流还是字符流,其基本的操作流程几乎是一样的,以文件操作为例。
      
      创建File类对象 ,主要是指明要操作的文件路径;
      根据字节流或字符流的子类实例化父类对象 ;
      进行数据的读取或写入操作;
      关闭流(close());
      
    对于IO操作属于资源处理,所有的资源处理操作(IO操作、数据库操作、网络)最后必须要进行关闭。


    二、字节输出流:(OutputStream)(重点)
      字节输出流主要以操作byte数据为主,观察java.io.OutputStream类的定义结构:
      
    1. public abstract class OutputStream implements Closeable, Flushable
    复制代码

      OutputStream类实现了Closeable,Flushable两个接口,这两个接口中的方法:
         1. Closeable:
    1. public void close() throws IOException;
    复制代码

         2. Flushable:
    1. public void flush() throws IOException;
    复制代码


    OutputStream类定义有三个重要的输出操作方法:
      1. 将给定的字节数组内容全部输出:
    1. public void write(byte b[]) throws IOException
    复制代码

      2. 将部分字节数组内容输出:
    1. public void write(byte b[], int off, int len) throws IOException
    复制代码
    (重点)
      3. 输出单个字节:
    1. public abstract void write(int b) throws IOException
    复制代码

    OutputStream是一个抽象类,按照抽象类的基本原则来讲,如果想要取得OutputStream类的实例化对象那么一定需要子类,如果要进行文件的操作,可以使用FileOutputStream类来处理,
    这个类的构造方法如下:
        1. 接收File类(覆盖):public FileOutputStream(File file) throws FileNotFoundException
        2. 接收File类(追加):public FileOutputStream(File file, boolean append)
    范例:实现文件的输出
    1. [code]package lisy;
    2. import java.awt.print.Printable;
    3. import java.io.File;
    4. import java.io.FileOutputStream;
    5. import java.io.IOException;
    6. import java.io.OutputStream;
    7. import java.math.BigDecimal;
    8. import java.math.RoundingMode;
    9. import java.sql.Date;
    10. import java.text.SimpleDateFormat;
    11. public class Demo {
    12.     public static void main(String[] args) throws IOException {
    13.         //第一步:定义要输出的文件的File类对象
    14.         File file = new File("e:"+File.separator+"hello"+File.separator+"my.txt");
    15.         //输出信息的时候文件可以不存在,但是目录必须存在
    16.         if(!file.getParentFile().exists()) {//父路径不存在
    17.             file.getParentFile().mkdirs();//创建父路径
    18.         }
    19.         //第二步:利用OutputStream的子类为父类进行实例化
    20.         OutputStream output = new FileOutputStream(file);
    21.         //第三步:输出文字信息
    22.         String msg = "富则达济天下,穷则独善其身";//字符串
    23.         //为了方便输出需要将字符串变为字节数组
    24.         byte data[] = msg.getBytes();//变为字节数组
    25.         output.write(data);//输出数据
    26.         output.close();//关闭流
    27.     }
    28. }
    复制代码
    [/code]
    输出文件的部分内容 (一个字符两个字节)
    1. [code]output.write(data,0,10);//输出部分数据
    复制代码
    [/code]
    使用循环方式进行单个字节的信息输出
    1. [code]for(int x = 0;x < data.length; x++) {
    2.         output.write(data[x]);//单个字节输出数据
    3.         }
    复制代码
    [/code]
    我们可以发现,每次执行完成之后所有的内容都被覆盖了。所以也可以进行数据的追加操作
    范例:追加数据
    1. [code]OutputStream output = new FileOutputStream(file,true);//此处为追加操作
    复制代码
    [/code]
    如果想要进行换行操作,则可以使用“\r\n”表示。
    1. [code]//第三步:输出文字信息
    2.         String msg = "富则达济天下,穷则独善其身。。。\r\n";//字符串
    复制代码
    [/code]
    三、字节输入流:(InputStream)(重点)
    InputStream可以实现数据的读取操作,在java中InputStream类的定义如下:
    1. [code]public abstract class InputStream implements Closeable
    复制代码
    [/code]
    InputStream类中定义有三个数据的读取操作方法:

      读取单个字节:
    1. public abstract int read() throws
    2. IOException;
    复制代码

      每次执行此方法将读取当个字节数据,如果已经读取完成了,那么最后返回-1。

      读取数据到字节数组中:
    1. public int read(byte b[]) throws IOException.最常用方法
    复制代码
      每次讲数据读取到数组之中,那么会返回一个读取长度的数据,如果没有数据则返回的长度为-1,可是要考虑两种情况:
        要读取的内容大于开辟的数组内容:长度就是整个数组的长度。
        要读取的内容小于开辟数组的内容,
    长度就是全部最后的内容长度,数组装不满。
      读取部分内容到字节数组中:
    1. public int read(byte b[], int off,int len) throws IOException
    复制代码
        每次读取内容到部分字节数组,只允许读取满限制的数组的字节个数。此方法依然会返回读取的长度。
      
    整个操作跟输出的形式几乎是相同的,参数的类型及作用也几乎是相同的。
    InputStream是一个抽象类,所以要进行文件的读取使用FileInputStream子类,子类定义的构造方法如下:

      构造方法:
    1. public FileInputStream(File file) throws FileNotFoundException.
    复制代码

      
    范例:实现数据的读取
    1. [code]package lisy;
    2. import java.awt.print.Printable;
    3. import java.io.File;
    4. import java.io.FileInputStream;
    5. import java.io.FileOutputStream;
    6. import java.io.IOException;
    7. import java.io.InputStream;
    8. import java.io.OutputStream;
    9. import java.math.BigDecimal;
    10. import java.math.RoundingMode;
    11. import java.sql.Date;
    12. import java.text.SimpleDateFormat;
    13. @SuppressWarnings("unused")
    14. public class Demo {
    15.     public static void main(String[] args) throws IOException {
    16.         //第一步:定义要输出的文件的File类对象
    17.         File file = new File("e:"+File.separator+"hello"+File.separator+"my.txt");
    18.         //第二步:实例化InputStream
    19.         InputStream input = new FileInputStream(file);
    20.         //实现数据的读取操作
    21.         byte data[] = new byte[1024];
    22.         int len = input.read(data);//将数据读取到数组之中
    23.         System.out.println("读取的内容【" +new String(data,0,len)+"】");
    24.         //第四步关闭输入流
    25.         input.close();
    26.     }
    27. }
    复制代码
    [/code]
    使用InputStream类中提供的一个read()方法,这个方法可以实现单个字节数据的读取操作。
    范例:读取单个字节
    1. [code]package lisy;
    2. import java.awt.print.Printable;
    3. import java.io.File;
    4. import java.io.FileInputStream;
    5. import java.io.FileOutputStream;
    6. import java.io.IOException;
    7. import java.io.InputStream;
    8. import java.io.OutputStream;
    9. import java.math.BigDecimal;
    10. import java.math.RoundingMode;
    11. import java.sql.Date;
    12. import java.text.SimpleDateFormat;
    13. import javax.swing.table.TableModel;
    14. @SuppressWarnings("unused")
    15. public class Demo {
    16.     public static void main(String[] args) throws IOException {
    17.         //第一步:定义要输出的文件的File类对象
    18.         File file = new File("e:"+File.separator+"hello"+File.separator+"my.txt");//你的路径
    19.         //第二步:实例化InputStream
    20.         InputStream input = new FileInputStream(file);
    21.         //实现数据的读取操作
    22.         byte data[] = new byte[1024];
    23.         int foot = 0;//控制保存的脚标索引
    24.         int temp = 0;//接收每次保存的字节数据
    25.         //while循环实际上按照由里向外的原则执行,它的执行分为两步:
    26.         //第一步:“temp = input.read()”,表示读取一个字节保存到temp变量之中。
    27.         //第二步:“(temp = input.read()) != -1”判断读取出来的temp内容是否为-1,
    28.         //如果不是-1则表示还有数据,则进行保存。
    29.         while((temp = input.read()) != -1);{
    30.             data[foot ++] = (byte) temp;
    31.         }
    32.         System.out.println("读取的内容【" +new String(data,0,foot)+"】");
    33.         //第四步关闭输入流
    34.         input.close();
    35.     }
    36. }
    复制代码
    [/code]
    四、字符输出流:(Writer)
    Writer是进行字符输出操作使用的类,这个类属于抽象类,观察定义:
    1. [code]public abstract class Writer implements Appendable, Closeable, Flushable
    复制代码
    [/code]
    这个Writer类可以直接输出字符串:
    1. public void write(String str) throws IOException
    复制代码

    Writer是一个抽象类,要进行文件字符流操作,其构造方法为:
    1. [code]public FileWriter(File file)。
    复制代码
    [/code]
    范例:使用Writer输出数据
    1. [code]package lisy;
    2. import java.awt.print.Printable;
    3. import java.io.File;
    4. import java.io.FileInputStream;
    5. import java.io.FileOutputStream;
    6. import java.io.FileWriter;
    7. import java.io.IOException;
    8. import java.io.InputStream;
    9. import java.io.OutputStream;
    10. import java.io.Writer;
    11. import java.math.BigDecimal;
    12. import java.math.RoundingMode;
    13. import java.sql.Date;
    14. import java.text.SimpleDateFormat;
    15. import javax.swing.table.TableModel;
    16. @SuppressWarnings("unused")
    17. public class Demo {
    18.     public static void main(String[] args) throws IOException {
    19.         //第一步:定义要输出的文件的File类对象
    20.         File file = new File("e:"+File.separator+"hello"+File.separator+"my.txt");//你的路径
    21.         if(!file.getParentFile().exists()) {
    22.             file.getParentFile().mkdirs();
    23.         }
    24.         Writer out = new FileWriter(file);
    25.         String str = "一定要好好学习,天天向上。。。";
    26.         out.write(str);
    27.         out.close();
    28.     }
    29. }
    复制代码
    [/code]

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-16 13:00 , Processed in 0.391083 second(s), 48 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表