4

私はtransactionHandler.logと呼ばれるログファイルを持っているという奇妙な問題を抱えています。これは17102行の非常に大きなファイルです。これはLinuxマシンで次のことを行うと取得します。

wc -l transactionHandler.log
17102 transactionHandler.log

しかし、次のJavaコードを実行して行数を出力すると、o/pとして2040が得られます。

import java.io.*;
import java.util.Scanner;
import java.util.Vector;

public class Reader {

    public static void main(String[] args) throws IOException {     
        int counter = 0; 
        String line = null;

         // Location of file to read
        File file = new File("transactionHandler.log");

        try {

            Scanner scanner = new Scanner(file);

            while (scanner.hasNextLine()) {
                line = scanner.nextLine();
                System.out.println(line);
                counter++;                    
            }
            scanner.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }           
        System.out.println(counter);        
    }
}

理由を教えてください。

4

1 に答える 1

8

私の知る限り、デフォルトでは区切り文字としてScanner使用されます。\nたぶんあなたのファイルには\r\n。これを変更するには、を呼び出すscanner.useDelimiterか、(これははるかに優れています)代わりにこれを使用してみてください。

import java.io.*;

public class IOUtilities
{
    public static int getLineCount (String filename) throws FileNotFoundException, IOException
    {
        LineNumberReader lnr = new LineNumberReader (new FileReader (filename));
        while ((lnr.readLine ()) != null) {}

        return lnr.getLineNumber ();
    }
}

LineNumberReaderのドキュメントによると:

改行は、改行('\ n')、キャリッジリターン('\ r')、またはキャリッジリターンの直後に改行が続くいずれかによって終了したと見なされます。

そのため、行末文字が異なるファイルに非常に適応できます。

それを試してみて、それが何をするか見てください。

于 2012-05-23T08:05:54.373 に答える