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