如何查看新内容的文件并检索该内容 [英] How to watch file for new content and retrieve that content
问题描述
我有一个名为 foo.txt
的文件。这个文件包含一些文本。我想实现以下功能:
$ b
- 我启动程序
- 写入文件例如添加一行:
foo.txt中的新字符串
) - 我只想得到这个文件的新内容。 >
你能澄清这个问题的最佳解决方案吗?另外我想解决相关的问题:如果我修改 foo.txt
我想看比较。
我在Java中找到的最接近的工具是 WatchService
,但是如果我明白这个工具只能检测文件系统上发生的事件类型(创建文件或删除或修改)。 >
void getFileContents(String path,List< String> contents)抛出FileNotFoundException,IOException {
contents.clear );
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(path),UTF-8));
String line = null; ((line = reader.readLine())!= null){
contents.add(line);
while
$ b $ p
- 我在
List< String>
中加载了原始文件内容。 li>我使用 Apache Commons VFS 来监听文件更改,使用 FileMonitor
。您可能会问, ?由于 WatchService
只能从Java 7开始使用,而 FileMonitor
至少可以使用Java 5(个人偏好,如果你更喜欢 WatchService
你可以使用它)。 note :Apache Commons VFS依赖于 Apache Commons Logging ,你必须添加到你的构建路径,以使其工作。
- 我创建了一个
FileListener
,然后我实现 fileChanged
方法。
- 该方法从文件中加载新内容,并使用
Patch.diff
code>检索所有的差异,然后打印它们
- 我创建了一个
DefaultFileMonitor
,它基本上监听文件的变化,我添加了我的文件。
- 我启动了监视器。
监视器启动后,它将开始监听文件更改。
I have a file with name foo.txt
. This file contains some text. I want to achieve following functionality:
- I launch program
- write something to the file (for example add one row:
new string in foo.txt
)
- I want to get ONLY NEW content of this file.
Can you clarify the best solution of this problem? Also I want resolve related issues: in case if I modify foo.txt
I want to see diff.
The closest tool which I found in Java is WatchService
but if I understood right this tool can only detect type of event happened on filesystem (create file or delete or modify).
解决方案 Java Diff Utils is designed for that purpose.
final List<String> originalFileContents = new ArrayList<String>();
final String filePath = "C:/Users/BackSlash/Desktop/asd.txt";
FileListener fileListener = new FileListener() {
@Override
public void fileDeleted(FileChangeEvent paramFileChangeEvent)
throws Exception {
// use this to handle file deletion event
}
@Override
public void fileCreated(FileChangeEvent paramFileChangeEvent)
throws Exception {
// use this to handle file creation event
}
@Override
public void fileChanged(FileChangeEvent paramFileChangeEvent)
throws Exception {
System.out.println("File Changed");
//get new contents
List<String> newFileContents = new ArrayList<String> ();
getFileContents(filePath, newFileContents);
//get the diff between the two files
Patch patch = DiffUtils.diff(originalFileContents, newFileContents);
//get single changes in a list
List<Delta> deltas = patch.getDeltas();
//print the changes
for (Delta delta : deltas) {
System.out.println(delta);
}
}
};
DefaultFileMonitor monitor = new DefaultFileMonitor(fileListener);
try {
FileObject fileObject = VFS.getManager().resolveFile(filePath);
getFileContents(filePath, originalFileContents);
monitor.addFile(fileObject);
monitor.start();
} catch (InterruptedException ex) {
ex.printStackTrace();
} catch (FileNotFoundException e) {
//handle
e.printStackTrace();
} catch (IOException e) {
//handle
e.printStackTrace();
}
Where getFileContents
is :
void getFileContents(String path, List<String> contents) throws FileNotFoundException, IOException {
contents.clear();
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF-8"));
String line = null;
while ((line = reader.readLine()) != null) {
contents.add(line);
}
}
What I did:
- I loaded the original file contents in a
List<String>
.
- I used Apache Commons VFS to listen for file changes, using
FileMonitor
. You may ask, why? Because WatchService
is only available starting from Java 7, while FileMonitor
works with at least Java 5 (personal preference, if you prefer WatchService
you can use it). note: Apache Commons VFS depends on Apache Commons Logging, you'll have to add both to your build path in order to make it work.
- I created a
FileListener
, then I implemented the fileChanged
method.
- That method load new contents form the file, and uses
Patch.diff
to retrieve all differences, then prints them
- I created a
DefaultFileMonitor
, which basically listens for changes to a file, and I added my file to it.
- I started the monitor.
After the monitor is started, it will begin listening for file changes.
这篇关于如何查看新内容的文件并检索该内容的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!