在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。

流的分类

①   流按其流向分为“输入流”和“输出流”。

②   流按数据传输单位分为“字节流”和“字符流”。

  a) “字节流”用来读写8位二进制的字节。

  b)“字符流”用来读写16位二进制字符。

③   流按功能分为“节点流”和“过滤流”。

  a) “节点流”用于直接操作目标设备的流。例如:磁盘或一块内存区域。

  b) “过滤流”是对一个已存在的流的链接和封装,通过对数据进行处理为程序提供功能强大、灵活的读写功能。

一、字节流

1、字节输出流OutputStream

OutputStream此抽象类,是表示输出字节流的所有类的超类。操作的数据都是字节,定义了输出字节流的基本共性功能方法。

输出流中定义都是写write方法:

write(byte[] b,int off,int len)方法,b表示要写入的字符数组,off表示开始写入的数组下标,len表示写入长度

1.1、FileOutputStream类、文件输出流

FileOutputStream是OutputStream的子类,可用来写入数据到文件。

构造方法:

可直接创建一个File类,也可创建String字符串,文件路径

例:

  1. //需求:将数据写入到文件中。
  2. public static void main(String[] args) throws IOException {
  3. //创建存储数据的文件。
  4. File file = new File("c:\\file.txt");
  5. //创建一个用于操作文件的字节输出流对象。一创建就必须明确数据存储目的地。
  6. //输出流目的是文件,文件不存在,会自动创建。如果文件存在,则覆盖。
  7. FileOutputStream fos = new FileOutputStream(file);
  8.  //填入字符串地址
  9.  //FileOutputStream fos = new FileOutputStream("c:\\file.txt");
  10. //调用父类中的write方法。
  11. //字符串String 的getBytes()方法,将字符串转换成字符数组
  12. byte[] data = "abcde".getBytes();
  13. fos.write(data);
  14. //关闭流资源。
  15. fos.close();
  16. }

1.2、给文件中续写和换行

当我们直接new FileOutputStream(file)这样创建对象,写入数据时,会覆盖原有的文件,

如果我们只想在原有文件中续写呢?

FileOutputStream的另一构造方法:

在创建对象时,在后面加一个布尔值append,当为true时,会在文件末尾继续添加

 换行符:"\r\n"

在要写入的字符串前后加入换行符,文件内会换行

例:

  1. public static void main(String[] args) throws Exception {
  2. //明确目标文件
  3. File file = new File("c:\\file.txt");
  4. FileOutputStream fos = new FileOutputStream(file, true);
  5. //在"aaa"前添加换行符
  6. String str = "\r\n"+"aaa";
  7. fos.write(str.getBytes());
  8. //关闭资源流
  9. fos.close();
  10. }

1.3、IO的异常处理

在实际开发中,io异常的处理

  1. public class IODemo {
  2. public static void main(String[] args) {
  3. FileOutputStream fos=null;
  4. try{
  5. //明确目标文件
  6. fos=new FileOutputStream("e:\\test\\demo.txt");
  7. //写入字符
  8. fos.write(100);
  9. }catch(IOException ex){
  10. ex.printStackTrace();
  11. throw new RuntimeException("文件写入失败");
  12.  
  13. }finally{
  14. //关闭资源,全部放在finally中
  15. try {
  16. if(fos!=null)
  17. //关闭资源流异常处理
  18. fos.close();
  19. } catch (IOException e) {
  20. e.printStackTrace();
  21. throw new RuntimeException("文件写入失败");
  22. }
  23. }
  24. }
  25. }

2、字节输入流 InputStream

InputStream此抽象类,是表示字节输入流的所有类的超类。,定义了字节输入流的基本共性功能方法。

定义了字节输入流的基本共性功能方法。

read():读取一个字节并返回,没有字节返回-1.

read(byte[]): 读取一定量的字节数,并存储到字节数组中,返回读取到的字节数。

2.1 、FileInputStream类

FileInputStream是InputStream的子类,可用来读取文件内容。

其构造方法:

2.2、FileInputStream类读取数据read方法

在读取文件中的数据时,调用read方法,实现从文件中读取数据

例:

  1. public static void main(String[] args) throws IOException {
  2.   //明确读取文件
  3.   //创建一个字节输入流对象,必须明确数据源,其实就是创建字节读取流和数据源相关联。
  4.  
  5.   FileInputStream fis=new FileInputStream("e:\\test\\test.txt");
  6.   //读取数据。使用 read();一次读一个字节。
  7.   /*int a=fis.read();
  8.   //(char),强制转换为字符类型
  9.   //不转换类型,输出为int类型,ASCii表
  10.   System.out.println((char)a);
  11.    int b=fis.read();
  12.   System.out.println((char)b);
  13.    int c=fis.read();
  14.   System.out.println((char)c);
  15.    int d=fis.read();
  16.   System.out.println((char)d);
  17.   int e=fis.read();
  18.   System.out.println((char)e);
  19.   int f=fis.read();
  20.   System.out.println((char)f); System.out.println(a+b+c+d+e+f);*/
  21.    int len=0;
  22.   //循环读取,读取前判断fis.read()是否为-1
  23.   while((len=fis.read())!=-1){
       System.out.println((char)len);
      }
      fis.close();
    }

