Overview of I/O Streams
Inspect one language lane at a time so line-level text and code deltas stay readable.
Diff Lane
English
0 modified sections0 code block delta0 anchor delta
Diff Lane
中文
3 modified sections0 code block delta0 anchor delta
modifiedI/O 流概述text+1 line, -1 line
v1.0.5
Section Text
1
本章介绍基本的 I/O 概念和文件操作。2
3
仓颉编程语言将与应用程序外部载体交互的操作称为 I/O 操作。I 对应输入(Input),O 对应输出(Output)。4
5
仓颉编程语言所有的 I/O 机制都是基于数据流进行输入输出,这些数据流表示了字节数据的序列。数据流是一串连续的数据集合,它就像承载数据的管道,在管道的一端输入数据,在管道的另一端就可以输出数据。6
7
仓颉编程语言将输入输出抽象为流(Stream)。8
9
- 将数据从外存中读取到内存中的称为输入流(InputStream),输入端可以一段一段地向管道中写入数据,这些数据段会按先后顺序形成一个长的数据流。10
- 将数据从内存写入外存中的称为输出流(OutputStream),输出端也可以一段一段地从管道中读出数据,每次可以读取其中的任意长度的数据(不需要跟输入端匹配),但只能读取先输入的数据,再读取后输入的数据。11
12
有了这一层抽象,仓颉编程语言就可以使用统一的接口来实现与外部数据的交互。13
14
仓颉编程语言将标准输入输出、文件操作、网络数据流、字符串流、加密流、压缩流等等形式的操作,统一用 Stream 描述。15
16
Stream 主要面向处理原始二进制数据,Stream 中最小的数据单元是 `Byte`。17
18
仓颉编程语言将 Stream 定义成了 `interface`,它让不同的 Stream 可以用装饰器模式进行组合,极大地提升了可扩展性。v1.1.0
Section Text
1
本章介绍基本的 I/O 概念和文件操作。2
3
仓颉编程语言将与应用程序外部载体交互的操作称为 I/O 操作。I 对应输入(Input),O 对应输出(Output)。4
5
仓颉编程语言所有的 I/O 机制都是基于数据流进行输入输出,这些数据流表示了字节数据的序列。数据流是一串连续的数据集合,它就像承载数据的管道,在管道的一端输入数据,在管道的另一端就可以输出数据。6
7
仓颉编程语言将输入输出抽象为流(Stream)。8
9
- 将数据从外存中读取到内存中的称为输入流(InputStream),输入端可以一段一段地向管道中写入数据,这些数据段会按先后顺序形成一个长的数据流。10
- 将数据从内存写入外存中的称为输出流(OutputStream),输出端也可以一段一段地从管道中读出数据,每次可以读取其中的任意长度的数据(不需要跟输入端匹配),但只能读取先输入的数据,再读取后输入的数据。11
12
有了这一层抽象,仓颉编程语言就可以使用统一的接口来实现与外部数据的交互。13
14
仓颉编程语言将标准输入输出、文件操作、网络数据流、字符串流、加密流、压缩流等形式的操作,统一用 Stream 描述。15
16
Stream 主要面向处理原始二进制数据,Stream 中最小的数据单元是 `Byte`。17
18
仓颉编程语言将 Stream 定义成了 `interface`,它让不同的 Stream 可以用装饰器模式进行组合,极大地提升了可扩展性。modified输入流textcodeformatting only
v1.0.5
Section Text
1
程序从输入流读取数据源(数据源包括外界的键盘、文件、网络等),即输入流是将数据源读入到程序的通信通道。2
3
仓颉编程语言用 `InputStream` 接口类型来表示输入流,它提供了 `read` 函数,这个函数会将可读的数据写入到 `buffer` 中,返回值表示了该次读取的字节总数。4
5
InputStream 接口定义:6
7
<!-- run -->8
9
10
当拥有一个输入流的时候,就可以像下面的代码那样去读取字节数据,读取的数据会被写到 `read` 的入参数组中。11
12
输入流读取示例:Code 1 · cangjie
1
interface InputStream {2
func read(buffer: Array<Byte>): Int643
}Code 2 · cangjie
1
import std.io.InputStream2
3
main() {4
let input: InputStream = ...5
let buf = Array<Byte>(256, repeat: 0)6
while (input.read(buf) > 0) {7
println(buf)8
}9
}v1.1.0
Section Text
1
程序从输入流读取数据源(数据源包括外界的键盘、文件、网络等),即输入流是将数据源读入到程序的通信通道。2
3
仓颉编程语言用 `InputStream` 接口类型来表示输入流,它提供了 `read` 函数,这个函数会将可读的数据写入到 `buffer` 中,返回值表示了该次读取的字节总数。4
5
InputStream 接口定义:6
7
<!-- run -->8
9
10
当拥有一个输入流的时候,就可以像下面的代码那样去读取字节数据,读取的数据会被写到 `read` 的入参数组中。11
12
输入流读取示例:13
14
<!-- run -->Code 1 · cangjie
1
interface InputStream {2
func read(buffer: Array<Byte>): Int643
}Code 2 · cangjie
1
import std.io.InputStream2
import std.io.ByteBuffer3
4
main() {5
let input: InputStream = ByteBuffer("Hello World".toArray())6
let buf = Array<Byte>(256, repeat: 0)7
while (input.read(buf) > 0) {8
println(String.fromUtf8(buf))9
}10
}modified输出流textcode+1 line
v1.0.5
Section Text
1
程序向输出流写入数据。输出流是将程序中的数据输出到外界(显示器、打印机、文件、网络等)的通信通道。2
3
仓颉编程语言用 `OutputStream` 接口类型来表示输出流,它提供了 `write` 函数,这个函数会将 `buffer` 中的数据写入到绑定的流中。4
5
特别的,有一些输出流的 `write` 不会立即写到外存中,而是有一定的缓冲策略,只有当符合条件或主动调用 `flush` 时才会真实写入,目的是提高性能。6
7
为了统一处理这些 `flush` 操作,在 `OutputStream` 中有一个 `flush` 的默认实现,它有助于抹平 API 调用的差异性。8
9
OutputStream 接口定义:10
11
12
当拥有一个输出流时,可以写入字节数据。13
14
输出流写入示例:Code 1 · cangjie
1
interface OutputStream {2
func write(buffer: Array<Byte>): Unit3
4
func flush(): Unit {5
// 空实现6
}7
}Code 2 · cangjie
1
import std.io.OutputStream2
3
main() {4
let output: OutputStream = ...5
let buf = Array<Byte>(256, repeat: 111)6
output.write(buf)7
output.flush()8
}v1.1.0
Section Text
1
程序向输出流写入数据。输出流是将程序中的数据输出到外界(显示器、打印机、文件、网络等)的通信通道。2
3
仓颉编程语言用 `OutputStream` 接口类型来表示输出流,它提供了 `write` 函数,这个函数会将 `buffer` 中的数据写入到绑定的流中。4
5
特别的,有一些输出流的 `write` 不会立即写到外存中,而是有一定的缓冲策略,只有当符合条件或主动调用 `flush` 时才会真实写入,目的是提高性能。6
7
为了统一处理这些 `flush` 操作,在 `OutputStream` 中有一个 `flush` 的默认实现,它有助于抹平 API 调用的差异性。8
9
OutputStream 接口定义:10
11
<!-- run -->12
13
14
当拥有一个输出流时,可以写入字节数据。15
16
输出流写入示例:17
18
<!-- run -->Code 1 · cangjie
1
interface OutputStream {2
func write(buffer: Array<Byte>): Unit3
4
func flush(): Unit {5
// 空实现6
}7
}Code 2 · cangjie
1
import std.io.OutputStream2
import std.io.ByteBuffer3
4
main() {5
let output: OutputStream = ByteBuffer()6
let buf = "Hello World".toArray()7
output.write(buf)8
output.flush()9
}