Как использовать PrintWriter и flush() для печати чего-либо в текстовом файле?

Я использую многопоточность для вычисления изображения. Каждый поток вычисляет строку, когда поток уже вычисляет строку, если следующий поток вычисляет строку после этой одной. Но я хочу быть уверенным, что каждая строка вычисляется ТОЛЬКО один раз, и для этого я мог бы сделать System.out.println(CalculatedLineNumber) и сделать вывод в текстовом файле, чтобы, когда я открываю его с текстом редактор, я сразу увижу, совпадает ли количество напечатанных строк с количеством строк в текстовом файле. Но как мне это сделать? Вот мой фрагмент кода для метода run(), в котором выполняются вычисления:

public void run() {

                int myRow;
                while ( (myRow = getNextRow()) < getHeight() ) {
                    image.setRGB(0, myRow, getWidth(), 1, renderLine(myRow), 0, 0);
                }
            }

Кто-то сказал мне, что я должен использовать PrintWriter и flush() или что-то в этом роде, но я не знаю, как это использовать. Может ли кто-нибудь помочь мне с этим? ("myRow" - это номер строки, который я хочу записать в текстовый файл, и все в разные строки)

Большое спасибо!!


person ZelelB    schedule 11.06.2012    source источник
comment
Я думаю, вам нужно RandomAccessFile.   -  person Eng.Fouad    schedule 11.06.2012


Ответы (1)


Я хочу быть уверен, что каждая строка вычисляется ТОЛЬКО один раз,

Я бы посоветовал вам использовать ExecutorService и отправлять каждую строку как задание изображения в пул потоков. См. внизу пример кода. Если вы сделаете это правильно, вам не нужно беспокоиться о том, сколько строк вывода будет.

Я мог бы сделать System.out.println(CalculatedLineNumber)

Я не совсем понимаю необходимость этого. Это своего рода учетный файл, который поможет вам убедиться, что все изображения были обработаны?

Кто-то сказал мне, что я должен использовать PrintWriter и flush()

Вам не нужно flush и PrintWriter, так как он уже синхронизирован ниже. Просто распечатайте результаты в конце каждого задания, и если вы отправили задания X строк на свой threadPool, вы получите X строк вывода.

Все, что вам нужно сделать, чтобы использовать PrintWriter, это:

PrintWriter printWriter = new PrintWriter(new File("/tmp/outputFile.txt"));
// each thread can do:
writer.println("Some sort of output: " + myRow);

Вот пример кода, показывающий, как использовать ExecutorService пулы потоков.

PrintWriter outputWriter = ...;
// create a thread pool with 10 workers
ExecutorService threadPool = Executors.newFixedThreadPool(10);
// i'm not sure exactly how to build the parameter for each of your rows
for (int myRow : rows) {
    // something like this, not sure what input you need to your jobs
    threadPool.submit(new ImageJob(outputWriter, myRow, getHeight(), getWidth()));
}
// once we have submitted all jobs to the thread pool, it should be shutdown
threadPool.shutdown();
...
public class ImageJob implements Runnable {
    private PrintWriter outputWriter;
    private int myRow;
    private int height;
    private int width;
    public MyJobProcessor(PrintWriter outputWriter, int myRow, int height,
            int width, ...) {
        this.outputWriter = outputWriter;
        this.myRow = myRow;
        this.height = height;
        this.width = width;
    }
    public void run() {
        image.setRGB(0, myRow, width, 1, renderLine(myRow), 0, 0);
        outputWriter.print(...);
    }
}
person Gray    schedule 11.06.2012
comment
привет, Грей, спасибо за очень хороший ответ. Но думаю, что мне нужно, гораздо проще: это просто System.out.println(myRow) в цикле while. Но у меня будет слишком много строк на консоли, поэтому будет лучше, если этот вывод будет в текстовом файле. только как мне это сделать, без особых сложностей :-) Спасибо! - person ZelelB; 11.06.2012
comment
Хм. Ok. Я добавил использование PrintWriter. Это то, что вам нужно? - person Gray; 11.06.2012
comment
Да, спасибо .. но все еще есть проблема: eclipse сообщает об исключении Unhandled FileNotFoundException с помощью PrintWriter printWriter = new PrintWriter(new File("outputFile.txt")); . Когда я добавляю в run(), выдает затмение FileNotFoundExcpetion, скажите мне, чтобы я удалил это ... что мне делать? - person ZelelB; 11.06.2012
comment
О, парень. Вам нужно обработать исключение. См. здесь: docs.oracle.com/javase/tutorial/essential/exceptions - person Gray; 12.06.2012