java流的作用很大吗_深入理解 Java中的 流 (Stream)-程序员宅基地

技术标签: java流的作用很大吗  

最近在看《Hadoop:The Definitive Guide》,对其分布式文件系统HDFS的Streaming data access不能理解。基于流的数据读写,太抽象了,什么叫基于流,什么是流?Hadoop是Java语言写的,所以想理解好Hadoop的Streaming Data Access,还得从Java流机制入手。流机制也是JAVA及C++中的一个重要的机制,通过流使我们能够自由地操作包括文件,内存,IO设备等等中的数据。

首先,流是什么?

流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输出操作都是以“流”的方式进行。设备可以是文件,网络,内存等。

流是允许你用相似的方式(作为顺序字节流)对待不同数据源的一种抽象。所有 .NET 流类从 System.IO.Stream 类继承。

流可以代表内存缓冲器中的数据、从网络连接获得的数据、从文件获得的或要写入文件的数据。

7fab7b636876061aa01222584b0a11a3.png

流具有方向性,至于是输入流还是输出流则是一个相对的概念,一般以程序为参考,如果数据的流向是程序至设备,我们成为输出流,反之我们称为输入流。

可以将流想象成一个“水流管道”,水流就在这管道中形成了,自然就出现了方向的概念。

4c940fbccb754d0849e94e9dfce0a282.png

当程序需要从某个数据源读入数据的时候,就会开启一个输入流,数据源可以是文件、内存或网络等等。相反地,需要写出数据到某个数据源目的地的时候,也会开启一个输出流,这个数据源目的地也可以是文件、内存或网络等等。

流有哪些分类?

可以从不同的角度对流进行分类:

1. 处理的数据单位不同,可分为:字符流,字节流

2.数据流方向不同,可分为:输入流,输出流

3.功能不同,可分为:节点流,处理流

1. 和 2. 都比较好理解,对于根据功能分类的,可以这么理解:

节点流:节点流从一个特定的数据源读写数据。即节点流是直接操作文件,网络等的流,例如FileInputStream和FileOutputStream,他们直接从文件中读取或往文件中写入字节流。

d041940b4cf5568ee0bacbe177176e85.png

处理流:“连接”在已存在的流(节点流或处理流)之上通过对数据的处理为程序提供更为强大的读写功能。过滤流是使用一个已经存在的输入流或输出流连接创建的,过滤流就是对节点流进行一系列的包装。例如BufferedInputStream和BufferedOutputStream,使用已经存在的节点流来构造,提供带缓冲的读写,提高了读写的效率,以及DataInputStream和DataOutputStream,使用已经存在的节点流来构造,提供了读写Java中的基本数据类型的功能。他们都属于过滤流。

5b4419866afbe2b648fe86ca7d0b9c60.png

举个简单的例子:

48304ba5e6f9fe08f3fa1abda7d326ab.png

