流是一组有顺序的,有起点和终点的字节集合,是对传输数据的总称或抽象。即数据在两设备间的传输称为流,流的本质是传输数据,依据传输数据特性将流抽象为各种类,方便更直观的进行数据操作。

流的分类:

数据类型:字节流、字符流

数据方向:输入流、输出流

数据功能:节点流、处理流

流的四个抽象类:

J2SDK所提供的全部流类型位于包java.io内部,分别继承自一下四种抽象流类型。

InputStream 、OutputStream、Reader、Writer

当中InputStream和OutputStream是字节流,处理的时候是通过输入或输出字节形式的;Reader和Writer是通过字符来处理的,读取或写入每一个字符。在java中输入输出写入读取是从程序的方向上去辨别的。

那么什么是节点流和处理流呢?

节点流:从一个特定的数据源读写数据,这个数据源能够使文件、内存等。

处理流:是连接在已经存在的流(节点流或者处理流)之上,通过对数据的处理为程序提供更加强大的读写功能。

举个样例:比方说我们从某个文件里读取数据我们把这个文件当做一个大桶,我们如今用个管道直接连接在这个大桶上进行抽水此时这根管道就是节点流;当我们感觉这个管道不够我们抽水用的了,我们在其外面套上一个大的抽水管道,此时这个大的管道就相当于处理流。

InputStream和OutputStream

 

Reader和Writer

实例一:

以以下两个实例来分析这四个抽象类。

用FileInputStream与FileOutputStream,能够拷贝文件,即它会先从来源文件b.txt读取数据至一个byte数组中,然后再将byte数组的数据写入目的文件a.txt。

先在D盘根文件夹下建立两个a.txt和b.txt,在b.txt中写入“Java学习之旅!!!”,然后建立程序:

