一、数据流的基本概念

  数据流是一串连续不断的数据的集合,就象水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流。数据写入程序可以是一段、一段地向数据流管道中写入数据,这些数据段会按先后顺序形成一个长的数据流。对数据读取程序来说,看不到数据流在写入时的分段情况,每次可以读取其中的任意长度的数据,但只能先读取前面的数据后,再读取后面的数据。不管写入时是将数据分多次写入,还是作为一个整体一次写入,读取时的效果都是完全一样的。

  在电脑上的数据有三种存储方式,一种是外存,一种是内存,一种是缓存。比如电脑上的硬盘,磁盘,U盘等都是外存,在电脑上有内存条,缓存是在CPU里面的。外存的存储量最大,其次是内存,最后是缓存,但是外存的数据的读取最慢,其次是内存,缓存最快。这里总结从外存读取数据到内存以及将数据从内存写到外存中。对于内存和外存的理解,我们可以简单的理解为容器,即外存是一个容器,内存又是另外一个容器。那又怎样把放在外存这个容器内的数据读取到内存这个容器以及怎么把内存这个容器里的数据存到外存中呢?

 java中将输入输出抽象称为流,就好像水管,将两个容器连接起来。将数据冲外存中读取到内存中的称为输入流,将数据从内存写入外存中的称为输出流。

流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。

二、流的分类

  按照数据流的方向分为:输入流(Input), 输出流(Output) 
    输入流: 从文件往程序走数据
    输出流: 从程序往文件走数据

  按照处理数据的单位不同:
    八大数据类型所占字节数:
      byte(1), short(2), int(4), long(8)
      float(4), double(8)
      boolean(1)
      char(2)

  字节流(以stream结尾的), 字符流(以Reader, Writer结尾的)
  字节流: 一个字节占8位, 以一个字节为单位读数据
  字符流: 一个字符占两个字节, 以一个字符为一个单位

  按照功能分:节点流, 处理流
  节点流: 只有一个根管道套在文件上进行传输
  处理流: 将节点流处理一下, 增强管道的功能, 相当于在管道上套一层

三、细说流

  JDK提供的流:提供了四个基本抽象类: InputStream, OutputStream, Reader, Writer

  InputStream的基本方法:
    int read(): 每次调用这个方法, 就读取一个字节, 以整数的形式返回
    int read(byte[] buffer---缓冲区): 让流每次读满一个缓冲区, 再统一处理, 先存在缓冲区里, 返回值int是返回实际当中读取了多少字节数(伤硬盘的原理)
    int read(byte[] buffer, int offset, int length): 也是一个缓冲区, 读取length长度的字节数, 存到buffer的缓冲区里, 从buffer的offset位置开始存, 返回值是实际读了多少字节数
    close(): 关闭资源

  OutputStream的基本方法:
    void write(int b)
    void write(byte[] b)
    int wirte(byte[] buffer, int offset, int length)
    close()
    flush(): 将缓冲区中的文件全部写出
    在使用流的时候的一个良好的习惯, 先flush, 再close

举例1:字节输入流InputStream

  1. package com.hanqi.maya.util;
  2. /**
  3. * 读取一个文件中的内容(文件中不包括汉字,因为一个汉字占两个字节),用InputStream和FileInputStream
  4. * 字节输入流InputStream(抽象类,不能实例化)
  5. * 文件输入流FileInputStream(为了去实现抽象类InputStream)
  6. *
  7. */
  8.  
  9. import java.io.File;
  10. import java.io.FileInputStream;
  11. import java.io.FileNotFoundException;
  12. import java.io.IOException;
  13. import java.io.InputStream;
  14.  
  15. public class InputStreamText {
  16.  
  17. public static void main(String[] args) {
  18. File file = new File("D:\\0603.txt");
  19. try {
  20. InputStream in = new FileInputStream(file); //InputStream类是字节输入流的抽象类,抽象类不能实例化;这里用多态来实现
  21.  
  22. int a ; //因为in.read()的返回值为0~255范围内的int字节值,所以这里定义一个整型变量a
  23.  
  24. //in.read()为从输入流中读取数据的下一个字节,判断是否到结尾,如果没有,依次输出;如果因为已经到达流末尾而没有可用的字节,则返回值-1
  25. while((a = in.read()) != -1){
  26. System.out.print((char)a); //(char)a,这里强转,把整型变量a强转为 字符变量
  27. }
  28.  
  29. in.close(); //记着流需要关闭
  30.  
  31. } catch (FileNotFoundException e) {
  32. e.printStackTrace();
  33. } catch (IOException e) {
  34. e.printStackTrace();
  35. }
  36. }
  37.  
  38. }

