如果我有一个大字符串对象的属性(比如文件的内容大约50KB到1MB,可能更大),那么在POJO中声明这样一个属性的做法是什么?我需要做的就是能够从我的应用程序的一个层设置一个值并将其传输到另一个层而不会使对象本身“沉重”。
我正在考虑将InputStream或OutputStream关联以获取/设置值是否合理,而不是引用String本身 - 这意味着当我尝试读取内容的值时,我将其作为一个流读取字节,而不是整个巨大的字符串加载到内存...想法?
答案 0 :(得分:1)
每次访问时,都可以有一个提供流或迭代器的对象。请注意,内容必须存在于某些存储上,例如文件。即,您的对象将存储指针(例如文件路径)到存储,并且每次有人访问它时,您打开流或创建迭代器并让该方读取。另请注意,为了节省内存,消费者必须确保不将整个内容存储在内存中。
但是,50KB或1MB非常小。除非你有像千兆字节(或者可能是百兆字节),否则我不会尝试做类似的事情。
此外,即使您拥有大量数据,只需使用文件或您将使用的任何存储空间通常也会更简单。
tl; dr :只需使用String。
答案 1 :(得分:1)
您所描述的内容在很大程度上取决于您对数据的预期使用。如果您以原始形式提供内容,那么可能有更有效的方法来管理它。
例如,如果您的应用程序具有Web界面,则您的应用程序可能只提供Web服务器的URL以将内容流式传输给请求者。如果它是基于CLI的应用程序,您可以使用简单的文件副本。但是,如果您的应用正在处理该文件,那么您的POJO可能只保留该处理的结果而不是原始数据本身。
如果您希望提供一般使用POJO的模式以及对外部流的引用,我建议在POJO中存储类似于URI的内容,该URI告知在哪里可以找到流(如数据库中的行ID)或者文件名或URI)而不是存储流本身的实例。这样做,您将减少打开文件句柄的数量,防止潜在的并发问题,并且能够在需要时在本地序列化这些对象,而不必复制其他地方持久存储的原始数据。