как использовать темы с чтением / записью файлов? - PullRequest
0 голосов
/ 20 апреля 2011

Домашнее задание просит меня реализовать программу, которая считает слова в одном или нескольких файлах (имена файлов указываются в качестве аргументов в командной строке), начиная новый поток для каждого файла.

Вот моя проблема: метод run () не может вызвать IOException, потому что метод run () в интерфейсе Runnable не выбрасывает его.Я обошел все предупреждения компилятора, поместив вызовы конструктора File и Scanner в конструктор моего класса, который реализует Runnable, но даже сейчас, когда он хорошо компилируется, я все равно чувствую себя неуютно, как будто делаю что-то не кошерное.Есть мысли?

import java.io.File;
import java.util.Scanner;
import java.io.FileNotFoundException;
import java.io.IOException;

public class WordCounter implements Runnable {
    File inFile;
    Scanner in;
    int characters;
    int words;
    int lines;
    int[] counted;

    public WordCounter(String aFile) throws FileNotFoundException {
        inFile = new File(aFile);
        in = new Scanner(inFile);
        counted = new int[3];
    }

    public int[] getTotals() {
        return counted;
    }

    public void run() {
        characters = 0;
        words = 0;
        lines = 0;
        while (in.hasNextLine()) {

            String thisLine = in.nextLine();
            lines++;
            Scanner line = new Scanner(thisLine);
            while (line.hasNext()) {
                String thisWord = line.next();
                words++;
                characters++; // because each call to line.next() strips a whitespace character
                Scanner word = new Scanner(thisWord);
                word.useDelimiter("");
                while (word.hasNext()) {
                    char ch = word.next().charAt(0);
                    characters++;
                }
            }
        }
        counted[0] = characters;
        counted[1] = words;
        counted[2] = lines;
    }

}

Ответы [ 4 ]

0 голосов
/ 20 апреля 2011

Я думаю, что общее эмпирическое правило будет обрабатывать исключение как можно ближе к тому месту, где оно выброшено.Что мешает вашему исполняемому файлу обработать исключение вместо main () или что-то еще, создающее исполняемые файлы?

Я согласен, что инициализация переменной обычно лучше всего выполнять в конструкторе, но при использовании запускаемых таблицполучить лучшую производительность, если такая конструкция происходит в вашем методе run ().Я конкретно говорю о переменных, которые на самом деле занимают некоторое время для обработки;int [3] не будет иметь значения, будет ли он в вашем конструкторе или методе run, но Scanner и File могут зависеть от того, что они делают после инициализации (например, Scanner буферизует первую строку файла, например?).

0 голосов
/ 20 апреля 2011

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

try {
    inFile = new File(aFile);
} catch (FileNotFoundException e) {
    System.out.println("file not found, aborting operation.");
    return;
}

Однако я думаю, что нет ничего плохого в инициализации файла в конструкторе; Это хорошая практика, если вы хотите потерпеть неудачу раньше, чем ждать до позднего вечера.

0 голосов
/ 20 апреля 2011

Если проблема в проверенном исключении, то обычным языком является преобразование его в RuntimeException, что-то вроде этого:

try {
 ...
} catch (IOException e) {
    throw new RuntimeException(e);
}

В основном вы ловите, конвертируете и отбрасываете. RuntimeException не проверено, поэтому подписи метода не нужно объявлять его.

0 голосов
/ 20 апреля 2011

Инициализация переменных-членов в конструкторе обычно является хорошей практикой.Я думаю, что вы делаете все правильно, и, кроме того, я бы перенес инициализации characters, words и lines в конструктор.

...