0

以下は、 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;
        }
    }
4

2 に答える 2

0

'\n' に byte の代わりに char を使用し、ファイル名が存在しないなどのエラーが発生した場合に -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
            }
    }
}
于 2014-10-27T04:09:38.407 に答える
-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;
}
于 2014-10-27T03:38:10.877 に答える