web-dev-qa-db-ja.com

テキストファイルJavaから1つの単語(または行)を読み取る方法は?

タイトルが言うように、テキストファイルから個々の単語を読み取ってそれらをString変数に格納できるプログラムを作成しようとしています。私はFileReaderまたはFileInputStreamを使用して単一のcharを読み取る方法を知っていますが、これを実行しようとしてもうまくいきません。単語を入力したら、.equalsを使用してこれらをプログラム内の他の文字列変数と比較しようとしているので、文字列としてインポートできるのが最善です。また、テキストファイルから行全体を文字列として入力することもできます。その場合、ファイルの各行に1つのWordを入力します。テキストファイルから単語を入力して文字列変数に保存するにはどうすればよいですか?

編集:さて、その重複した種類のヘルプ。それは私にとってはうまくいくかもしれませんが、私の質問が少し異なる理由は、重複が単一の行を読み取る方法を伝えるだけだからです。行の個々の単語を読み込もうとしています。したがって、基本的には文字列を分割します。

5
Ashwin Gupta

テキストファイルから行を読み取るには、これを使用できます(try-with-resourcesを使用)。

String line;

try (
    InputStream fis = new FileInputStream("the_file_name");
    InputStreamReader isr = new InputStreamReader(fis, Charset.forName("UTF-8"));
    BufferedReader br = new BufferedReader(isr);
) {
    while ((line = br.readLine()) != null) {
        // Do your thing with line
    }
}

同じもののよりコンパクトで読みにくいバージョン:

String line;

try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("the_file_name"), Charset.forName("UTF-8")))) {
    while ((line = br.readLine()) != null) {
        // Do your thing with line
    }
}

行を個々の単語に分割するには、 String.split を使用できます。

while ((line = br.readLine()) != null) {
    String[] words = line.split(" ");
    // Now you have a String array containing each Word in the current line
}
9
spork

これらはすべて本当に複雑な答えです。そして、それらはすべて役に立つと確信しています。しかし、私はエレガントにシンプルScannerを好みます:

public static void main(String[] args) throws Exception{
    Scanner sc = new Scanner(new File("fileName.txt"));
    while(sc.hasNext()){
        String s = sc.next();
        //.....
    }
}
11
Misha

StringTokenizerを使用する必要があります!ここで例を読み、これを読んでください String Tokenizer

private BufferedReader innerReader; 
public void loadFile(Reader reader)
        throws IOException {
    if(reader == null)
    {
        throw new IllegalArgumentException("Reader not valid!");
    }
        this.innerReader = new BufferedReader(reader);
    String line;
    try
    {
    while((line = innerReader.readLine()) != null)
    {
        if (line == null || line.trim().isEmpty())
            throw new IllegalArgumentException(
                    "line empty");
        //StringTokenizer use delimiter for split string
        StringTokenizer tokenizer = new StringTokenizer(line, ","); //delimiter is ","
        if (tokenizer.countTokens() < 4)
            throw new IllegalArgumentException(
                    "Token number not valid (<= 4)");
        //You can change the delimiter if necessary, string example
        /*
        Hello / bye , hi
        */
        //reads up "/"
        String hello = tokenizer.nextToken("/").trim();
        //reads up ","
        String bye = tokenizer.nextToken(",").trim();
        //reads up to end of line
        String hi = tokenizer.nextToken("\n\r").trim();
        //if you have to read but do not know if there will be a next token do this
        while(tokenizer.hasMoreTokens())
        {
          String mayBe = tokenizer.nextToken(".");
        }
    }
    } catch (Exception e) {
        throw new IllegalArgumentException(e);
    }
}
2
Michele Lacorte

Java8では、次のようなことができます。

import Java.io.IOException;
import Java.nio.file.Files;
import Java.nio.file.Paths;
import Java.util.Arrays;
import Java.util.Collections;
import Java.util.List;
import Java.util.stream.Collectors;

public class Foo {
    public List<String> readFileIntoListOfWords() {
        try {
            return Files.readAllLines(Paths.get("somefile.txt"))
                .stream()
                .map(l -> l.split(" "))
                .flatMap(Arrays::stream)
                .collect(Collectors.toList());
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        return Collections.emptyList();
    }
}

分割の引数を変更する必要があるのではないかと思いますが、たとえば、単語の終わりから句読点を取り除くために

1
beresfordt