【问题标题】:Can PrintWriter write to an "open" text file (Java)PrintWriter 可以写入“打开”文本文件(Java)
【发布时间】:2018-09-04 13:46:32
【问题描述】:

我需要创建一个 java 程序的一部分,该程序会“秘密地”记录用户使用该程序所做的所有活动。纯粹是为了抓住试图“欺骗”系统的人。问题是,多人将在多台计算机上使用同一个程序

所有信息都需要使用 PrintWriter 写入单个文本文件,稍后将由程序的管理部分使用。

 PrintWriter printer = new PrintWriter(new FileWriter(serverFolderLocation + "\\LogUserInfo.txt", true));

预计有 50 多台计算机将使用此程序,每隔几秒,每次按下计算机上的特定按钮时,预计会向该文件写入 7 行以上的文本数组

我知道将文本写入文本文件非常快,这不太可能发生,但是如果 2 台或更多计算机碰巧同时写入文本文件,而 append 设置为 true,数据会不会失踪?还是会正常附加?

这甚至可能吗? 2+ 设备在不同时间将数据写入文本文件?

请注意,来自所有 50 多台计算机的所有数据都必须到达目标文件,这一点很重要。

如果可能出现问题,除了建立专用数据库之外,还有什么其他方法可以做到这一点?

【问题讨论】:

  • 嗨 Jaco,欢迎来到 Unix 和 Linux SR 站点。为什么你认为这是一个 unix/linux 问题?您有什么原因没有向我们解释吗?

标签: java file printwriter


【解决方案1】:

Setting append to true in the FileWriter:

append - 如果为真,则为布尔值,则数据将被写入文件的末尾而不是开头。

如果您有 50 台机器同时执行这一切,就会发生冲突。当您尝试修改正在被另一个进程使用的文件时,您的计算机会报错,不要再加入 50 个竞争者。

您可以尝试使用Sockets

哪台机器拥有该文件,将其指定为“服务器”,并将其他机器设为“客户端”。您的客户端向服务器发送消息,您的服务器以同步方式将这些消息附加到文件中。

然后,您可以通过某些网络和服务器安全性来阻止您的约 50 个客户端直接更改日志文件。

【讨论】:

  • 如果我有大约 50 台机器从一个文件中读取,而没有任何改变? (扫描仪)不要以为这会引起问题吗?谢谢你的回答,这对以后的项目肯定有帮助,这个项目只需要用文本文件完成就可以了
  • 如果在您尝试读取文件时更改文件可能会出现问题。中间人方法会更好,因为它可以确保最终只有一个读者和一个作者,并且两者都不会同时发生。
【解决方案2】:

您只是在这里重新发明轮子,但是以一种非常错误的方式。另一个答案是正确的:使用一个简单的文件,并且让多个分布式用户写入同一个文件只会为失败而尖叫。

但我不同意改用套接字的想法。那是非常低级的,并且需要您自己实现很多(复杂的)事情。您将不得不考虑网络问题、多线程、锁定、缓冲……

当然,如果这是为了教育,那么构建这样的东西是一个挑战。但是,如果您的目标是找到一个可行的强大解决方案,那么您应该考虑使用一些现成的第 3 方解决方案。

您可以开始阅读here。然后选择一个框架,例如 logback。或者,您可以查看 消息传递服务,例如 ActiveMQ 或 RabbitMQ。

再次重申:在分布式环境中创建和收集日志是 A)难以正确,但 B)已解决问题。

【讨论】:

  • 感谢您的回答!我最终让每台计算机创建一个名为其 IP 地址的新文本文件,然后写入它,然后,所有内容都被处理为一个文本文件,我知道使用文本文件可能看起来不适合其他软件的可能,但是该项目是尽可能少的服务,我非常感谢您的回答,因为它对未来的项目很有用!
  • 当然,我很欣赏你的回归!总是很高兴听到回音。 “每个节点一个文件”的想法是一个很好的折衷方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多