40

現在、私はスキャナー/ファイルリーダーを使用しており、while hasextline を使用しています。この方法はあまり効率的ではないと思います。これと同様の機能を持つファイルを読み取る他の方法はありますか?

public void Read(String file) {
        Scanner sc = null;


        try {
            sc = new Scanner(new FileReader(file));

            while (sc.hasNextLine()) {
                String text = sc.nextLine();
                String[] file_Array = text.split(" ", 3);

                if (file_Array[0].equalsIgnoreCase("case")) {
                    //do something
                } else if (file_Array[0].equalsIgnoreCase("object")) {
                    //do something
                } else if (file_Array[0].equalsIgnoreCase("classes")) {
                    //do something
                } else if (file_Array[0].equalsIgnoreCase("function")) {
                    //do something
                } 
                else if (file_Array[0].equalsIgnoreCase("ignore")) {
                    //do something
                }
                else if (file_Array[0].equalsIgnoreCase("display")) {
                    //do something
                }
            }

        } catch (FileNotFoundException e) {
            System.out.println("Input file " + file + " not found");
            System.exit(1);
        } finally {
            sc.close();
        }
    }
4

8 に答える 8

43

必要なだけ高速であることがわかりますBufferedReader.readLine()。これを使用すると、1 秒間に数百万行を読み取ることができます。文字列の分割と処理が、発生しているパフォーマンスの問題を引き起こしている可能性が高くなります。

于 2013-10-21T04:43:42.727 に答える
8

ScannerBufferedReaderは、テキスト ファイルの読み取りに正規表現を使用するため、ほど高速ではありませんBufferedReader。を使用BufferedReaderすると、テキスト ファイルからブロックを読み取ることができます。

BufferedReader bf = new BufferedReader(new FileReader("FileName"));

次に、 readLine()を使用して bf から読み取ることができます。

それがあなたの目的に役立つことを願っています。

于 2015-06-08T14:16:09.760 に答える
0

プログラムのどの部分に時間がかかっているかを調査する必要があります。

EJPの回答によると、BufferedReaderを使用する必要があります。

本当に文字列処理に時間がかかる場合は、スレッドの使用を検討する必要があります。1 つのスレッドがファイルから読み取り、行をキューに入れます。他の文字列プロセッサ スレッドは、行をデキューして処理します。使用するスレッドの数を調査する必要があります。アプリケーションで使用する必要があるスレッドの数は、CPU のコア数と関連付ける必要があります。これにより、CPU がフルに使用されます。

于 2013-10-21T05:07:08.783 に答える
-2

すべての行をまとめて読みたい場合は、Java 7 の Files API を参照してください。使い方は非常に簡単です。

しかし、より良い方法は、このファイルをバッチで処理することです。ファイルから行のチャンクを読み取るリーダーと、必要な処理を行うかデータを保持するライターを用意します。アバッチを使用することで、将来的に回線数が 10 億に増えても機能することが保証されます。また、マルチスレッドを使用してバッチの全体的なパフォーマンスを向上させるバッチを作成することもできます。春のバッチをご覧になることをお勧めします。

于 2013-10-21T05:11:58.290 に答える