【问题标题】:Writing and Reading from/to same file从/向同一文件写入和读取
【发布时间】:2011-12-26 15:31:34
【问题描述】:

是否可以同时读取和写入相同的文本文件?

第一个线程将文本字符串添加到文件中,它会在没有数据时添加“结束”字符串。

第二个线程应该从该文件中读取数据,如果有更多新数据则阻塞。它应该在读取“结束”字符串时结束。

public class TheFileReader implements Runnable {


    public void run() {

        FileInputStream is = null;
        BufferedReader fbr = null;
        File file =  new File ("C:\\temp\\fileout3.txt");
        String s1 ="";

        try {       
            fbr = new BufferedReader(new FileReader(file), 1024*1024);

            while (s1.equals("exit")==false){
            s1 =fbr.readLine();
            if (s1==null){
                s1="";              
                Thread.sleep (50);
            }
            else
                System.out.println(s1);         
            }           

        } catch (IOException e) {           
            e.printStackTrace();
        } catch (InterruptedException e) {      
            e.printStackTrace();
        } finally
        {
            try {
                fbr.close();                        
            } catch (IOException e1) {

                e1.printStackTrace();
            }
        }

    }

public class TheFileWriter implements Runnable {

    public void run() {

        FileOutputStream os = null;
        BufferedWriter fbw = null;
        File file =  new File ("C:\\temp\\fileout3.txt");
        String s1 ="";

        try {       
            fbw = new BufferedWriter(new FileWriter(file), 1024*1024);
            for (int i = 0; i < 100; i++) {
                fbw.write("test" + i);
                fbw.newLine();
            }
            fbw.write("exit");

        } catch (IOException e) {           
            e.printStackTrace();
        } finally
        {
            try {
                fbw.close();                        
            } catch (IOException e1) {

                e1.printStackTrace();
            }
        }

    }
    }

更新:

如果我添加fbw.flush() after fbw.newLine(); 我认为它会起作用。

【问题讨论】:

标签: java multithreading io


【解决方案1】:

当然。你可以做一些事情,比如使用 BlockingQueue 作为你的中间人。轮询它直到那里有东西,然后将其写入第二个线程中的文件。第一个线程只是在读取字符串对象时不断地将它们弹出到队列中。

有很多更复杂的方法可以做到这一点,但这是一种简单而肮脏的方法。

【讨论】:

  • 我不确定我是否理解,我不认为我什至可以从 2 个线程访问同一个文件。
  • 哦,我明白你在说什么。你真的希望这由两个线程完成吗?这是做任何事情的可怕方式。如果您尝试使用 File 作为信号量来回传递数据,那也很糟糕。您能否更具体地说明您要解决的问题?
  • 更模糊:没有什么能阻止您在不同线程中打开同一文件上的 FileReader 和 FileWriter,但您会得到不可预知的结果,具体取决于您写入文件的时间和方式.您似乎正在尝试使用文件来协调数据传输。
  • 是的,我使用文件来协调数据传输,这是作为备份完成的。 (如果某些过程失败)
【解决方案2】:

如果你真的想用一个文件来协调,让它成为一个随机访问的文件,它存在于一个第三方对象中,用同步的方法,比如说

public synchronized String readWrite(boolean read, string writeStuff);

接受一个布尔运算符来确定您是要读取信息还是写入信息。然后传递第二个字符串,其中包含您要写入的数据。如果您决定改为阅读,请使用返回值作为输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 2015-06-12
    • 1970-01-01
    相关资源
    最近更新 更多