举例2:字节输出流OutputStream

  1. package com.hanqi.maya.util;
  2. /**
  3. * 输出流主要是用来把某个文件输出到指定位置上的
  4. * 字节输出流OutputStream(抽象类,不能实例化)
  5. * 文件输出流FileOutputStream(为了去实现抽象类OutputStream)
  6. *
  7. */
  8. import java.io.File;
  9. import java.io.FileInputStream;
  10. import java.io.FileNotFoundException;
  11. import java.io.FileOutputStream;
  12. import java.io.IOException;
  13. import java.io.InputStream;
  14. import java.io.OutputStream;
  15.  
  16. public class OutputStreamText {
  17. public static void main(String[] args) {
  18. File file = new File("D:\\0603.txt"); //原文件
  19. File file_out = new File("E:\\汉企课程学习课件\\汉企二期课程JAVA学习课件\\0731 文件类 流\\abc.txt");//指定输出位置
  20.  
  21. try {
  22. InputStream in = new FileInputStream(file);
  23. OutputStream out = new FileOutputStream(file_out);
  24. int a;
  25. while((a = in.read()) != -1){
  26. out.write(a); //这里注意与输入流的区别
  27. }
  28. in.close();
  29. out.close();
  30. } catch (FileNotFoundException e) {
  31. e.printStackTrace();
  32. } catch (IOException e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. }

  Reader的基本方法:
    int read()
    int read(char[] c)
    int read(char[] c, int offset, int length)
    close()

  Writer的基本方法:
    void write()
    void write(char[] c)
    void write(char[] c, int offset, int length)
    void write(String s)
    void write(String s, int offset, int length)
    close()
    flush()

举例:

  1. package com.hanqi.maya.util;
  2. /**
  3. * 读取一个文件中的内容(文件中同时包括汉字,因为一个汉字占两个字节),用Reader、FileReader和BufferedReader
  4. *
  5. * Reader类是字符输入流的抽象类(抽象类,不能实例化)
  6. * FileReader流顺序的读取文件,只要不关闭流,每次调用read()方法就顺序的读取源中其余的内容,直到源的末尾或流关闭。
  7. *
  8. * File file = new File("D:\\0603.txt");
  9. * Reader r = new FileReader(file);
  10. * 通过以上两部来实现Reader抽象类
  11. *
  12. * BufferedReader,带缓冲区的字符流,实际就是一个处理流
  13. */
  14. import java.io.BufferedReader;
  15. import java.io.File;
  16. import java.io.FileNotFoundException;
  17. import java.io.FileReader;
  18. import java.io.IOException;
  19. import java.io.Reader;
  20.  
  21. public class FileText {
  22. public static void main(String[] args) {
  23. File file = new File("D:\\0603.txt");
  24. Reader r; //Reader类是字符输入流的抽象类
  25. try {
  26. r = new FileReader(file);
  27. //FileReader流顺序的读取文件,只要不关闭流,每次调用read()方法就顺序的读取源中其余的内容,直到源的末尾或流关闭。
  28. BufferedReader br = new BufferedReader(r);//BufferedReader,带缓冲区的字符流,实际就是一个处理流
  29.  
  30. String s;
  31. while((s = br.readLine()) != null){
  32. //br.readLine()方法:读取一个文本行,并将其返回为字符串;若无数据可读,则返回null。
  33. System.out.println(s);
  34. }
  35. br.close();
  36.  
  37. }
  38. catch (FileNotFoundException e) {
  39. e.printStackTrace();
  40. } catch (IOException e) {
  41. e.printStackTrace();
  42. }
  43.  
  44. }
  45. }

Java基础之I/O流的更多相关文章

  1. Java基础系列8——IO流超详细总结

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 在初学Java时,I ...

  2. Java基础之详谈IO流

    Java基础知识.IO流详细讲解.你所要的IO这里都有

  3. java基础11(IO流)-字符流

    转换流 由于字节流操作中文不是特别方便,所以java中提供了转换流 编码表:由现实世界的字符和对应的数值组成的一张表 编码:把看得懂的变成看不懂的(String-------byte[]) 解码:把看 ...

  4. Java基础教程:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...

  5. Java基础---IO(一)---IO流概述、字符流、字节流、流操作规律

    第一讲     IO概述 概述 1.IO流:即InputOutput的缩写. 2.特点: 1)IO流用来处理设备间的数据传输. 2)Java对数据的操作是通过流的方式. 3)Java用于操作流的对象都 ...

  6. java基础之-I/O流和File类解析

    在日常的java开发中少不了文件的读取和 写入,这就涉及到文件的I/O操作,今天就来总结下文件的IO操作,顺便文件的IO操作也需要File了的帮助,所以一起总结了. 以下图片为我根据其他博客所总结的内 ...

  7. java基础10(IO流)-字节流

    IO流 输入与输出[参照物是程序] 如果从键盘.文件.网络甚至是另一个进程(程序或系统)将数据读入到程序或系统中,称为输入 如果是将程序或系统中的数据写到屏幕.硬件上的文件.网络上的另一端或者是一个进 ...

  8. JAVA基础篇—文件与流

    处理字节流的抽象类 InputStream 是字节输入流的所有类的超类,一般我们使用它的子类,如FileInputStream等. OutputStream是字节输出流的所有类的超类,一般我们使用它的 ...

  9. Java基础12一IO流

    1.IO流的原理 利用数据通道实现程序和数据源之间数据的的读写操作.  2.IO流分类 输入流.输出流.字节流.字符流.节点流.过滤流  3.InputStream 字节输入流 实现类FileInpu ...

