此为 Mathematica 4 文档,内容基于更早版本的 Wolfram 语言
查看最新文档(版本11.2)

2.11.3 高级专题:流和低层的输入输出

文件和管道两者都是一般称为流的 Mathematica 对象的例子. Mathematica 中的流是一个输入或输出源. 许多运算都是在流上进行的.
可以将 >> << 作为高层 Mathematica 输入/出函数. 它们的基础是直接在 流上工作的低层输入ꆪꆪ输出基元. 用这些基元可以更多地控制 Mathematica 的输入和输出,在编写从文件或管道存取中间数据的 Mathematica 程序时, 需要进行精确的输入和输出控制.
把输出写入一个 Mathematica 流的低层步骤如下:先调用 OpenWriteOpenAppend 去打开这个流,这告诉 Mathematica 需要 向一个文件或外部程序写入输出以及输出的形式;打开一个流之后,调用 WriteWriteString 向这个流写入一个表达式或字符串序列; 完成 后用 Close 去关闭这个流.

Mathematica 中的流

打开一个文件或管道时,Mathematica 产生一个流对象去指出打开的流与该 文向或导向相关. 这个流对象一般包含该文件名或管道中外部命令名和一个唯一的数.
在流对象中使用一个唯一数的原因是可能同时会有几个流与同一个文件或外部 程序相联系. 例如,可以在不同的地方使用同一个外部程序,每一次都与不 同的流相关联.
然而,打开一个流后,当仅有一个对象和这个流相关联时,仍可以用一个简单 的文件名或外部程序名去指代这个流.

打开一个输出到文件 tmp 的流

向该文件写入一个表达式序列

由于仅有一个流与文件 tmp 相关联,所以能简单地用文件名去指代它

关闭这个流

这是向该文件写入的内容

低层输出函数

调用 Write[stream, expr] 时,将一个表达式写入一个指定的流,其默认情形是用 Mathematica 输入形式写入该表达式. 当调用 Write 写入一个表达式序列时, 这些表达式就一个接一个地写入一个流中. 一般地,在相继表达式中无空 格. 但写完了所有表达式之后,Write 总用一个换行结束输出.

重新打开文件 tmp

写该文件写入一个表达式序列,然后关闭

所有表达式用输入形式写入同一 Write 给出的表达式放在同一行

Write 提供了写出完整 Mathematica 表达式的途径. 有时需要写出较少结构化 的数据. WriteString 用来写出任意字符串. 与 Write 不同,WriteString 不换行,也不加任何字符.

打开一个流

向该流中写入 2 个字符串

这里写入另一个字符串,然后关闭该流

这里是该文件的内容,这些字符串与给定的完全一样只有在明确给出换行符的地方才换行

将输出写入一个流集合

函数 WriteString 的重要特点之一是它们不仅可以向一个流,而且可以向一个 流列表写入输出.
在使用 Mathematica 时,定义由流列表组成的通道是方便的. 简单地令 Mathematica 向通道写入时,就把同一对象写入了几个流之中.
在标准交互式 Mathematica 进程中,有几个常用的输出通道. 它们指定某些类型 输出的去向. 例如,$Output 指定标准输出的去向,而$Messages 指定信息的去向. 函数 Print 调用 Write $Output 通道工作.同理,Message 调用 Write$Messages 通道工作. 在 2.13.1 节中列出了典型 Mathematica 进程所使用的 通道.
通过 MathLink 运行 Mathematica 时使用不同的方式. 所有输出一般写入一个 MathLink 连接中,但每个输出块以一个表明类型的小包出现.
在大部分情况下,Mathematica 中使用的文件名或外部命令名与计算机操作系统 所使用的名称相对应,但在一些系统中,Mathematica 支持各种具有 特殊名称的流.

一些计算机系统中的特殊流

特殊流 "stdout" 允许将输出送到操作系统提供的标准输出. 但要注意仅能在 Mathematica 的简单文本界面中使用. 当与 Mathematica 的交互更复杂时, 这种流无法工作,试用这种流会带来很多麻烦.

输出流的一些选项

许多选项与输出流有关,第一次用 OpenWriteOpenAppend 打开输出流时就 可以定义这些选项.

这里打开一个流,指定 OutputForm 是默认输出格式

将表达式写入这个流后关闭它

这些表达式按 OutputForm 格式写入了这个流

将一个欲写入流的表达式放在 OutputForm TeXFormMathematica 格式指令内总可以覆盖对这个流所指定的输出格式.
选项 PageWidth 指定 Mathematica 文本输出的页宽. 所有输出都分成这种宽度 的行. 不需要分行时应设置 PageWidth->Infinity. 通常设定与输出设备相符的页宽, 在许多系统中运行一个程序去找到这个页宽值. 用 SetOptions 可以给出设置 PageWidth 的默认规则,例如,PageWidth :> <<"!devicewidth",这就 可以自动运行外部程序找出选项值.

打开一个流,指定页宽为 20 个字符

写一个表达式后关闭该流

表达式分成几行以便每行最多是 20 个字符

CharacterEncoding 选项为一个字符串指定代码,该代码将在送到 WriteWriteString 给出的流中任意包含这个特殊字符的字符串中使用. 在需要改动国际字符集, 或者需要某一输出设备接收不能处理的 字符时,常常使用 CharacterEncoding.

操作流的选项

打开一个具有默认设置的流

改变打开流的 FormatType 选项

Options 显示了对打开的流所设置的选项

关闭这个流

操作标准输出通道的选项

在进程中的每一处,Mathematica 保持一个当前打开的所有输入输出流以及 它们选项的列表. 有时需要直接查看这一列表,但除过间接使用 OpenRead 等情况下,Mathematica 不允许修改这个列表.