2.3读取数据 read( byte [ ] ) 方法

在读取文件中的数据时,调用read方法,每次只能读取一个,太麻烦了,于是我们可以定义数组作为临时的存储容器,这时可以调用重载的read方法,一次可以读取多个字符。

一般定义数组的长度为1024的倍数

  1. public static void main(String[] args) throws IOException
  2. /*
  3. * 演示第二个读取方法, read(byte[]);
  4. */
  5. File file = new File("c:\\file.txt");
  6. // 创建一个字节输入流对象,必须明确数据源,其实就是创建字节读取流和数据源相关联。
  7. FileInputStream fis = new FileInputStream(file);
  8. //创建一个字节数组。
  9. byte[] buf = new byte[1024];//长度可以定义成1024的整数倍。
  10. int len = 0;
  11. while((len=fis.read(buf))!=-1){
  12. System.out.println(new String(buf,0,len));
  13. }
  14. fis.close();
  15. }

2.4字节流练习

需求:复制文件

原理;读取一个已有的数据,并将这些读到的数据写入到另一个文件中。

  1. public static void main(String[] args) throws IOException {
  2. //明确数据源
  3. FileInputStream fis=new FileInputStream("e:\\sqlyog_x64.zip");
  4. //明确目的地
  5. FileOutputStream fos=new FileOutputStream("e:\\test\\sqlyog_x64.zip");
  6. //复制
  7. int len=0;
  8. while((len=fis.read())!=-1){
  9. //写入目标文件
  10. fos.write(len);
  11. }
  12. //释放资源
  13. fis.close();
  14. fos.close();
  15. }

二、字符流

字节流可以针对英文、数字进行读写操作,当我们操作的文件中有中文字符时,就需要用到字符流。

1、用字节流处理字符的问题

  1. public static void main(String[] args) throws IOException {
  2. //给文件中写中文
  3. writeCNText();
  4. //读取文件中的中文
  5. readCNText();
  6. }
  7. //写中文
  8. public static void writeCNText() throws IOException {
  9. FileOutputStream fos = new FileOutputStream("c:\\cn.txt");
  10. //写入中文字符
  11. fos.write("欢迎你".getBytes());
  12. fos.close();
  13. }
  14. //读取中文
  15. public static void readCNText() throws IOException {
  16. FileInputStream fis = new FileInputStream("c:\\cn.txt");
  17. int ch = 0;
  18. //读取中文字符
  19. while((ch = fis.read())!=-1){
  20. System.out.println(ch);
  21. }
  22. }

利用字节流操作复制文件后,得到的文件中并没有具体文字,看到的只是数字。

 2、字符编码表

计算机中储存的信息都是用二进制数表示的;而我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。

编码表:其实就是生活中字符和计算机二进制的对应关系表。

3、 字符输入流Reader

读取字符流的抽象超类。用法类似字节流的字节输入流 InputStream

read():读取单个字符并返回int,结束后返回-1

read(char[]):将数据读取到数组中,并返回读取的个数。

 3.1 FileReader类

用来读取字符文件的便捷类。

构造方法

4 字符输出流Writer

Writer是写入字符流的抽象类,用法类似字节流的字节输出流 OutputStream

4.1 FileWriter类

用来写入字符文件的便捷类

构造方法:

5、字符流练习

需求:复制文本文件。

  1. public static void main(String[] args) throws IOException {
  2. copyTextFile();
  3. }
  4. public static void copyTextFile() throws IOException {
  5. //1,明确源和目的。
  6. FileReader fr = new FileReader("c:\\cn.txt");
  7. FileWriter fw = new FileWriter("c:\\copy.txt");
  8. //2,为了提高效率。自定义缓冲区数组。字符数组。
  9. char[] buf = new char[1024];
  10. int len = 0;
  11. while((len=fr.read(buf))!=-1){
  12. fw.write(buf,0,len);
  13. }
  14. /*2,循环读写操作。效率低。
  15. int ch = 0;
  16. while((ch=fr.read())!=-1){
  17. fw.write(ch);
  18. }
  19. */
  20. //3,关闭资源。
  21. fw.close();
  22. fr.close();
  23. }

6、 flush()和close()的区别?

在执行完读取写入操作后,字符并没有马上存入目标文档,字符内容暂存在缓存区,需要用flush(),刷新一下,刷新后,流还可以继续使用。

close():关闭资源,但在关闭前会将缓冲区中的数据先刷新到目的地,否则丢失数据,然后在关闭流。流不可以使用。

如果写入数据多,一定要一边写一边刷新,最后一次可以不刷新,由close完成刷新并关闭。

