您好我已经为kafka使用者创建了一个用于接收消息的控制台应用程序。
class Program
{
static void Main(string[] args)
{
string topic = "IDGTestTopic";
Uri uri = new Uri("http://localhost:9092");
var options = new KafkaOptions(uri);
var router = new BrokerRouter(options);
var consumer = new Consumer(new ConsumerOptions(topic, router));
foreach (var message in consumer.Consume())
{
Console.WriteLine(Encoding.UTF8.GetString(message.Value));
//Saving messages in files
string lines = Encoding.UTF8.GetString(message.Value);
System.IO.File.WriteAllText(@"C:\Project\Kafka Research\Kafka_Consumer\Kafka_Consumer\KafkaMessages\Messages.txt", lines);
}
}
}
如何保存文件中的所有邮件?
答案 0 :(得分:2)
对于每条消息,System.IO.File.WriteAllText
将覆盖该文件,因此创建的文件将仅包含最新消息。
为了将所有邮件保留在一个文件中,您可以将System.IO.File.WriteAllText
替换为System.IO.File.AppendAllText
,如下所示:
foreach (var message in consumer.Consume()) {
Console.WriteLine(Encoding.UTF8.GetString(message.Value));
//Saving messages in files
string lines = Encoding.UTF8.GetString(message.Value);
System.IO.File.AppendAllText(@"C:\Project\Kafka Research\Kafka_Consumer\Kafka_Consumer\KafkaMessages\Messages.txt", lines);
}
根据文件,
File.AppendAllText Method (String, String)
打开文件,将指定的字符串附加到文件中,然后 关闭文件。如果该文件不存在,则此方法创建一个 file,将指定的字符串写入文件,然后关闭文件。
和File.WriteAllText Method (String, String)
创建新文件,将指定的字符串写入文件,然后 关闭文件。如果目标文件已存在,则会被覆盖。
答案 1 :(得分:1)
每次使用消息时,都会覆盖整个文件:
System.IO.File.WriteAllText
您需要在消费循环之外执行此操作。
答案 2 :(得分:0)
@ Giorgos Myrianthous你以前的第二选择在某些方面更好。附加到字符串构建器并且只在循环外写入一次到文件很可能比在每个循环中多次遍历IO快得多。这是我的建议:
StringBuilder linebuilder = new StringBuilder(); //this line outside the loop
foreach (var message in consumer.Consume()) {
Console.WriteLine(Encoding.UTF8.GetString(message.Value));
//Saving messages in files
linebuilder.Append(Encoding.UTF8.GetString(message.Value)); //this line inside the loop
}
System.IO.File.AppendAllText(@"C:\Project\Kafka Research\Kafka_Consumer\Kafka_Consumer\KafkaMessages\Messages.txt", linebuilder.ToString(());