如何使用文件读/写的线程?

时间:2011-04-19 21:56:57

标签: java multithreading ioexception

家庭作业要求我实现一个程序,通过为每个文件启动一个新线程来计算一个或多个文件中的单词(文件名在命令行中被指定为参数)。

这是我的问题:run()方法不能抛出IOException,因为Runnable接口中的run()方法不会抛出一个。通过将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 :(得分:0)

在构造函数中初始化成员变量通常是很好的做法。我认为你做的是正确的事情,而且,我还会将characterswordslines的初始化移动到构造函数中。

答案 1 :(得分:0)

您可以静默异常,并中止线程内的文件操作。是否默认异常取决于你想要做什么。

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

但是,我认为在构造函数中初始化文件没有任何问题;如果你想早点失败而不是等到以后,这是一个非常好的做法。

答案 2 :(得分:0)

我认为一般的经验法则是处理异常,尽可能接近抛出的位置。什么阻止你的runnable处理异常,而不是你的main()或创建runnables的什么?

我同意变量初始化通常最好在构造函数中完成,但是当使用runnables时,如果在run()方法中进行构造,则会获得更好的性能。我特别谈到实际需要一些时间来处理的变量; int [3]在构造函数或run方法中是否会产生影响,但是扫描程序和文件可能取决于它们在初始化时的作用(例如,Scanner是否缓冲了文件的第一行?)。

答案 3 :(得分:-1)

如果问题是检查过的异常,那么常见的习惯用法是将其转换为RuntimeException,如下所示:

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

基本上你抓住,转换和重新抛出。取消选中RuntimeException,因此方法签名不需要声明它。