一、数据流的基本概念

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

  在电脑上的数据有三种存储方式,一种是外存,一种是内存,一种是缓存。比如电脑上的硬盘,磁盘,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

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

举例2:字节输出流OutputStream

package com.hanqi.maya.util;
/**
* 输出流主要是用来把某个文件输出到指定位置上的
* 字节输出流OutputStream(抽象类,不能实例化)
* 文件输出流FileOutputStream(为了去实现抽象类OutputStream)
*
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; public class OutputStreamText {
public static void main(String[] args) {
File file = new File("D:\\0603.txt"); //原文件
File file_out = new File("E:\\汉企课程学习课件\\汉企二期课程JAVA学习课件\\0731 文件类 流\\abc.txt");//指定输出位置 try {
InputStream in = new FileInputStream(file);
OutputStream out = new FileOutputStream(file_out);
int a;
while((a = in.read()) != -1){
out.write(a); //这里注意与输入流的区别
}
in.close();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

  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()

举例:

package com.hanqi.maya.util;
/**
* 读取一个文件中的内容(文件中同时包括汉字,因为一个汉字占两个字节),用Reader、FileReader和BufferedReader
*
* Reader类是字符输入流的抽象类(抽象类,不能实例化)
* FileReader流顺序的读取文件,只要不关闭流,每次调用read()方法就顺序的读取源中其余的内容,直到源的末尾或流关闭。
*
* File file = new File("D:\\0603.txt");
* Reader r = new FileReader(file);
* 通过以上两部来实现Reader抽象类
*
* BufferedReader,带缓冲区的字符流,实际就是一个处理流
*/
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader; public class FileText {
public static void main(String[] args) {
File file = new File("D:\\0603.txt");
Reader r; //Reader类是字符输入流的抽象类
try {
r = new FileReader(file);
//FileReader流顺序的读取文件,只要不关闭流,每次调用read()方法就顺序的读取源中其余的内容,直到源的末尾或流关闭。
BufferedReader br = new BufferedReader(r);//BufferedReader,带缓冲区的字符流,实际就是一个处理流 String s;
while((s = br.readLine()) != null){
//br.readLine()方法:读取一个文本行,并将其返回为字符串;若无数据可读,则返回null。
System.out.println(s);
}
br.close(); }
catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }
}

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. shell 实现自动备份nginx下的站点

    shell 实现自动备份nginx下的站点 优点 实现自动备份ngnix下的所有运行的站点 自定义排除备份站点,支持三种排除 自动维护备份目录,防止备份目录无限扩大 备份压缩tar.gz格式 源码: ...

  2. RxJava Android(RxAndroid) 开发全家桶

    RxJava 在 Android 应用开发中越来越流行,但是由于其门槛稍高,初次使用不免遇到很多问题,例如在 RxJava 常见的错误用法 和 不该使用 RxJava 的一些情况 中所描述的情况.为了 ...

  3. 【魅族Pro7】——BootStrap/JQuery/Canvas/PHP/MySQL/Ajax爬坑之项目总结

    前言:这个项目是我们小组团体合作完成的学习项目,项目使用魅族GUI设计和图片素材,响应式重构Pro7官网的首页.子页.商城及购物车,并加入一些创新.我主要负责的是[画屏子页]的项目,这里作为温故知新, ...

  4. VS2010 + C#4.0使用 async + await

    方法一: 安装官方出的Microsoft.Bcl.Async包 最新发布日期为 2014/4/12,版本1.0.168 (不支持VS2010) 1.解决方案-右键-管理解决方案的NuGet程序包 2. ...

  5. json lib 2.4及其依赖包下载

    下载文件地址:https://files.cnblogs.com/files/xiandedanteng/json-lib-2.4%26dependencies_jars.rar 它包括 common ...

  6. mysqldumps 远程备份

    普通模式 mysqldump -uroot -ppassword -h10.26.114.25 -P3306 --databases databasename > XXX.sql 多条在一起模式 ...

  7. odoo图片显示

        如果在odoo客户端展示图片, 可以用 url( data:image/png;base64, 图片base64编码过的内容) 展示, 例如     url(data:image/png;ba ...

  8. 席位分配问题——惯例Q值法和d'hondt法的MATLAB程序

      本篇博文为追忆以前写过的算法系列第四篇 温故知新 本篇于2009年发表于百度博客,当时还没接触CSDN.所以是文学和技术博客混淆,只是这个程序博文訪问量突破2000,有不少网友评论互动.应该 ...

  9. UNP学习笔记(第六章 I/O复用)

    I/O模型 首先我们将查看UNIX下可用的5种I/O模型的基本区别: 1.阻塞式I/O 2.非阻塞式I/O 3.I/O复用(select和poll) 4.信号驱动式I/O(SIGIO) 5.异步I/O ...

  10. Session对象失效的客户端解决方法

    ASP(Active Server Pages)技术的Session对象用于存储用户在对话期间的私有信息.当前用户的Session对象中定义的变量和对象能在页面之间共享,但是不能为应用中其他用户所访问 ...