我有一个tomcat服务器,我有一个控制器,它写入一个文件,请求中的数据。所以我怀疑服务器中的多个线程是否可以同时写入同一个文件并导致问题?
我的要求是所有请求都将数据附加到同一个文件。我没有使用任何线程。
我的代码如下:
File file = new File(fileName);
try {
if(!file.exists()) {
file.createNewFile();
}
InputStream inputStream = request.getInputStream();
FileWriter fileWriter = new FileWriter(fileName,true);
BufferedWriter bufferWriter = new BufferedWriter(fileWriter);
bufferWriter.write(IOUtils.toString(inputStream));
bufferWriter.flush();
bufferWriter.close();
}
答案 0 :(得分:2)
此问题有标准解决方案。
您必须创建singleton
类,它将在所有线程之间共享。
此singleton
将有一些BlockingQueue
(例如LinkedBlockingQueue
),其中所有线程都会将其消息写入单个文件中。
此singleton
由它自己也是Thread
,在其run()
方法中,它将take
来自queue
的值,并按顺序将其写入{{1}}需要的文件。
答案 1 :(得分:0)
我的要求是所有请求都将数据附加到同一个文件
为每个请求执行任务(例如记录或在您的情况下,将文本附加到文件)最好使用过滤器(javax.servlet.Filter
)来实现。您不必手动创建单件,然后您可以在需要其功能时打开或关闭过滤器。
但是,您仍需要同步对文件的并发访问。正如Andremoniy指出的那样,你可以使用自己的Thread做到这一点,这样你的过滤器就不会阻止请求/响应。
修改强>
关于用于写入文件的共享对象的一件事:最好将此对象的实例存储在javax.servlet.ServletContext
中,而不是创建单个对象。如果您需要使用servlet使Java Web应用程序中的所有其他组件都可以访问该对象,那么这是标准的方法。