Запись и чтение из / в тот же файл - PullRequest
0 голосов
/ 26 декабря 2011

Можно ли читать и записывать один и тот же текстовый файл одновременно?

Первый поток добавит текстовые строки в файл, добавит «конечную» строку, когда данных нет.

Второй поток должен прочитать данные из этого файла и заблокировать, если появятся новые данные. он должен заканчиваться, когда он читает «конечную» строку.

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();
            }
        }

    }
    }

UPDATE:

если я добавлю fbw.flush() after fbw.newLine(); Я думаю, что это будет работать.

Ответы [ 2 ]

0 голосов
/ 26 декабря 2011

Если вы действительно хотите использовать файл для координации, сделайте его файлом произвольного доступа, который существует в стороннем объекте с синхронизированным методом, скажем

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

Это принимает логический оператор, чтобы определить, хотите ли вы прочитать информацию или написать информацию. Затем передайте вторую строку с данными, которые вы хотите записать. Если вы решите читать вместо этого, используйте возвращаемое значение в качестве вывода.

0 голосов
/ 26 декабря 2011

Конечно. Вы можете сделать что-то вроде использования BlockingQueue в качестве посредника. Опросите его, пока что-нибудь не появится, затем запишите его во второй поток. Первый поток просто продолжает вставлять объекты String в очередь по мере их чтения.

Есть много более сложных способов сделать это, но это простой и грязный способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...