我有一个将信息写入文件的应用程序。此信息在执行后用于确定应用程序的通过/失败/正确性。我希望能够在写入文件时读取它,这样我就可以实时执行这些通过/失败/正确性检查。
我假设这样做是可能的,但是在使用Java时会涉及到哪些问题呢?如果读操作赶上了写操作,它会等待更多的写操作,直到文件关闭,还是此时读操作会抛出异常?如果是后者,我该怎么办?
我的直觉目前正将我推向BufferedStreams。这是要走的路吗?
发布于 2008-09-30 19:32:25
无法使用FileChannel.read(ByteBuffer)
使示例工作,因为它不是阻塞读取。然而,我得到了下面的代码:
boolean running = true;
BufferedInputStream reader = new BufferedInputStream(new FileInputStream( "out.txt" ) );
public void run() {
while( running ) {
if( reader.available() > 0 ) {
System.out.print( (char)reader.read() );
}
else {
try {
sleep( 500 );
}
catch( InterruptedException ex ) {
running = false;
}
}
}
}
当然,同样的事情也可以作为计时器而不是线程来工作,但是我把它留给了程序员。我仍然在寻找一种更好的方法,但目前这对我来说是可行的。
哦,我需要注意的是:我使用的是1.4.2。是的,我知道我还在石器时代。
发布于 2015-09-30 03:08:15
如果你想在文件被写入的同时读取它,并且只读取新的内容,那么下面的内容将帮助你实现同样的目的。
要运行这个程序,您需要从命令提示符/终端窗口启动它,并将文件名传递给read。它将读取文件,除非您终止该程序。
java FileReader c:\myfile.txt
当您键入一行文本时,从记事本中保存它,您将在控制台中看到打印的文本。
public class FileReader {
public static void main(String args[]) throws Exception {
if(args.length>0){
File file = new File(args[0]);
System.out.println(file.getAbsolutePath());
if(file.exists() && file.canRead()){
long fileLength = file.length();
readFile(file,0L);
while(true){
if(fileLength<file.length()){
readFile(file,fileLength);
fileLength=file.length();
}
}
}
}else{
System.out.println("no file to read");
}
}
public static void readFile(File file,Long fileLength) throws IOException {
String line = null;
BufferedReader in = new BufferedReader(new java.io.FileReader(file));
in.skip(fileLength);
while((line = in.readLine()) != null)
{
System.out.println(line);
}
in.close();
}
}
发布于 2008-09-01 16:31:54
您还可以查看java通道来锁定文件的一部分。
http://java.sun.com/javase/6/docs/api/java/nio/channels/FileChannel.html
FileChannel
的这个功能可能是一个开始
lock(long position, long size, boolean shared)
此方法的调用将被阻塞,直到区域被锁定
https://stackoverflow.com/questions/4149
复制相似问题