Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在保存到文件之前,将定期获取的大量文本存储到缓存中是一个好主意吗?_Java_Caching_File Io - Fatal编程技术网

Java 在保存到文件之前,将定期获取的大量文本存储到缓存中是一个好主意吗?

Java 在保存到文件之前,将定期获取的大量文本存储到缓存中是一个好主意吗?,java,caching,file-io,Java,Caching,File Io,所以我尝试将来自消息网络用户的消息写入一个文件。我试图用良好的java实践和适当的文件IO技术构建这个程序 目前,我的程序识别出有人发布了一条消息,接收该消息并立即将其写入文件。创建file对象,创建writer对象,附加消息,然后关闭文件。如果传入的消息不多,这似乎是一种很好的做法,但是如果会话流很快,这似乎很慢,并且需要很多不必要的操作,因为文件将立即重新打开 然后我想,如果我只是让文件保持打开状态,在消息到达文件时写下消息,然后定期关闭它会怎么样。这是好的做法吗?让文件长时间打开?例如,在

所以我尝试将来自消息网络用户的消息写入一个文件。我试图用良好的java实践和适当的文件IO技术构建这个程序

目前,我的程序识别出有人发布了一条消息,接收该消息并立即将其写入文件。创建file对象,创建writer对象,附加消息,然后关闭文件。如果传入的消息不多,这似乎是一种很好的做法,但是如果会话流很快,这似乎很慢,并且需要很多不必要的操作,因为文件将立即重新打开

然后我想,如果我只是让文件保持打开状态,在消息到达文件时写下消息,然后定期关闭它会怎么样。这是好的做法吗?让文件长时间打开?例如,在一个小时后还是在写入了大量数据之后

现在,我想我应该获取消息,将它们存储在“缓存”(类似于字符串数组)中,然后在“缓存”已满时将字符串数组保存到文件中。这是更好的做法吗

所以我有两个问题:

1) 如果您不使用某个文件,那么将其打开一段时间(几分钟到几小时)是否是一种良好的做法

2) 对于我所说的“缓存”,什么是好的实践?字符串数组好吗?有更好的吗?您将如何存储这些信息?

1)如果您不使用文件,将文件打开一段时间(几分钟到几小时)是否是一种良好的做法

我认为这取决于你的程序有多少条消息,以及每条消息的大小。如果你的记忆力能满足你的计算,你可以考虑一下。但当每一条消息出现时(可能是一个blob),我会考虑在数据库上写一写。还要考虑一下,如果您的程序在写入文件时崩溃,会发生什么情况。您可能会丢失存储在内存中的全部消息

2) 对于我所说的“缓存”,什么是好的实践?字符串数组好吗?有更好的吗?您将如何存储这些信息


如果您是临时存储在内存数组中的数据,则在您知道大小时,该数组是正常的。否则,您可以使用ArrayList。

长时间打开一个文件绝对没有问题。这当然比反复打开和关闭要好得多。单个打开的文件消耗的资源量可以忽略不计;您唯一关心的是是否有很多打开的文件(数百或数千个)。我建议您在程序启动时打开该文件,并在程序完成时关闭它

如果您使用合适的工具来检查您的程序或系统上的其他程序所持有的打开的文件,您会发现所有这些程序在其整个生命周期中都持有一定数量的打开的文件(几到几十个)——任何包含程序代码的文件(Java程序的可执行文件、共享库和JAR文件),当这些文件被打开并映射到内存时,通常也会记录文件。这是正常和安全的


现在,您需要在这段时间内访问流(或编写器,或
RandomAccessFile
,或您使用的任何内容)。您应该在需要确保写入该点的所有数据都已安全写入磁盘时执行此操作;这可能是在每条消息之后,或者在给定数量的消息、数据量或时间段之后,正如您所认为的那样。

在我看来,服务器应用程序中日志(和类似日志)的最佳实践是确定可接受的时间延迟并坚持它。例如,如果设置了5秒延迟,则编写代码以便:

  • 如果您在日志中写入了一些内容,它将在5秒内“真正”写入
  • 如果在5秒之前写入了其他内容,则只会将其添加到缓冲区(在时间结束时写入)
这样,每5秒最多只能写一次磁盘,但肯定是写的。与其他方法相比,这一点比较好:

  • 如果每次写入数据时都将数据刷新到磁盘,但负载会增加,并且每秒有10000个事件,那么每秒写入10000个磁盘将浪费I/O时间
  • 如果让Java/OS来决定何时刷新数据,但负载非常低(例如在半夜),那么日志甚至可能过期数小时。(如果有一个事件的大小不足以填满缓冲区,则数小时内不会发生任何事件。)
我最近没有看过API,看看是否有一种内置的方法来实现这一策略,但它很容易编码。顺便说一下,不需要手动缓存输出;只要使用BufferedOutputStream,并在需要将其写入磁盘时调用flush()对象即可。(这样,当它达到缓冲区限制时,它也会自动写入,但如果您明智地选择限制,这可能没问题。)


关于让文件保持打开状态,您可以让文件保持打开状态,只要您愿意(只需在不再写入文件时将其关闭)。假设您没有打开数千个文件,并且不需要让多个应用程序写入同一个文件,这不会导致任何问题。

>服务器应用程序中日志(以及类似日志)的最佳做法是确定可接受的时间延迟并坚持执行。你能详细说明一下怎么做吗?或者给我指个方向,让我知道怎么做?另外,关于如何使用BuffereoutpStream的更多信息也很好。我正试图用正确的方法使用它。还有其他课程需要参与吗?如何学习使用flush()方法。这也是一个很好的回答,谢谢。BufferedOutputStream非常简单;就像调用了FileOutputStream一样,只需执行new BufferedOutputStream(out)并像使用FileOutputStream一样使用它。如果您使用的是写入程序,则有一个缓冲写入程序。T