我将对你的问题做一些假设:
- 每条消息都以消息类型开头,作为一个固定大小的字段
- 您有一个异构输入文件,其中包含混合消息;您需要 N 个同质输出文件,其中每个输出文件仅包含给定类型的消息。
想到的方法是基于函子的:您创建消息类型到处理该特定消息的对象的映射。您的 main() 是一个调度循环,它读取固定的消息头,从映射中找到适当的函子,然后调用它。
您可能无法同时打开 6,000 个文件(每种消息类型一个);大多数操作系统都有大约 1,024 个同时打开文件的限制(尽管使用 Linux,您可以更改控制它的内核参数)。所以这意味着您将反复打开和关闭文件。
可能最好的方法是在每个仿函数上设置一个固定计数的缓冲区,以便它在 10 条消息之后打开、写入和关闭。如果您的消息最大为 50 字节,那么在任何给定时间将保留在内存中的 500 字节 (10 x 50) x 6,000。
我可能会编写我的仿函数来保存固定大小的字节数组,并创建一个通用仿函数类,一次将 N 个字节读取到该数组中:
public class MessageProcessor
{
int _msgSize; // the number of bytes to read per message
byte[] _buf = new byte[1024]; // bigger than I said, but it's only 6 Mb total
int _curSize; // when this approaches _buf.length, write