Java - 编写一种方法来计算文本文件中的行而不会抛出异常

时间:2014-10-27 03:14:28

标签: java netbeans file-io exception-handling line-count

以下是来自Number of lines in a file in Java的解决方案 快速计算文本文件中的行数。

但是,我正在尝试编写一个方法来执行相同的任务,而不会抛出'IOException'。

在原始解决方案下我尝试使用嵌套的try-catch块< - (这通常是完成/不赞成/或容易避免吗??),无论有多少行都返回0给定文件(显然是失败)。

为了清楚起见,我不是在寻找有关如何更好地使用包含异常的原始方法的建议,因此,我使用它的上下文与此问题无关。

有人可以帮我写一个方法来计算文本文件中的行数并且不会抛出任何异常吗? (换句话说,用try-catch处理潜在的错误。)

马丁努斯的原始行计数器:

public static int countLines(String filename) throws IOException {
    InputStream is = new BufferedInputStream(new FileInputStream(filename));
    try {
        byte[] c = new byte[1024];
        int count = 0;
        int readChars = 0;
        boolean empty = true;
        while ((readChars = is.read(c)) != -1) {
            empty = false;
            for (int i = 0; i < readChars; ++i) {
                if (c[i] == '\n') {
                    ++count;
                }
            }
        }
        return (count == 0 && !empty) ? 1 : count;
    } finally {
        is.close();
    }
}

我的尝试:

public int countLines(String fileName ) {
   InputStream input = null;
        try{
        try{
            input = new BufferedInputStream(new FileInputStream(fileName));
            byte[] count = new byte[1024];
            int lines = 0;
            int forChar;
            boolean empty = true;
            while((forChar = input.read(count)) != -1){
                empty = false;
                for(int x = 0; x < forChar; x++){
                    if(count[x] == '\n'){
                        lines++;
                    }
                }
            }
            return (!empty && lines == 0) ?  1 : lines + 1;
        }
        finally{
            if(input != null)
            input.close();
        }
        }
        catch(IOException f){
            int lines = 0;
            return lines;
        }
    }

2 个答案:

答案 0 :(得分:0)

对于'\ n'使用char而不是byte是更健壮的,并且在出现任何错误时返回-1,例如,如果文件名不存在:

    public static int countLines(String filename) {
    BufferedReader br = null;
    try {
        br = new BufferedReader(new InputStreamReader(new FileInputStream(filename)));
        char[] c = new char[1024];
        int count = 0;
        int readChars = 0;
        boolean emptyLine = true;
        while ((readChars = br.read(c)) != -1) {
            for (int i = 0; i < readChars; ++i) {
                emptyLine = false;
                if (c[i] == '\n') {
                    ++count;
                    emptyLine = true;
                }
            }
        }
        return count + (!emptyLine ? 1 : 0);
    } catch (IOException ex) {
        return -1;
    } finally {
        if (br != null)
            try {
                br.close();
            } catch (IOException e) {
                // Ignore intentionally
            }
    }
}

答案 1 :(得分:-1)

分享我的尝试。

public static int countLines(String filename) {
    InputStream is = new BufferedInputStream(new FileInputStream(filename));
    int numLines = 0;
    try {
        byte[] c = new byte[1024];
        int count = 0;
        int readChars = 0;
        boolean empty = true;
        while ((readChars = is.read(c)) != -1) {
            empty = false;
            for (int i = 0; i < readChars; ++i) {
                if (c[i] == '\n') {
                    ++count;
                }
            }
        }
        numLines = (count == 0 && !empty) ? 1 : count;
    } catch (IOException ex) {
        numLines = 0;
    } catch (FileNotFoundException ex) {
        System.out.println("File not found.");
        numLines = 0;
    } finally {
        is.close();
    }
    return numLines;
}