public static void main(String[] args) throws IOException {

// 节点流FileOutputStream直接以A.txt作为数据源操作

FileOutputStream fileOutputStream = new FileOutputStream("A.txt");

// 过滤流BufferedOutputStream进一步装饰节点流,提供缓冲写

BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(

fileOutputStream);

// 过滤流DataOutputStream进一步装饰过滤流,使其提供基本数据类型的写

DataOutputStream out = new DataOutputStream(bufferedOutputStream);

out.writeInt(3);

out.writeBoolean(true);

out.flush();

out.close();

// 此处输入节点流,过滤流正好跟上边输出对应,读者可举一反三

DataInputStream in = new DataInputStream(new BufferedInputStream(

new FileInputStream("A.txt")));

System.out.println(in.readInt());

System.out.println(in.readBoolean());

in.close();

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

流结构介绍:

Java所有的流类位于java.io包中,都分别继承字以下四种抽象流类型。

字节流

字符流

输入流

InputStream

Reader

输出流

OutputStream

Writer

1.继承自InputStream/OutputStream的流都是用于向程序中输入/输出数据,且数据的单位都是字节(byte=8bit),如图,深色的为节点流,浅色的为处理流。

d0b3f84441fdff713f3e7db204342dcd.png 

e17b3427bd734890e17e1dc00cbc15cd.png

2.继承自Reader/Writer的流都是用于向程序中输入/输出数据,且数据的单位都是字符(2byte=16bit),如图,深色的为节点流,浅色的为处理流。

024b182e995680d09b397d75920a94f5.png

b151a9bbbd1fd6dcfa5b0241d0de5e0c.png

常见流类介绍:

节点流类型常见的有:

对文件操作的字符流有FileReader/FileWriter,字节流有FileInputStream/FileOutputStream。

处理流类型常见的有:

缓冲流:缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写效率,同事增加了一些新的方法。

字节缓冲流有BufferedInputStream/BufferedOutputStream,字符缓冲流有BufferedReader/BufferedWriter,字符缓冲流分别提供了读取和写入一行的方法ReadLine和NewLine方法。

对于输出地缓冲流,写出的数据,会先写入到内存中,再使用flush方法将内存中的数据刷到硬盘。所以,在使用字符缓冲流的时候,一定要先flush,然后再close,避免数据丢失。

转换流:用于字节数据到字符数据之间的转换。

仅有字符流InputStreamReader/OutputStreamWriter。其中,InputStreamReader需要与InputStream“套接”,OutputStreamWriter需要与OutputStream“套接”。

数据流:提供了读写Java中的基本数据类型的功能。

DataInputStream和DataOutputStream分别继承自InputStream和OutputStream,需要“套接”在InputStream和OutputStream类型的节点流之上。

对象流:用于直接将对象写入写出。

流类有ObjectInputStream和ObjectOutputStream,本身这两个方法没什么,但是其要写出的对象有要求,该对象必须实现Serializable接口,来声明其是可以序列化的。否则,不能用对象流读写。

还有一个关键字比较重要,transient,由于修饰实现了Serializable接口的类内的属性,被该修饰符修饰的属性,在以对象流的方式输出的时候,该字段会被忽略。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34766614/article/details/114507540

智能推荐

计算机视觉的定义,应用及整个系统-程序员宅基地

文章浏览阅读7k次。定义: 计算机视觉是使用计算机及相关设备对生物视觉的一种模拟。它的主要任务就是通过对采集的图片或视频进行处理以获得相应场景的三维信息,就像人类和许多其他类生物每天所做的那样。 计算机视觉是一门关于如何运用照相机和计算机来获取我们所需的,被拍摄对象的数据与信息的学问。形象地说,就是给计算机安装上眼睛(照相机)和大脑(算法),让计算机能够感知环境。我们中国人的成语"眼见为实"和西方_计算机视觉

【华为云技术分享】华为云鲲鹏云服务移植指南和实践案例(上)_哪些软件可以鲲鹏移植-程序员宅基地

文章浏览阅读7.8k次,点赞2次,收藏15次。【摘要】 从应用语言出发,分享应用鲲鹏移植理论和方案,基于应用移植案例,分享鲲鹏应用移植成功经验。主讲人:华为云鲲鹏云服务与解决方案架构师 王龙江一、鲲鹏云服务解决方案回顾前期,在上一次直播,我们的同事应该已经给大家分享过了华为云的鲲鹏云服务以及鲲鹏云服务解决方案,本次,我们先来回顾一下。因为有些朋友可能是第一次听,所以,给大家简单回顾一下华为云的鲲鹏云服务以及解决方案。其实本质..._哪些软件可以鲲鹏移植

杰理AD14N/AD15N---休眠和关机唤醒问题_杰理power off-程序员宅基地

文章浏览阅读1.6k次。杰理JL AD150N、AD153A2、AD153A4、AD156A2、AD158A2、AD159A2、AD142A2、AD145A2、AD146A2.目前的SDK如果不是使用默认配置的PA0引脚做开关机按键,修改了AD按键引脚,则关机后再也唤不醒了,怎么配置?其实SDK用户手册中有介绍:在SDK目录下的DOC文档中可以找到休眠和关机(power down和soft off)的介绍和配置方法,但是当我修改了唤醒IO口以后,发现无法唤醒:于是跟进关机流程的代码,发现不管是power_杰理power off

STM32 使用 SHT2x 温湿度传感器_2x.h-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏11次。简介这TM的是个超级坑的通讯过程,虽然符合SPI通讯流程,但要是你直接用SPI通讯会发现完全不是这么回事。这个是在STM32F0系列单片机上使用的范例,可以正常读取温度和湿度,只写了主机模式。database.h 里面没啥东西,可以直接用#include "stm32f0xx.h"代替代码SHT2x.h#ifndef SHT2x_H#define SHT2x_H//-------..._2x.h

docker overlay2占用大量磁盘空间清理_overlay 占用了太多空间-程序员宅基地

文章浏览阅读1.1w次,点赞3次,收藏8次。docker overlay2占用大量磁盘空间清理环境前因正文欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片环境docker版本:Docker version 1.13.1, build 7f2769b/1.13.1linux版本Linux version 3.10.0-693.2.2.el7.x86_64前因线上系统出现问题,磁盘空间不足,导致线上系统不可用,最终定位到了问题原因,这篇文章就是记录清理overlay2目_overlay 占用了太多空间

【Warrior刷题笔记】LC1020.飞地的数量 【DFS】详细注释简单易懂-程序员宅基地

文章浏览阅读438次。题目LC1020.飞地的数量解题思路本题可以使用DFS解决。遍历每个格子,如果该格子是陆地,就DFS该陆地所在的岛屿,并计算岛屿面积,并修改格子值为2防止重复遍历。在遍历过程中,只要有一块陆地在边界,这个岛屿就不是飞地,否则就是飞地。计算所有飞地面积之和,返回答案ans。dfs遍历求所有岛屿面积参考LC200.岛屿数量class Solution {private: constexpr static int direction[4][2] = {{-1,0},{1,0},{0,-1},_飞地的数量

随便推点

Day04.循环结构_```import randomanswer = random.randint(1, 100)gue-程序员宅基地

文章浏览阅读145次。循环结构文章目录循环结构前言一.for-in循环二.While循环三.练习3.1 输入一个正整数判断是不是素数。3.2 输入两个正整数,计算它们的最大公约数和最小公倍数。3.3 打印如下所示的三角形图案。总结前言我们在写程序的时候,一定会遇到需要重复执行某条或某些指令的场景。例如用程序控制机器人踢足球,如果机器人持球而且还没有进入射门范围,那么我们就要一直发出让机器人向球门方向移动的指令。在这个场景中,让机器人向球门方向移动就是一个需要重复的动作,当然这里还会用到上一课讲的分支结构来判断机器_```import randomanswer = random.randint(1, 100)guess_num = 0guess_count

C++ 学习笔记6--set和multiset、map和multimap(key-value)结构_c++ set 下标-程序员宅基地

文章浏览阅读762次。目录:set初始化、遍历、查找、插入、下标1.1 set的初始化1.2 set的遍历1.3 set的查找1.4 set的插入1.5 set的下标访问1.6 set的修改map初始化、遍历、查找、插入、下标2.1 map的初始化2.2 map的遍历2.3 map的查找2.4 map的插入2.5 map的下标访问1. set初始化、遍历、查找、插入、下标set的特点:1、关键字必须唯一,不能重复2、默认情况下,set中的key会按照升序进行排序3、set的底层实现是_c++ set 下标

客户端与服务器的数据表的同步问题_从服务端获取到的列表 同步在客户端的数据库-程序员宅基地

文章浏览阅读4.6k次。图片来源参见水印。文章参考http://a52071453.iteye.com/blog/1978498。美团二面中面试官问了这样的一个问题,在传输有限的情况下,如何保证多个客户端与服务器保持的数据表的一致性?其实解决的方法很简单。先说一下整体的思路:首先由于客户端可能存在很多,而且不可能每个客户端都时时的和服务器保持连接,因此有服务器主导的同步机制是存在问题的。那_从服务端获取到的列表 同步在客户端的数据库

解决DVWA“reCAPTCHA key: Missing”-程序员宅基地

文章浏览阅读1.1w次,点赞6次,收藏19次。配置DVWA时出现如下错误:reCAPTCHA key: Missing_recaptcha key: missing

Windows下FFmpeg快速入门sdk下载以及ffmpeg库开发_ffmpeg-full-sdk-3.2.rar-程序员宅基地

文章浏览阅读3.2k次。原文地址:--搞定264 FFMPEG" href="http://blog.sina.com.cn/s/blog_51396f890100o1yf.html" target="_blank">Windows下FFmpeg快速入门sdk下载以及ffmpeg库开发 --搞定264 FFMPEG作者:南无阿弥陀佛Windows下FFmpeg快速入门作者:A.TNG_ffmpeg-full-sdk-3.2.rar

Golang 中Ruquest.FormValue方法_goland formvalue-程序员宅基地

文章浏览阅读3.2k次。Golang中 net/http包下 Request.FormValue 方法 可以额获取 url 中? 后面的请求参数例如一package mainimport ( "fmt" "net/http")func main() { http.HandleFunc("/hello", func(writer http.ResponseWriter, request *http.Request) { username := request.FormValue("usern_goland formvalue

推荐文章

热门文章

相关标签