Delphi使用TFileStream进行自定义文件扩展

时间:2016-09-29 22:34:52

标签: delphi

我已经阅读了文档中的流,我已经了解它们是如何工作的,但我还没有理解何时应该使用它们。

例如,让我们认为我有一个程序AAA.exe,它必须保存一些配置;在这种情况下,我将使用ini文件。但我也可以使用TFileStreamTBinaryWriter / TBinaryReader来创建一个名为(例如)config.aaa的文件。

正如您在第二个示例中所看到的,config.aaa有一个我发明的自定义扩展,我知道如何阅读它(因为写作顺序和阅读顺序必须是一样的。)

创建config.iniconfig.aaa有何不同?第二种选择是否更好?我知道这取决于案例,但我想知道这是不是一个好选择。

我想我可以使用自定义扩展程序创建一个自定义文件,以存储我的程序只能访问的特定数据。

1 个答案:

答案 0 :(得分:3)

这是两个不同的问题。

什么时候应该使用流?

Streams是一种以一致方式访问数据的抽象,无论实际存储的具体细节如何。例如,考虑TMemoryStreamTFileStreamTResourceStream。所有这些都为您提供了读取和写入数据的相同界面,但数据最终存储在非常不同的位置 - 内存,文件系统,PE文件的资源。这里的重要部分是尽管底层存储存在显着差异,但通过流访问数据的方式始终是相同的。实际上,您可以简单地将一个流替换为另一个流(例如,通过网络读取数据的流),并且您的应用程序仍然可以正常运行而无需进一步更改。

因此,为了回答您的问题,您应该在每次可能发生更改存储设备或修改其特征(例如添加压缩)时使用流。

但这完全独立于您在流中存储的实际数据。由您来解释数据,流只是为您提供了一种统一的访问方式,隐藏了您的设备细节。数据的含义完全不同。

对于您的文件,config.iniconfig.aaa(或者,pink unicorn.mp3)之间没有真正的区别。文件名和扩展名只是您为该文件提供的标签,以便于理解内容,但实际解释与名称无关。对于习惯使用Windows的人来说,这似乎很奇怪,因为在Windows上我们经常使用扩展来确定文件的内容(与Unix世界不同,扩展没有任何意义);但即使在Windows上,您也可以注意到扩展名并不是很重要 - 将您的照片从something.jpg重命名为somethingelse.png或将您的视频从movie1.avi重命名为movie1.mp4,您将会可能会注意到你的观众/播放器也可以显示/播放这些 - 只是因为它不关心扩展,而是扫描内容并决定如何根据该内容显示/播放文件。

如果您使用的是Windows,那么使用公共扩展名是有意义的,因为它可以让其他人(或您未来的自己)轻松猜出文件的内容,但这不是强制性的。