Я хочу читать, текстовый файл, содержащий пространство, разделил значения. Значения являются целыми числами. Как я могу считать его и поместить его в список массива?
Вот пример содержания текстового файла:
1 62 4 55 5 6 77
Я хочу иметь его в arraylist как [1, 62, 4, 55, 5, 6, 77]
. Как я могу сделать это в Java?
Вы можете использовать Files # readAllLines ()
, чтобы поместить все строки текстового файла в Список
.
for (String line : Files.readAllLines(Paths.get("/path/to/file.txt"))) {
// ...
}
Учебное пособие: Базовый ввод-вывод> Файловый ввод-вывод> Чтение, запись и создание текстовых файлов
Вы можете использовать String # split ()
, чтобы разделить String
частями на основе регулярного выражения.
for (String part : line.split("\\s+")) {
// ...
}
Учебное пособие: Числа и строки> Строки> Управление символами в строке
Вы можете использовать Integer # valueOf ()
, чтобы преобразовать String
в ] Целое число
.
Integer i = Integer.valueOf(part);
Учебное пособие: Числа и строки> Строки> Преобразование между числами и строками
Вы можете использовать Список # add ()
, чтобы добавить элемент в список
.
numbers.add(i);
Учебное пособие: Интерфейсы> Интерфейс списка
Итак, в двух словах (при условии, что файл не имеет пустых строк или конечных / ведущих пробелов).
List<Integer> numbers = new ArrayList<>();
for (String line : Files.readAllLines(Paths.get("/path/to/file.txt"))) {
for (String part : line.split("\\s+")) {
Integer i = Integer.valueOf(part);
numbers.add(i);
}
}
Если вы уже используете Java 8, вы можете даже использовать для этого Stream API , начиная с Files # lines ()
.
List<Integer> numbers = Files.lines(Paths.get("/path/to/test.txt"))
.map(line -> line.split("\\s+")).flatMap(Arrays::stream)
.map(Integer::valueOf)
.collect(Collectors.toList());
Учебное пособие: Обработка данных с помощью потоков Java 8
В Java 1.5 появился класс Scanner для обработки ввода из файла и потоков.
Он используется для получения целых чисел из файла и будет выглядеть примерно так:
List<Integer> integers = new ArrayList<Integer>();
Scanner fileScanner = new Scanner(new File("c:\\file.txt"));
while (fileScanner.hasNextInt()){
integers.add(fileScanner.nextInt());
}
Однако проверьте API. Есть еще много вариантов работы с разными типами источников ввода, разными разделителями и разными типами данных.
Посмотрите на этот пример и попробуйте сделать свой собственный:
import java.io.*;
public class ReadFile {
public static void main(String[] args){
String string = "";
String file = "textFile.txt";
// Reading
try{
InputStream ips = new FileInputStream(file);
InputStreamReader ipsr = new InputStreamReader(ips);
BufferedReader br = new BufferedReader(ipsr);
String line;
while ((line = br.readLine()) != null){
System.out.println(line);
string += line + "\n";
}
br.close();
}
catch (Exception e){
System.out.println(e.toString());
}
// Writing
try {
FileWriter fw = new FileWriter (file);
BufferedWriter bw = new BufferedWriter (fw);
PrintWriter fileOut = new PrintWriter (bw);
fileOut.println (string+"\n test of read and write !!");
fileOut.close();
System.out.println("the file " + file + " is created!");
}
catch (Exception e){
System.out.println(e.toString());
}
}
}
Ради удовольствия, вот что я, вероятно, сделал бы в реальном проекте, где я уже использую все свои любимые библиотеки (в данном случае Guava , ранее известная как Google Collections ).
String text = Files.toString(new File("textfile.txt"), Charsets.UTF_8);
List<Integer> list = Lists.newArrayList();
for (String s : text.split("\\s")) {
list.add(Integer.valueOf(s));
}
Преимущество: не так много собственного кода, который нужно поддерживать (в отличие, например, от this ). Edit : Хотя стоит отметить, что в этом случае решение сканера tschaible больше не имеет кода!
Недостаток: очевидно, что вы можете не захотеть добавлять новые зависимости библиотеки только для этого. (Опять же, было бы глупо не использовать Guava в своих проектах.; -)