18

分析のためにBufferedReaderを使用してtxtファイルから数値を読み取っています。私が今これについて行っている方法は、.readlineを使用して行を読み取り、.splitを使用してこの文字列を文字列の配列に分割することです。

public InputFile () {
    fileIn = null;

    //stuff here

    fileIn = new FileReader((filename + ".txt"));
    buffIn = new BufferedReader(fileIn);


    return;
    //stuff here
}

public String ReadBigStringIn() {
    String line = null;

    try { line = buffIn.readLine(); }
    catch(IOException e){};

    return line;
}

public ProcessMain() {
    initComponents();
    String[] stringArray;
    String line;

    try {
        InputFile stringIn = new InputFile();
        line = stringIn.ReadBigStringIn();
        stringArray = line.split("[^0-9.+Ee-]+"); 
        // analysis etc.
    }
}

これは正常に機能しますが、txtファイルに複数行のテキストがある場合はどうなりますか?単一の長い文字列を出力する方法、またはおそらくそれを行う別の方法はありますか?多分使用しwhile(buffIn.readline != null) {}ますか?これを実装する方法がわかりません。

アイデアを高く評価しました、ありがとう。

4

7 に答える 7

33

そうです、ここでループが必要になります。

通常のイディオム(プレーンJavaのみを使用)は次のようなものです。

public String ReadBigStringIn(BufferedReader buffIn) throws IOException {
    StringBuilder everything = new StringBuilder();
    String line;
    while( (line = buffIn.readLine()) != null) {
       everything.append(line);
    }
    return everything.toString();
}

これにより、改行が削除されます。改行を保持する場合は、readLine()メソッドを使用せずに、代わりに読み込むだけですchar[](そして、これをStringBuilderに追加します)。

このループはストリームが終了するまで実行されることに注意してください(終了しない場合はブロックされます)。したがって、ループを終了するために別の条件が必要な場合は、そこに実装してください。

于 2011-04-01T16:20:00.653 に答える
6

ここでライブラリを使用することを強くお勧めしますが、Java 8以降、ストリームを使用してこれを行うこともできます。

    try (InputStreamReader in = new InputStreamReader(System.in);
         BufferedReader buffer = new BufferedReader(in)) {
        final String fileAsText = buffer.lines().collect(Collectors.joining());
        System.out.println(fileAsText);
    } catch (Exception e) {
        e.printStackTrace();
    }

また、内部joiningで使用しているのと同じようにかなり効果的であることに気付くでしょう。StringBuilder

于 2016-06-29T13:54:09.670 に答える
2

ファイル全体を文字列に読み込みたいだけの場合は、GuavaFilesクラスを使用することをお勧めします。

String text = Files.toString("filename.txt", Charsets.UTF_8);

もちろん、それはあなたが改行を維持したいということを前提としています。改行を削除する場合は、その方法でロードしてからString.replaceを使用するか、Guavaを再度使用します。

List<String> lines = Files.readLines(new File("filename.txt"), Charsets.UTF_8);
String joined = Joiner.on("").join(lines);
于 2011-04-01T16:17:18.137 に答える
1

ApacheIOFileUtilsが必要なようですね

String text = FileUtils.readStringFromFile(new File(filename + ".txt"));
String[] stringArray = text.split("[^0-9.+Ee-]+");
于 2011-04-01T16:19:01.440 に答える
0

を作成するStringBuilderと、それにすべての行を追加toString()し、最後にを使用して文字列を返すことができます。

ReadBigStringIn()を次のように置き換えることができます

public String ReadBigStringIn() {
        StringBuilder b = new StringBuilder();

        try {
            String line = buffIn.readLine();
            while (line != null) {
                b.append(line);
                line = buffIn.readLine();
            }
        }
        catch(IOException e){};

        return b.toString();
}
于 2011-04-01T16:19:45.530 に答える
0

これにより長い文字列が作成され、すべての行が文字列 ""(1つのスペース)から分離されます。

public String ReadBigStringIn() {
    StringBuffer line = new StringBuffer();


    try { 
        while(buffIn.ready()) {
        line.append(" " + buffIn.readLine());
    } catch(IOException e){
        e.printStackTrace();
    }

    return line.toString();
}
于 2011-04-01T16:22:46.013 に答える
0

doubleを含むファイルがあります。1行に複数の番号があり、複数の行がある可能性があります。

最も簡単な方法は、whileループで行を読み取ることです。

最後の行に達したときにReadBigStringInメソッドからnullを返し、そこでループを終了することができます。

しかし、より一般的なのは、1つの方法でリーダーを作成して使用することです。おそらく、ファイルを読み取り、doubleの配列またはリストを返すメソッドに変更できます。

ところで、文字列を空白で単純に分割できますか?

ファイル全体を1つの文字列に読み込むことは特定のケースに適している場合がありますが、ファイルが非常に大きい場合はメモリが爆発する可能性があることに注意してください。ストリーミングアプローチは、一般的にそのようなi/oに対してより安全です。

于 2011-04-01T16:24:22.170 に答える