在 InterSystems IRIS 中处理流对象
简介
在现代应用程序中,尤其是那些涉及大型数据、文档、日志或多媒体的应用程序,高效地处理大型或非结构化内容变得至关重要。 InterSystems IRIS 提供了一种强大、可扩缩的方式来使用流对象管理此类数据。
流对象可以让开发者在处理大型文本或二进制数据时不受字符串大小上限或内存效率低下的影响。 在本文中,我们将探讨如何使用 ObjectScript 在 IRIS 中创建、读取、写入、存储和操作流对象。
IRIS 中的流对象是什么?
InterSystems IRIS 在 %Stream 软件包下提供了内置流类,用于表示可以增量读取或写入的字符或字节序列。 这些流在处理以下内容时特别有用:
- 文本文档(日志、报告等)
- 二进制文件(图像、PDF)
- 大型 API 有效负载(文件上传/下载)
- 超出字符串上限 (~3.6MB) 的持久类属性
流类型
| 流类型 | 类 | 用例 |
|---|---|---|
| 字符流 | %Stream.GlobalCharacter、%Stream.FileCharacter | 大型文本数据 |
| 二进制流 | %Stream.GlobalBinary、%Stream.FileBinary | 图像、PDF、二进制文件 |
创建并写入流
下面介绍了如何创建和写入全局字符流:
Set stream = ##class(%Stream.GlobalCharacter).%New() Do stream.Write("This is line one.") Do stream.WriteLine("This is line two.") .Write() 方法会将文本追加到流之后,而 .WriteLine() 则会在结尾添加一个换行符。
从流中读取
写入流后,您可以使用 .Read() 或 .ReadLine() 进行读取:
Do stream.Rewind() Set line1 = stream.ReadLine() Set line2 = stream.ReadLine() Write line1, !, line2
如果您已经写入流,请在读取前始终调用 .Rewind(),这会将内部指针重置到起点。
将流保存到文件中
流对象可以直接保存到文件中:
Set sc = stream.OutputToFile("/tmp/output.txt") If $$$ISERR(sc) { Write "Error saving file" } 类似地,您可以从文件读取到流中:
Set fileStream = ##class(%Stream.FileCharacter).%New() Set fileStream.Filename = "/tmp/input.txt" Set sc = fileStream.CopyTo(stream) ; Copy contents into another stream
在持久类中存储流对象
流可以轻松地与持久对象集成。 您可以在数据模型中将流定义为属性:
Class MyApp.Report Extends (%Persistent) { Property Title As %String; Property Content As %Stream.GlobalCharacter; } 您现在可以将大量内容保存为数据模型的一部分:
Set report = ##class(MyApp.Report).%New() Set report.Title = "October Report" Set report.Content = ##class(%Stream.GlobalCharacter).%New() Do report.Content.Write("Full report content goes here...") Do report.%Save()
二进制流
对于非文本数据(例如,图像或附件),请使用 %Stream.GlobalBinary:
Set binStream = ##class(%Stream.GlobalBinary).%New() Do binStream.Write($Char(255, 216, 255)) ; Sample binary data (JPEG header) Do binStream.OutputToFile("/tmp/sample.jpg")
流对象的常见用例
- 上传/下载 REST API 文件
在自定义 REST 服务中使用流输入/输出来处理大型多部分文件上传。 - 存储 PDF 文件或日志
将应用程序日志或报告存储在数据库中,而不会达到字符串大小上限。 - 数据归档
在数据库中将二进制备份或导出文件保存为 BLOB。 - 生成动态文件
在通过 HTTP 发送文件或将文件保存到磁盘之前,使用流在内存中生成文件。
技巧与最佳实践
- 在读取刚刚写入的流之前,务必倒回。
- 使用流复制以实现高效的内存处理:
source.CopyTo(destination)。 - 对于二进制数据,切勿使用字符流,因为这样可能会损坏内容。
- 监控
.Size以跟踪流长度。 - 使用
%JSONExportToStream()将对象直接序列化为流(例如,用于 REST 响应)。
示例:将对象导出为 JSON 流
Set obj = ##class(MyApp.Report).%OpenId(1) Set jsonStream = ##class(%Stream.GlobalCharacter).%New() Do obj.%JSONExportToStream(.jsonStream) Do jsonStream.OutputToFile("/tmp/export.json")
结语
流对象是每个 InterSystems IRIS 开发者工具箱中必不可少的工具。 它们提供了一种灵活、可扩缩且高效的方式来处理应用程序中的大型或非结构化数据,无论您是存储日志、操作文件,还是传输大型有效负载,都可以使用。
在了解完如何创建、操作和持久化流后,您在 IRIS 环境中处理数据的能力将提升到新的水平。