IO流——字节流、字符流的更多相关文章

  1. IO流(字节流,字符流,缓冲流)

    一:IO流的分类(组织架构) 根据处理数据类型的不同分为:字节流和字符流 根据数据流向不同分为:输入流和输出流   这么庞大的体系里面,常用的就那么几个,我们把它们抽取出来,如下图:   二:字符字节 ...

  2. IO 复习字节流字符流拷贝文件

    /* 本地文件 URL 文件拷贝 *//*文本文件拷贝 可以通过 字符流,也可以通过字节流*/ /*二进制文件拷贝 只可以通过字节流*//* 希望这个例子能帮助搞懂 字符流与字节流的区别 */ imp ...

  3. Java之IO流(字节流,字符流)

    IO流和Properties IO流 IO流是指计算机与外部世界或者一个程序与计算机的其余部分的之间的接口.它对于任何计算机系统都非常关键, 因而所有 I/O 的主体实际上是内置在操作系统中的.单独的 ...

  4. IO—》字节流&字符流

    字节流 一.字节输出流OutputStream OutputStream此抽象类,是表示输出字节流的所有类的超类.操作的数据都是字节,定义了输出字节流的基本共性功能方法. FileOutputStre ...

  5. java 输入输出IO流 字节流| 字符流 的缓冲流:BufferedInputStream;BufferedOutputStream;BufferedReader(Reader in);BufferedWriter(Writer out)

    什么是缓冲流: 缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率. 图解: 1.字节缓冲流BufferedInputStr ...

  6. -1-4 java io java流 常用流 分类 File类 文件 字节流 字符流 缓冲流 内存操作流 合并序列流

      File类 •文件和目录路径名的抽象表示形式 构造方法 •public File(String pathname) •public File(String parent,Stringchild) ...

  7. java IO流 之 字符流

    字符是我们能读懂的一些文字和符号,但在计算机中存储的却是我们看不懂的byte 字节,那这就存在关于字符编码解码的问题.所以在学习Io流的字符流前我们先了解些关于编码问题. 一.字符集与字符编码 1.什 ...

  8. java io流(字符流) 文件打开、读取文件、关闭文件

    java io流(字符流) 文件打开 读取文件 关闭文件 //打开文件 //读取文件内容 //关闭文件 import java.io.*; public class Index{ public sta ...

  9. io系列之字符流

    java中io流系统庞大,知识点众多,作为小白通过五天的视频书籍学习后,总结了io系列的随笔,以便将来复习查看. 本篇为此系列随笔的第一篇:io系列之字符流. IO流 :对数据的传输流向进行操作,ja ...

  10. JAVA之IO流(字符流)

    字符流InputStreamReader和OutputStreamWriter是Writer和Read的子类:是字节流通向字符流的桥梁,也就是可以把字节流转化为字符流. InputStreamRead ...

随机推荐

  1. EFCore-一对一配置外键小记2

    前后两次遇到这样的错误: The property 'xx' on entity type 'xxxx' has a temporary value. Either set a permanent v ...

  2. EntityFramework Core 迁移忽略主外键关系

    前言 本文来源于一位公众号童鞋私信我的问题,在我若加思索后给出了其中一种方案,在此之前我也思考过这个问题,借此机会我稍微看了下,目前能够想到的也只是本文所述方案. 为何要忽略主外键关系 我们不仅疑惑为 ...

  3. 支持十万并发的黑科技-NIO

    今天是猿灯塔“365天原创计划”第3天. 今天讲: 支持十万并发的黑科技-NIO 翻译过来就是:Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC(一种远程调用) 分布式服务框架(SOA),致 ...

  4. 每日一题 - 剑指 Offer 32 - II. 从上到下打印二叉树 II

    题目信息 时间: 2019-06-25 题目链接:Leetcode tag: 队列 BFS 难易程度:简单 题目描述: 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行. 示 ...

  5. 组合 a 标签与 canvas 实现图片资源的安全下载的方法与技巧

    普通用户下载图片时只需一个「右键另存为」操作即可完成,但当我们做在线编辑器.整个 UI 都被自定义实现时,如何解决不同域问题并实现页面中图片资源的安全下载呢?本文就解决该问题过程中所涉及的正则表达式. ...

  6. Java基础笔记01-02-03-04

    一.今日内容介绍 1.Java开发环境搭建 2.HelloWorld案例 3.注释.关键字.标识符 4.数据(数据类型.常量) 01java语言概述 * A: java语言概述 * a: Java是s ...

  7. Bash的特性

    Bash的特性 1. tab补全 #命令补全 [root@clf ~]# user  #命令补全useradd     userdel     usermod     usernetctl  user ...

  8. Jenkins 自动化(CI/DI)部署

    1. 背景介绍 在实际开发中,经常要一边开发一边测试,经常为了一个功能而不断更新版本,这些情况都会涉及到频繁的打包.部署:手动打包的涉及到项目上传.打包.发布等很多重复工作: 那么,有一种工具能够实现 ...

  9. [JAVA]《JAVA开发手册》规约详解

    [强制] 使用 Map 的方法 keySet()/values()/entrySet()返回集合对象时,不可以对其进行添加元素操作,否则会抛出 UnsupportedOperationExceptio ...

  10. 真懂Spring的@Configuration配置类?你可能自我感觉太良好

    当大潮退去,才知道谁在裸泳.关注公众号[BAT的乌托邦]开启专栏式学习,拒绝浅尝辄止.本文 https://www.yourbatman.cn 已收录,里面一并有Spring技术栈.MyBatis.中 ...