如何在添加行时读取文本文件

How to read a text file as lines are added

我被要求编写一个程序来读取文件更新 (4 times/millisecond) 并将行数打印到系统。为此,我有以下代码:

     package threadFile;
    import java.io.IOException;
    import java.io.FileReader;

    import java.io.BufferedReader;

public class ReadFile
{
private String path;

    public ReadFile(String file_name)
    {
        path = file_name;
    }

    public String[] OpenFile() throws IOException
    {
        FileReader fr = new FileReader(path);
        BufferedReader textReader = new BufferedReader(fr);

        int numberOfLines = readLines();
        String[]textData = new String[numberOfLines];

        int i;
        for(i=0; i< numberOfLines; i++)
        {
            textData[i] = textReader.readLine();
        }
        textReader.close();
        return textData;
    }

    @SuppressWarnings("unused")
    int readLines() throws IOException
    {
        FileReader file_to_read = new FileReader(path);
        BufferedReader bf = new BufferedReader(file_to_read);

        String aLine;
        int numberOfLines = 0;

        while ((aLine = bf.readLine()) != null)
        {
            numberOfLines++;
        }
        bf.close();

        return numberOfLines;
    }

以上代码的意思是打开一个文本文件并读取其中的行数。我的问题是,让程序在写入文件时更新(由程序的另一部分)。下面的代码是一个线程,旨在调用 ReadFile 以获取指令。 我需要程序不断读取内容,并在编辑时准确更新行数。

如果我对您的要求理解正确,您希望使用一个文件进行进程间通信(或线程间通信更适合您的情况)。如果是这种情况,您可能希望将该文件用作 MemoryMapped 文件。

MemoryMapped 文件使用的简单描述完成here.

如前所述,Java 1.7 Watch Service 也是一个可行的解决方案。

解决方案 我的问题的解决方案比预期的要复杂一些。

正在读取文件

package threadFile;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class PrintReader implements Runnable
{
    @SuppressWarnings("unused")
    private final String taskName;

    final String file_name = "C:/Users/wigginsm/Desktop/Log.txt";

    public PrintReader(String name)
    {
        taskName = name;
    }
    public void run()
    {
        boolean loop = true;
        while(loop = true)
        try
        {
            FileReader fr = new FileReader(file_name);
            BufferedReader br = new BufferedReader(fr);
            String line = br.readLine();
            int count = 0;
            while(line!=null)
            {
                count++;
                line=br.readLine();
            }
            FileInputStream fileIn = new FileInputStream(file_name);
            BufferedReader fileR = new BufferedReader(new InputStreamReader(fileIn));
            String strLine = null, tmp;
            while((tmp = fileR.readLine())!=null)
            {
                strLine = tmp;
            }
            String lastLine = strLine;
            System.out.println("Last entered line: " + lastLine + "\n" + "Total number of Lines: " + count);
            br.close();
            fileR.close();
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
}

上面的class负责读取文件,用"file_name"声明。

写入文件

    package threadFile;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Calendar;
public class WriteToFile implements Runnable
{
    @SuppressWarnings("unused")
    private final String taskName;
    class WriteFile
    {
        private String path;
        private boolean append_to_file = false;

        public WriteFile(String file_path, boolean append_value)
        {
            path = file_path;
            append_to_file = append_value;
        }

        public void writeToFile(String timestamp) throws IOException
        {
            int i = 0;
            while(i<1)
            {
              FileWriter write = new FileWriter(path, append_to_file);
              Calendar current = Calendar.getInstance();
              int ms = current.get(Calendar.MILLISECOND);
              int minute = current.get(Calendar.MINUTE);
              int second = current.get(Calendar.SECOND);
              int hour = current.get(Calendar.HOUR_OF_DAY);
              int day = current.get(Calendar.DAY_OF_YEAR);
              int month = current.get(Calendar.MONTH)+1;
              int year = current.get(Calendar.YEAR);
              timestamp = day + "/" + month + "/" + year + " " + hour  + ":" + minute + ":" + second + ":" + ms;

              PrintWriter print_line = new PrintWriter(write);
              try
              {
                  Thread.sleep(250);
              }
              catch(InterruptedException e)
              {
                  Thread.currentThread().interrupt();
              }
              print_line.printf("%s" + "%n", timestamp);
              print_line.close();
            }
       }
    }
    //constructor
    public WriteToFile(String name)
    {
        taskName = name;
    }
    @SuppressWarnings("unused")
    public synchronized void run()
    {
        boolean loop = true;
        while(loop = true)
        {
            try
            {   
                String file_name = "C:/Users/wigginsm/Desktop/Log.txt";
                Calendar current = Calendar.getInstance();
                int ms = current.get(Calendar.MILLISECOND);
                int minute = current.get(Calendar.MINUTE);
                int second = current.get(Calendar.SECOND);
                int hour = current.get(Calendar.HOUR_OF_DAY);
                int day = current.get(Calendar.DAY_OF_YEAR);
                int month = current.get(Calendar.MONTH)+1;
                int year = current.get(Calendar.YEAR);
                String timestamp = day + "/" + month + "/" + year + " " + hour  + ":" + minute + ":" + second + ":" + ms;
                WriteFile data = new WriteFile(file_name, true);
                data.writeToFile(timestamp);
            }

            catch(IOException e)
            {
                System.out.println(e.getMessage());
            }
        }
    }
}

以上代码负责写入文件。 while 循环无限期继续的唯一原因是由于我的程序规范。这可以很容易地改变以适应任何迭代。

执行

package threadFile;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;

public class execute
{
    public static void main(String[] args)
    {
        final String file_name = "C:/Users/wigginsm/Desktop/Log.txt";

        WriteToFile writes = new WriteToFile(file_name);
        PrintReader reads = new PrintReader(file_name);
        ExecutorService thread = Executors.newCachedThreadPool();

        thread.execute(reads);
        thread.execute(writes);

        thread.shutdown();
    }
}

这是主要的class,它负责处理线程。 PrintWrite 和 WriteToFile 都有 "synchronize" 语句,因为 classes 中的 运行() 访问文件。