import java.io.*;
public class Demo {
public static void main(String[] args) {
try {
// 来源文件
FileInputStream in = new FileInputStream("D:/b.txt");
// 目的文件
FileOutputStream out = new FileOutputStream("D:/a.txt");
byte[] bytearray = new byte[1024];
do {
in.read(bytearray, 0, 1024);
out.write(bytearray);
} while (in.available() > 0);
in.close();
out.close();
} catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

执行此程序后,打开a.txt,你会发现a.txt同b.txt一样。

程序中示范了两个read()方法,一个方法能够读入指定长度的数据至数组,还有一个方法一次能够读入一个字节.每次读取之后,读取的光标都会往前进,假设读不到数据刚返回-1.使用available()方法能够获得还有多少字节能够读取。

  在不使用文件流时,记得使用close()方法自行关闭流,以释放与流相依的系统资源。

  FileOutputStream默认会以新建文件的方式来开启流。假设指定的目标文件名已经存在,则会被覆盖目标文件,即此时的a.txt。

  FileInputStream读取文件时,假设此时源文件不存在,则会提示文件不存在,即提示b.txt不存在。

实例二:

实现效果与上例同样

IO流中的BufferedInputStream与BufferedOutputStream能够为InputStream、OutputStream类的对象添加缓冲区功能,构建BufferedInputStream实例时,须要给定一个InputStream类型的实例,实现BufferedInputStream时,实际上最后是实现InputStream实例。相同地,在构建BufferedOutputStream时,也须要给定一个OutputStream实例,实现BufferedOutputStream时,实际上最后是实现OutputStream实例。

import java.io.*;
public class Demo1 {
public static void main(String[] args) {
try {
// 来源文件
FileInputStream in = new FileInputStream("D:/b.txt");
// 目的文件
FileOutputStream out = new FileOutputStream("D:/a.txt");
BufferedInputStream bufferedIn = new BufferedInputStream(in);
BufferedOutputStream bufferedOut = new BufferedOutputStream(out);
byte[] data = new byte[1];
while (bufferedIn.read(data) != -1) {
bufferedOut.write(data);
}
//将缓冲区中的数据所有写出
bufferedOut.flush();
//关闭流
bufferedIn.close();
bufferedOut.close();
} catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

总结

输入流向从里面读取数据,输出流向当中写入数据,正是有了这些输入和输出流,才有了文件的上传下载,网络的链接,图片的复制粘贴等。java流,须要自己很多其它的去体会和理解。

关于J2SE的总结结束了。下面是我在学习J2SE时的一系列总结。
         Java异常处理
         Java经常使用类
         Java容器
         Java流

Java流的更多相关文章

  1. 登堂入室——java流

    ——文章出自PeterYe,不得私自转载 我所知道的 java.io里面的[流],就仿佛太平洋里面的水一样,浩浩荡荡,横无际涯... -----2016/7/16--------公寓处记录------ ...

  2. Java笔记:Java 流(Stream)、文件(File)和IO

    更新时间:2018-1-7 12:27:21 更多请查看在线文集:http://android.52fhy.com/java/index.html java.io 包几乎包含了所有操作输入.输出需要的 ...

  3. java 流输出的一些问题

    一.java流的控制首先要先准备一个文件,例如:File f = new File(d:/lol.txt); 二.可以使用如下指令创建流,用于不同的用途 1.FileInputStream,FileO ...

  4. JAVA流式布局管理器--JAVA基础

    JAVA流式布局管理器的使用: FlowLayoutDeme.java: import java.awt.*;import javax.swing.*;public class FlowLayoutD ...

  5. Java - 17 Java 流(Stream)、文件(File)和IO

    Java 流(Stream).文件(File)和IO Java.io包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io包中的流支持很多种格式,比如:基本类型. ...

  6. Java总结:Java 流(Stream)、文件(File)和IO

    更新时间:2018-1-7 12:27:21 更多请查看在线文集:http://android.52fhy.com/java/index.html java.io 包几乎包含了所有操作输入.输出需要的 ...

  7. java 流 文件 IO

    Java 流(Stream).文件(File)和IO Java.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io 包中的流支持很多种格式,比如:基本类 ...

  8. 使用Socket&反射&Java流操作进行方法的远程调用(模拟RPC远程调用)

    写在前面 阅读本文首先得具备基本的Socket.反射.Java流操作的基本API使用知识:否则本文你可能看不懂... 服务端的端口监听 进行远程调用,那就必须得有客户端和服务端.服务端负责提供服务,客 ...

  9. 深入理解Java流机制(一)

    一.前言 C语言本身没有输入输出语句,而是调用"stdio.h"库中的输入输出函数来实现.同样,C++语言本身也没有输入输出,不过有别于C语言,C++有一个面向对象的I/O流类库& ...

随机推荐

  1. linux上安装Drupal

    linux上安装Drupal 前言:国内用drupal的并不太多,网上资料也很少.要注意的是drupal尽量别使用apt来安装,特别是ubuntu平台的drupal做出了一定的更改,会妨碍后期的学习和 ...

  2. fedora linux平台下搭建lighttpd+php+sqlite

    (一)lighttpd 1. 安装 yum install lighttpd 安装完毕后,系统中应该多了一个用户lighttpd和组lighttpd.这个用户,默认是不同意登陆的. 我们改动/etc/ ...

  3. AutoFac使用方法总结:Part III

    生命周期 AutoFac中的生命周期概念非常重要,AutoFac也提供了强大的生命周期管理的能力. AutoFac定义了三种生命周期: Per Dependency Single Instance P ...

  4. svn加入新的文件夹

    方法一: 1.在远程server上生成新的文件夹 svn mkdir http://svn.xxx.com/svn/mobile/strategy/assistant/branches/talk -m ...

  5. VC版八皇后

    一.  功能需求: 1. 可以让玩家摆棋,并让电脑推断是否正确 2. 能让电脑给予帮助(给出全部可能结果) 3. 实现悔棋功能 4. 实现重置功能 5. 加入点按键音效果更佳 二.  整体设计计: 1 ...

  6. Codeforces 385B Bear and Strings

    题目链接:Codeforces 385B Bear and Strings 记录下每一个bear的起始位置和终止位置,然后扫一遍记录下来的结构体数组,过程中用一个变量记录上一个扫过的位置,用来去重. ...

  7. mybaits使用存储过程

    如何使用Mybaits调用数据库存储过程,按以下顺序Oracle案例库: 1.在数据库中创建以下存储过程: create or replace procedure pro_hello(p_result ...

  8. CAS Spring Security 3 整合配置(转)

    一般来说, Web 应用的安全性包括用户认证( Authentication )和用户授权( Authorization )两个部分.用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否 ...

  9. 设计模式C++达到 1.辛格尔顿

    实现类的单个案件的Singleton模式.该系统有一个类只有一个实例,而本实施例是容易的外部访问.所以容易控制的实例的数量,并且节省系统资源. 单的情况下通常与一些非本地静态对象的使用,对于这些对象, ...

  10. 经验19--C#大事

    以前学过C#大事.但我还没有搞懂怎么弄. 这一次,他们下进行了研究. 1.定义参数类,对于参数的传递活动.(可以省略) public class UserEventArgs     {         ...