一、数据流的基本概念

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

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

    Apr 13, 2017 Stop me if you’ve heard this one before. You are working on a messaging middleware, a g ...

  2. iOS升级经验分享

    作者认为,及时关注.快速反应.覆盖测试是面对iOS系统升级时最重要的三大原则,文中还详细分析了iCloud Storage和Automatic Reference Counting这两大iOS 5新特 ...

  3. 蒙特卡洛法MATLAB

    %%unifrnd函数的使用 %unifrnd函数可以创建随机的连续均匀分布的数组,一般式为R=unifrnd(A,B); %A和B是标量或者相同维数的行向量或者列向量.R=unifrnd(A,B,[ ...

  4. linux系统故障分析与排查

    在处理Linux系统出现的各种故障时,故障的症状是最先发现的,而导致这以故障的原因才是最终排除故障的关键.熟悉Linux系统的日志管理,了解常见故障的分析与解决办法,将有助于管理员快速定位故障点.“对 ...

  5. Win7如何自定义鼠标右键菜单 添加用记事本打开

    鼠标右键用记事本打开.reg Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\Notepad] @="用记事本 ...

  6. jquery:选择器 过滤器

    容易理解错误的地方: 1.假如我们想要让一个表格中第八列的所有单元格,都隐藏起来.我们可能会这么写$("table tr td:eq(8)").css("display& ...

  7. [魅族Degao]Androidclient性能优化

    本文由魅族科技有限公司资深Android开发project师degao(嵌入式企鹅圈原创团队成员)撰写,是degao在嵌入式企鹅圈发表的第一篇原创文章,毫无保留地总结分享其在领导魅族多个项目开发中的A ...

  8. IE67实现inline-block布局

    inline-block可以定义元素为行内块级元素,即既具有行内元素同占一行的特点,又具有块级元素的box模型.但是IE67和其他浏览器的支持差别比较大: 1.行内元素使用inline-block变成 ...

  9. Robot framework 引入 Selenium2Library 类库:

    在用robotframework-selenium2library做web自动化测试时候,首先要将Selenium2Library导入到Test Suite中,在导入Selenium2Library时 ...

  10. eeplat开发平台概念理解

    近期在学习eeplat的开发.发现其中有非常多概念实在让人easy忘记,所以谨以此文记录一笔. eeplat的开发文档里说eeplat是元数据驱动的,这个元数据什么意思.在我理解就是后台的数据库里面的 ...