0

Java で解決しようとしている小さな問題について、いくつかの提案を受け取りたいと思います。

次の形式のファイルがあります。

@
some text
some text
some text

@
some text
some text
some text

@
some text
some text
some text

...等々。

このテキスト ファイルの次のチャンクを読み取ってから、読み取ったチャンクを構成する InputStream オブジェクトを作成し、その InputStream オブジェクトをパーサーに渡す必要があります。テキスト ファイル内のすべてのチャンクに対して、これらの操作を繰り返す必要があります。各チャンクは、@ で始まる行の間に書き込まれます。問題は、InputStream から各チャンクを読み取るパーサーを使用して、@ タグ間の各セクションを解析することです。

テキストファイルが大きくなる可能性があるので、良いパフォーマンスを得たいです。

どうすればこの問題を解決できますか?

私はこのようなことを考えました:

    FileReader fileReader = new FileReader(file);

    BufferedReader bufferedReader = new BufferedReader(fileReader);

    Scanner scanner = new Scanner(bufferedReader);

    scanner.useDelimiter("@");

    List<ParsedChunk> parsedChunks = new ArrayList<ParsedChunk>();

    ChunkParser parser = new ChunkParser();

    while(scanner.hasNext())
    {
        String text = scanner.next();

        InputStream inputStream = new ByteArrayInputStream(text.getBytes("UTF-8"));

        ParsedChunk parsedChunk = parser.parse(inputStream);

        parsedChunks.add(parsedChunk);

        inputStream.close();
    }

    scanner.close();

しかし、それが良い方法かどうかはわかりません。

ありがとうございました。

4

2 に答える 2

0

私が正しく理解していれば。これがあなたが達成しようとしていることです。参考までに、以下のコードを実行するには JAVA 7 が必要です。

public static void main(String[] args) throws IOException {
    List<String> allLines = Files.readAllLines(new File("d:/input.txt").toPath(), Charset.defaultCharset());
    List<List<String>> chunks = getChunks(allLines);
    //Now you have all te chunks and you can process them
}

private static List<List<String>> getChunks(List<String> allLines) {
    List<List<String>> result = new ArrayList<List<String>>();
    int i = 0;
    int fromIndex = 1;
    int toIndex = 0;
    for(String line : allLines){
        i++;
        if(line.startsWith("****") && i != 1){ // To skip the first line and the check next delimiter
            toIndex = i-1;          
            result.add(allLines.subList(fromIndex, toIndex));
            fromIndex = i;
        }
    }
    return result;
}
于 2013-10-05T12:11:14.070 に答える
0

質問はよくわかりませんでしたが、現時点で char を使用して、すべての文字を char 配列に格納し、「@」に遭遇するたびに文字列を分割するループと条件付きステートメントを実行することができます

于 2013-10-05T12:21:35.163 に答える