Java Streams概述一

流是有序的数据序列,它...

  • 提供通用的I / O模型
  • 从底层源或目标中提取详细信息

无论您使用流从内存,存储或网络中获取数据,它都将对您隐藏实现细节。详细信息被抽象掉了,因此在每种情况下,您都可以将其视为数据的有序序列。

  • 流类型是单向的

这意味着,如果创建Java流的实例,则可以决定是要写入Java实例还是从中读取。您不能在给定的时间同时在单个流上同时执行这两项操作。

我们可以将流分为两类:

  • 字节流–作为二进制数据进行交互
  • 文本流–作为Unicode字符进行交互

两种Java流类型的常规交互是相同的

用流阅读

正如我们提到的,每个流都用于读取或写入。

首先,让我们看看如何从Java流中读取数据。

在Java中读取二进制数据的基类是读取文本数据的基类称为 类。 InputStreamReader

这两个类几乎具有相同的两种方法:

  • int read()
  • int read(byte/char[] buff)

请注意,在两种情况下,它们都返回一个 Integer 值。这些是解释值。整数是一个32位容器,因此在两种情况下都可以使用。

两者之间的区别:

    • 这个InputStream与字节一起工作,字节是8位。
    • 这个Reader适用于unicode字符,即16位。

使用InputStream读取字节

InputStream input = // create input stream
int result;

while(result = input.read() >= 0) //Indicates the end-of-stream with a return value of -1
byte byteVal = (byte)result;
// do something with byteVal
};

用阅读器阅读文字

Reader reader = // create reader
int result;

while(result = reader.read() >= 0)//Indicates the end-of-stream with a return value of -1
char charVal = (char)result;
// do something with charVal
};

请注意,如果您想检索该值,则只需将结果转换为适当的类型-在这种情况下为 bytechar

用流写

为了写入数据,有两个基类类似于读流。

  • OutputStream(对于字节)
  • Writer (用于文本)

用Java流写比读它们更简单。两个类都有一些write方法void return类型

使用OutputStream写入字节

写作OutputStream,可以将单个字节传递给方法,也可以传递字节数组。

OutputStream output // create output stream;
Byte byteVal = 100;

output.write(byteVal);

byte[] byteBuff = {0, 10, 20};
output.write(byteBuff);

用Writer写

Writer你可以传递一个简单的字符串,或者一个字符串类write方法

Writer writer // create output stream;
char charVal = 'c';

writer.write(charVal);

char[] charArray = {'c', 'h', 'a', 'r'};
writer.write(charArray);

String stringVal = "String";
writer.write(stringVal);

正如您所看到的,您需要编写的代码比阅读的代码少得多。

常见Java流类

上面,写了有关基本流类的文章。现在更深入地讨论不同的实现。

常见的Input / OutputStream派生类

  • ByteArrayInputStream / ByteArrayOutputStream 能够在字节数组上创建流
  • PipedInputStream / PipedOutputStream –这很像生产者-消费者的概念。管道输出流可以连接到管道输入流以创建通信管道。管道输出流是管道的发送端。通常,数据是PipedOutputStream通过一个线程写入对象的,而数据是PipedInputStream通过其他线程从连接的对象读取的。
  • FileInputStream / FileOutputStream –这些允许在文件上创建流。

常见读/写实现

上面是Reader / Writer流实现的示例。

  • CharArrayReader / Writer 允许在字符上创建流
  • StringReader / Writer 允许通过字符串创建流。
  • PipedReader / Writer 允许以文本的生产者/消费者关系创建流。类似于 PipedOutput / InputStream
  • InputStreamReader / Writer 允许通过Input / OutputStream创建流。
  • FileReader / Writer 能够在文本文件上进行流传输。

流式错误和清理

到目前为止,我们已经了解了streams的一般特性,但还没有考虑到与它们一起工作的所有实际情况。

Stream Realities

清理

  • 流由物理存储支持,物理存储通常存在于Java运行时之外,例如文件或网络连接。
  • 因此,Java可能无法可靠地清除,因此我们需要进行可靠的清除。完成处理后,我们需要关闭Streams。

解决

  • Streams实现Closeable接口,它实现一个单一的close方法。所以,这是我们的责任。

让我们看看一个简单的解决方案:

Reader reader; 
try{
reader = // create output stream;
// do something with reader;
}catch (IOException e) {
//handle exception
}finally {
if(reader != null)
reader.close();
}

上面这个例子的问题是您总是需要实现它。通常,我们经常使用流,所以应该自动完成。让我们看看怎样才能实现。

自动清理

 AutoClosable接口:
		1、一种方法:关闭
		2、接口的基本接口 Closable ,因此每个Stream都支持它。
		3、为尝试资源提供支持

Try-With-Resources

1、自动清理一个或多个资源“资源”是可以实现的任何类型  
2、AutoClosable语法类似于传统的try语句
3、(可选)包括捕获块处理身体处理关闭方法调用

使用尝试资源

在这里,我提供了一个简单的示例,说明如何通过try-with-resources块使用流的自动关闭。

我将通过来使用它 FileInputStream。稍后我们将讨论这个特定的流。

使用Try-With-Resources

在这里,我提供了一个简单的示例,说明如何通过try-with-resources块使用流的自动关闭。

我将通过来使用它 FileInputStream。稍后我们将讨论这个特定的流。

try(FileInputStream input = new FileInputStream("file1.txt")) {

        int data = input.read();
        while(data != -1){
            System.out.print((char) data);
            data = input.read();
        }
    }

用上述方法,无需研究进一步的工作即可关闭流。

概括

在本文中,介绍了Java流的基础知识,它们是什么,它们如何工作以及如何使用它们。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容

  • 链流 在使用流时,它们通常被链接在一起。 让我们看看使用链接流的优点是什么: 一个流实例利用另一个流实例。 这将创...
    假程序员樱木阅读 214评论 0 0
  • I/O类库中使用“流”这个抽象概念。Java对设备中数据的操作是通过流的方式。表示任何有能力产出数据的数据源对象,...
    千淘萬漉阅读 7,304评论 0 2
  • 《java世界观》文集说明 本文集记载的所有内容均是java的学习笔记,主要重点记录概念,可能不会为每个概念列举完...
    蜗先生阅读 134评论 0 0
  • 六、极客时间 1、Exception和Error有什么区别? Error类和Exception类的父类都是thro...
    想54256阅读 766评论 0 1
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,518评论 28 53