Tag: 文件 oo

如何实现对Java中映射到内存的文件的并发读取?

我有许multithreading同时读取相同的文件(完全约100M),只有一个线程来更新文件。 我想将文件映射到内存中以减少文件I / O. 如何在Java中完成? 我基本上考虑了以下两种方法: 用字节数组来存储文件,每次创建ByteArrayInputStream以在multithreading读取时读取缓冲区。 使用NIO获取一个文件通道,同步通道以从MappedByteBuffer读取以进行multithreading读取。 我不确定这些方法是否有效。 如果有更好的解决方案,请帮助提供一些提示。

如何确保文件已成功写入?

我正在为Java中的图形应用程序添加自动保存function。 应用程序定期自动保存当前文档,并在退出时自动保存。 当用户启动应用程序时,将重新加载自动保存文件。 如果自动保存文件以任何方式损坏(我假设文件处于保存状态时断电会这样做吗?),用户将失去工作。 如何防止这种情况并尽我所能保证自动保存文档处于一致状态? 更复杂的是,要自动保存文档,我需要保存一个.xml文件和几个.png文件。 此外,.png保存发生在JNI上的C代码中。 我当前的策略是使用扩展名.png.tmp编写每个.png,编写扩展名为.xml.tmp的.xml文件,然后重命名每个文件以删除.tmp部分,将.xml保留到最后。 在启动时,我只加载自动保存文档,如果我能找到.xml文件并忽略.xml.tmp文件。 在重命名新文档的.xml.tmp文件之前,我也不会删除以前的自动保存文档。 我想我对你写入磁盘时会发生什么的了解很少。 我知道在使用文件时,您可以拥有软件读/写缓冲区,以及操作系统和硬件缓冲区,并且所有这些都需要刷新。 我很困惑如何确切地知道什么东西真的被写入磁盘以及我可以做些什么来保护自己。 重命名操作是否可以确保刷新缓冲区?

在Windows上检查Java中文件是否为空的最有效方法

我试图在Windows上用Java检查日志文件是否为空(意味着没有错误)。 到目前为止,我尝试过使用2种方法。 方法1(失败) FileInputStream fis = new FileInputStream(new File(sLogFilename)); int iByteCount = fis.read(); if (iByteCount == -1) System.out.println(“NO ERRORS!”); else System.out.println(“SOME ERRORS!”); 方法2(失败) File logFile = new File(sLogFilename); if(logFile.length() == 0) System.out.println(“NO ERRORS!”); else System.out.println(“SOME ERRORS!”); 现在,当日志文件为空(没有内容)时,这些方法都会失败,但文件大小不为零(2个字节)。 检查文件是否为空的最有效和最准确的方法是什么? 我要求提高效率,因为我必须循环检查文件大小数千次。 注意:文件大小只会徘徊在几到10 KB左右! 方法3(失败) 按照@ Cygnusx1的建议,我也尝试过使用FileReader ,但没有成功。 这是片段,如果有人感兴趣的话。 Reader reader = new FileReader(sLogFilename); int readSize = reader.read(); […]

如何在Java中快速检索目录列表?

假设一个非常简单的程序列出了给定目录的所有子目录。 声音够简单? 除了列出Java中所有子目录的唯一方法是使用FilenameFilter与File.list()结合使用。 这适用于琐碎的情况,但是当文件夹说出150,000个文件和2个子文件夹时,它在那里愚蠢地等待45秒,遍历所有文件并测试file.isDirectory()。 是否有更好的方法列出子目录? PS。 对不起,请保存有关在同一目录中包含太多文件的讲座。 我们的现场环境将此作为要求的一部分。