随机推荐

  1. 最新Webstrom, Idea 2019.1.3 的激活

    1.注册码激活 打开网址(IntelliJ IDEA 注册码),我们能看到下面的界面,直接点击获取激活码,将生成的激活码粘贴到WebStorm激活对话框中的Lisence Code输入框,点击OK即可 ...

  2. 3 Suggested Oracle Certifications For Oracle Form's Developers

    The following are the most suggested Oracle Certifications for Oracle Application Developers in Form ...

  3. C# 格式化 中文星期 显示

    最近有些小忙,直接贴代码吧, /// <summary> /// 获取系统的星期 /// </summary> /// <param name="dt" ...

  4. MySQL中批量删除指定前缀表的sql语句

    有时候我们在安装一些cms的时候,这些cms都是带表前缀的方便区分数据,但有时候我们测试完需要删除的时候又有别的前缀表就可以参考下面的方法 代码如下:Select CONCAT( 'drop tabl ...

  5. ubuntu 添加用户

    sudo useradd 用户名 创建用户 sudo passwd 用户名 修改用户密码 添加sudo权限 sudo usermod -aG sudo(要添加的用户组,也可以是root) 用户名 su ...

  6. eclipse离线安装插件过程

    离线安装插件: 1. help -> install New Softe.. 2. 打开安装插件界面 最后点击,next, 同意事项,重启eclipse.

  7. 收藏以下linux查看系统信息的命令

    # uname -a               # 查看内核/操作系统/CPU信息# head -n 1 /etc/issue   # 查看操作系统版本# hostname              ...

  8. 模拟利器Mockito

    16.3.1  模拟测试概述 目前支持Java语言的Mock测试工具有EasyMock.JMock.Mockito.MockCreator.Mockrunner.MockMaker等,Mockito是 ...

  9. leetcode 46-Permutations and 47-Permutations II

    Permutations Given a collection of numbers, return all possible permutations. For example, [1,2,3] h ...

  10. 【LeetCode】Partition List ——链表排序问题

    [题目] Given a linked list and a value x, partition it such that all nodes less than x come before nod ...