IO流 流的到底是什么?

唱不完的离歌 发布于 2016/09/06 14:30
阅读 1K+
收藏 0

在下初学Java到现在也有1年了,刚开始学只知道io流很重要,io流的各种操作方法,io流可以通过网络传输数据,学啊学,学会了io流的操作。但刚才忽然一下,流到底是什么?以Java为例,io流大家都会操作,不过就是那几个inputStream,outputStream,但它在本质上到底传输的是什么呢?二进制字节码?字符串?还是以别的方式?小子愚钝,望知道的大神能解答一二,感激不尽。 

PS:最近笑傲江湖看多了,感觉打字说话怪怪的

加载中
0
yak
yak

byte

 

yak
yak
回复 @唱不完的离歌 : byte是00-FF -128,127还是0,255这全靠定义
唱不完的离歌
唱不完的离歌
byte? 范围在-128-127之间? 在底层传的就是这些一个个-128-127之间的数字吗?
0
a
aboo

当然底层的就是二进制表示,不过java给你封装的API可以按字节、字符等单元操作。

流只是一种数据处理模式的形象描述,可以有处理单元为字节的流、也可以有处理单元为字符、二进制或者其它任何数据形式的流。

唱不完的离歌
唱不完的离歌
回复 @aboo : 哦哦,谢谢你的解答
a
aboo
对的
唱不完的离歌
唱不完的离歌
也就是说,流其实也只是我们在应用层的描述而已?实质到真正的数据传输都是010101这样的二进制?
0
乌龟壳
乌龟壳

所谓流,其实就是无限的意思。

虽然每个文件都有大小,但是和流有关的类(包括你自己可能设计的流类),都不需要知道总共要计算多少资源,它们的写法都是来多少当场就处理多少,假设要处理无限多个而不会出错。你可以看下InputStream和OutputStream接口揣摩下。

流之所以要这样子设计是为了模拟称为【管道(pipe line)】的计算模式。

如最高效的压缩方式是

  1. 生成一小段byte1[]   (如读一行数据库,解析成json)
  2. 压缩byte1[]到byte2[] (DeflateOutputStream)
  3. 把byte2[]写入缓冲区(BufferedOutputStream)
  4. 文件流根据实际情况写入文件 (FileOutputStream)
  5. 继续步骤1直到步骤1无数据可生成,就结束整个pipe line,在处理过程中不需要太多内存,是一段一段处理的。

而低效的压缩方式是

  1. 所有数据生成到内存中,生成很大的byte1[]
  2. 把byte1[]直接写入文件
  3. 调用命令行把文件压缩(这一步实际是重新读取文件,压缩后写入另一个文件)
0
jQer
jQer

IO 是 IO,流是流。基础概念没掌握啊。

IO 是指 Input 和 Output。对于操作系统终端来说,是字符输入(键盘)和输出(显示器)。对于网络来说,是字符输入(对端数据到达)和输出(本端数据发出)。

Stream 是一种抽象概念,是对 IO 操作(接收、发送)的一种 API 设计风格。一般是一个 Stream 对象,附带 send recv write read 等方法,用来更简便的进行 IO (把底层的 指针缓冲等的处理封装)。

更进一步,假设你在进行 IO 时,需要一个 Buffer (比如数组或者链表)存储字符序列,以及一些网络本端和对端的套接字表示 LocalSocket、PeerSocket,那么使用 Stream 后,你不需要关系 Buffer LocalSocet PeerSocket。Stream 会在内部维护它们,它本身就是一个数据结构,你可以看做 Stream {LocalSocket, PeerSocket, Buffer, ...}。那么你在调用类似 stream.write() 时候,其内部会根据链接去操作 LocalSocket 和 Buffer 等等。

jQer
jQer
回复 @刘大神 : 这不简单了。你如果觉得一个 Stream 抽象过于庞大,就拆分成两个,InputStream OutputStream。
G
GeorgeLi-
你的这个回答只是从侧面回复了这个问题,并没有正面解答!求正面姿势!
刘大神
刘大神
输入输出流如何解释?
0
王小蒙
王小蒙
IO不是小精灵么?
h
hydraWang
LOL IO and Tiny~
0
Sel8616
Sel8616
字节流
0
sprouting
sprouting

我是这么理解的

所谓的序列化就好比一块冰,我要让这块冰移到另外一个房间去,而房间又只有一个很小的口。这时就要将这个对象流化,这就是IO流,变成了水的这个过程就是流化,此时的数据就是比特形式存在,到了另外一个房间,如果不将它序列化,我们是无法知道原本的信息是什么样的。因为很多的编码,不同的编码得到的信息是不同的,将流变成了原本的可解读的就是序列化过程

唱不完的离歌
唱不完的离歌
是比特不是字节吗?
0
moli
moli
流只是一种抽象,本质上计算机一切都是流,磁盘读写流,网络进出流,内存IO流,显存IO流……
0
Sel8616
Sel8616

回复 @唱不完的离歌 : 数据自身有编码格式。编码的结果——字节流,所谓流其实就是一个序列。字节流,就是一长串字节。

上面有人说到了PIPE,你想像一根水管,里面流的不是水,而是一个个钢珠,每个钢珠看作一个字节。从输入端塞入一串钢珠,它们就会依次从输出端“流”出来。

 “底层”传输的东西,不是字节流,而是二进制流(0/1位串)。由于信息的表达都是要对0/1串编码才能实现,而当前通用的信息编码都是以字节为单位的。起初,人们每次编写网络程序时都要写一遍bit>>byte的转换过程,重复且麻烦;于是,便把这部分公共的工作标准化、通用化——这就是“字节流”,它是对二进制流的一种封装,就像一种网络协议。

 输出的字节序列,只能表达256种信息,一般情况下不够用,除非业务领域使用的是ASCII编码格式。使用其它编码格式时,就会再做一次封装——用若干个字节的组合来表达一种信息。 仔细看看String类的构造方法和getBytes方法,注意charset的使用。

0
红薯官方
红薯官方

IO流,流就是数据,基本上分为:字节流和字符流。

不同的设备之间、不同的应用程序之间通过IO流来交换数据,读取、写入、持久化等。

CPU <- IO -> L1Cache <- IO -> L2Cache <- IO -> L3Cache <- IO -> Memory <- IO -> HDD/SSD/NetWork

上面只是举个‘栗’子,凡是需要数据信息交换的地方就会有IO流。


返回顶部
顶部