正如在评论中提到的那样,使用像SQLite这样的数据库可能是一个非常好的解决方案。 但是,如果你坚持使用文件,那么这当然是可能的。
我自己做了一次 - 使用文件在磁盘上创建了一个持久队列。
下面是关于如何实现这一目标的指导方针:
- 该文件应包含一个报头指向下一个未处理记录(进入),并到下一个可用的地方写。
- 如果记录的长度是可变的,那么每个记录应该包含一个表示记录长度的标题。
- 您可能要添加到每个记录一个标志,表示该记录是否被处理
- 文件锁定可用于确保从被写入
- 使用低级别文件的部分没有人阅读IO - 不要使用任何类型的缓冲流,使用直接写入语义
这里是读写的方案(可能有一些小的逻辑错误,但你应该可以从中获取它):
READER
- 锁定文件头和阅读并解锁回
- 转到最后一个记录位置
- 阅读记录头和记录
- 写记录头回来翻了处理标志on
- 如果你不在文件末尾锁定标题并写下下一个未处理记录的新位置否则写一些标记以表示没有更多记录要处理
- Ma柯确保下一个记录写点到正确的地方
您可能还希望读者在一段时间后压缩该文件为您提供:
- 锁定整个文件
- 复制所有未处理的记录到文件的开头(您可能希望保留一些逻辑,以便不覆盖未处理的记录 - 可能只在处理空间大于未处理空间时才为紧凑)
- 更新标头
- 解锁文件
撰稿人
- 锁定文件的头,看看下一个记录将被写入然后解锁
- 锁定来自地方的文件被写入记录的长度
- 写入记录并解锁
- 如果未处理的记录标记指示没有要处理的记录,请锁定标题让它指向新的re绳解开头
希望这将你写的轨道
你需要使用文件?为什么不使用内存守护它与互斥体? – Rolle
另一种方法可能是使用数据库(SQLite,SQL Server CE,...) – Alex
我警告你,如果你的应用程序被杀死,并且你正在使用缓冲IO,那么你可能会比你想象的要更担心。 – WhozCraig