首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Java读取正在被主动写入的文件?

如何使用Java读取正在被主动写入的文件?
EN

Stack Overflow用户
提问于 2008-08-06 23:57:10
回答 8查看 58.2K关注 0票数 106

我有一个将信息写入文件的应用程序。此信息在执行后用于确定应用程序的通过/失败/正确性。我希望能够在写入文件时读取它,这样我就可以实时执行这些通过/失败/正确性检查。

我假设这样做是可能的,但是在使用Java时会涉及到哪些问题呢?如果读操作赶上了写操作,它会等待更多的写操作,直到文件关闭,还是此时读操作会抛出异常?如果是后者,我该怎么办?

我的直觉目前正将我推向BufferedStreams。这是要走的路吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2008-09-30 19:32:25

无法使用FileChannel.read(ByteBuffer)使示例工作,因为它不是阻塞读取。然而,我得到了下面的代码:

代码语言:javascript
运行
复制
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。是的,我知道我还在石器时代。

票数 45
EN

Stack Overflow用户

发布于 2015-09-30 03:08:15

如果你想在文件被写入的同时读取它,并且只读取新的内容,那么下面的内容将帮助你实现同样的目的。

要运行这个程序,您需要从命令提示符/终端窗口启动它,并将文件名传递给read。它将读取文件,除非您终止该程序。

java FileReader c:\myfile.txt

当您键入一行文本时,从记事本中保存它,您将在控制台中看到打印的文本。

代码语言:javascript
运行
复制
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();
    }
}
票数 15
EN

Stack Overflow用户

发布于 2008-09-01 16:31:54

您还可以查看java通道来锁定文件的一部分。

http://java.sun.com/javase/6/docs/api/java/nio/channels/FileChannel.html

FileChannel的这个功能可能是一个开始

代码语言:javascript
运行
复制
lock(long position, long size, boolean shared) 

此方法的调用将被阻塞,直到区域被锁定

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档