Как заполнить ArrayList из слов в текстовом файле?

У меня есть текстовый файл, содержащий слова, разделенные новой строкой, например, в следующем формате:

>hello  
>world  
>example 

Как создать ArrayList и сохранить каждое слово как элемент?


person Deepankar Bajpeyi    schedule 01.04.2012    source источник
comment
Это похоже на обычное домашнее задание - пожалуйста, добавьте тег, если это так.   -  person Andreas Dolk    schedule 01.04.2012


Ответы (6)


Вы можете использовать общие ресурсы apache FileUtils.readLines().

Я думаю, что возвращаемое List уже является ArrayList, но вы можете использовать конструктор ArrayList(Collection), чтобы убедиться, что вы его получили.

person amit    schedule 01.04.2012

public static void main(String[] args) throws IOException{ // TODO Автоматически сгенерированный метод-заглушка

    File file = new File("names.txt");
    ArrayList<String> names = new ArrayList<String>();
    Scanner in = new Scanner(file);
    while (in.hasNextLine()){
        names.add(in.nextLine());
    }
    Collections.sort(names);
    for(int i=0; i<names.size(); ++i){
        System.out.println(names.get(i));
    }
person daniel owens    schedule 28.11.2012

Самый простой способ — использовать Guava:

File file = new File("foo.txt");
List<String> words = Files.readLines(file, Charsets.UTF_8);

(Не гарантируется, что это будет ArrayList, но я надеюсь, что это не имеет значения.)

person Jon Skeet    schedule 01.04.2012

Вы читаете файл построчно, создаете ArrayList для строк и добавляете line.substring(1) к определенному ArrayList, если line.length>0.

person dexametason    schedule 01.04.2012
comment
Я использовал line.substring(1), потому что в его образце указано, что у него есть '›' в начале каждой строки. - person dexametason; 01.04.2012

Я помещаю файл в "C:\file.txt"; если вы запустите следующее, он заполнит ArrayList словами и распечатает их.

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;


public class Main {

    public static void main(String[] args) throws Exception {
        File file = new File("C:\\file.txt");
        BufferedReader br = new BufferedReader(new FileReader(file));
        List<String> lines = new ArrayList<String>();
        String line = br.readLine();
        while(line != null) {
            lines.add(line.replace(">", ""));
            line = br.readLine();
        }
        for(String l : lines) {
            System.out.println(l);
        }
    }

}
person Tom    schedule 01.04.2012
comment
Как упоминалось в ответе Адама, я бы рекомендовал использовать InputStreamReader и указать кодировку. Кроме того, у вас должен быть блок try/finally, чтобы вы могли закрыть файл в любом случае. (Не проблема в крошечном образце, но я бы не хотел, чтобы OP поднимал этот код непосредственно в служебный метод.) - person Jon Skeet; 01.04.2012
comment
да ладно, его можно было бы немного полировать, но он делает то, что просят. - person Tom; 01.04.2012

Я уверен, что есть много библиотек, которые делают это с помощью 1 строки, но вот «чистая» реализация Java:

Обратите внимание, что мы «обернули»/«украсили» и т. д. стандартный FileReader (который считывал только один байт за раз) с помощью BufferedReader, который дает нам более удобный метод readLine().

BufferedReader reader = null;
try {
    reader = new BufferedReader(new InputStreamReader(
            new FileInputStream("test.txt"),
            Charset.forName("ISO-8859-1")));
    List<String> lines = new ArrayList<String>();
    String line;
    while ((line = reader.readLine()) != null) {
        lines.add(line);
    }
    System.out.println(lines);
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (reader != null) {
        reader.close();
    }
}
person Adam    schedule 01.04.2012
comment
Обратите внимание, что при этом будет использоваться кодировка символов по умолчанию, что обычно не является хорошей идеей. Я бы предложил использовать InputStreamReader, обернутый вокруг FileInputStream. Кроме того, вызов close должен находиться в блоке finally. Я бы предложил также позволить IOException всплывать вызывающему абоненту. - person Jon Skeet; 01.04.2012