#java #text-files
#java #текстовые файлы
Вопрос:
Я пытаюсь прочитать данные из текстового файла и сохранить различные типы данных в переменные. Предполагая, что текстовый файл имеет следующую форму;
a 1000 1
b 2000 2
c 3000 3
Теперь я пытаюсь сохранить символы в отдельные переменные, а целые числа — в отдельные переменные.
Моя попытка до сих пор заключалась в том, что я считывал текстовый файл в строку, а затем использовал string tokenizer для сохранения каждого элемента в списке массива. У меня вроде как есть общее представление о том, как это сделать; проверьте, является ли элемент в списке символом, если да, сохраните его в символьной переменной или, если это целое число, сохраните его в int. Однако я не знаком с методами определения того, является ли что-либо строкой или целым числом, такими как isString, isInteger и т.д. И т.п. Кто-нибудь, пожалуйста, может дать мне несколько советов о том, как это сделать?
Мой код выглядит следующим образом:
public class copyToString {
public static void main(String[] args) {
String fileSpecified = args[0];
fileSpecified = fileSpecified.concat(".txt");
char [] content = new char[1024];
System.out.println ("file Specified = " fileSpecified);
String container;
ArrayList <String> words = new ArrayList<String> ();
try {
FileReader fr = new FileReader (fileSpecified);
BufferedReader br = new BufferedReader (fr);
StringBuilder builder = new StringBuilder();
int read = 0;
while ((read = br.read(content, 0, content.length)) > 0) {
builder.append(content, 0, read);
}
container = builder.toString();
StringTokenizer tokenizer = new StringTokenizer (container);
while (tokenizer.hasMoreTokens()) {
words.add(tokenizer.nextToken());
}
fr.close();
} catch (IOException e) {
System.out.println (e.getMessage());
}
for (int i = 0; i < words.size(); i ) {
System.out.println ("words = " words.get(i));
}
}
}
Спасибо
Комментарии:
1. вы могли бы использовать Scanner — это действительно проще, чем StringTokenizer. Одна вещь не ясна. Вы говорите, что формат входного файла известен, и даете пример, так почему вы хотите программно распознать тип переменной?
2. Спасибо Лукашу, сканер на самом деле проще, это также сэкономит мне время. Приведенный мною формат входного файла — это всего лишь один пример из многих, которые нам предоставили для выполнения задачи. Я должен рассматривать символы и целые числа отдельно, поскольку я буду иметь дело с ними по-разному. Является ли этот ответ тем, что вы, возможно, ожидали?
Ответ №1:
Я бы очень рекомендовал здесь библиотеку Apache Commons. Поскольку эта библиотека имеет
- Класс StringUtils, который имеет большую базу методов для проверки содержимого строки
- Класс IOUtils для удобного чтения файлов
Кроме того, я бы использовал простые группы регулярных выражений для идентификации ваших текстовых частей.
Подробности см. в разделе Шаблон и класс сопоставления. (Регулярное выражение для слов: » w», цифры «d»)
Ответ №2:
Если вы действительно не знаете, каким может быть каждый тип, вам нужно хранить каждое поле в виде строки, поскольку число типа 1000
может быть short, int, long, float, double или String. Является 1
числом, строкой или символом ‘1’? Без контекста вы не можете знать, что такое каждый тип. a
, b
и c
могут быть числами в шестнадцатеричном формате. 😉
Мне потребовалось бы больше времени, чтобы сказать, что я бы сделал по-другому, чем переписывать код. 😉
public class CopyToString {
static class Line {
String word;
int num1, num2;
Line(String word, int num1, int num2) {
this.word = word;
this.num1 = num1;
this.num2 = num2;
}
@Override
public String toString() {
return "Line{" "word='" word ''' ", num1=" num1 ", num2=" num2 '}';
}
}
public static void main(String... args) throws IOException {
String fileSpecified = args[0] ".txt";
System.out.println("file Specified = " fileSpecified);
BufferedReader br = new BufferedReader(new FileReader(fileSpecified));
List<Line> lines = new ArrayList<Line>();
for (String line; (line = br.readLine()) != null;) {
Scanner scanner = new Scanner(line);
lines.add(new Line(scanner.next(), scanner.nextInt(), scanner.nextInt()));
}
br.close();
for (Line l : lines)
System.out.println(l);
}
}
С принтами
file Specified = text.txt
Line{word='a', num1=1000, num2=1}
Line{word='b', num1=2000, num2=2}
Line{word='c', num1=3000, num2=3}
Комментарии:
1. Спасибо. Если, скажем, текстовый файл содержал данные неизвестной длины (учитывая, что объем данных в текстовом файле может варьироваться), нам пришлось бы объявить довольно много переменных. Теперь, чтобы избежать этого, возможно ли объявить массив char умеренного размера, а затем сохранить символы в нем и массив int и сделать то же самое?
2. Если вы можете предположить, что у вас есть только char или int, вы можете использовать обычный int[] (поскольку char помещается внутри int), В этом случае я бы использовал split и parseInt . Как вы будете определять различия между числом 1 и символом ‘1’
3. Предоставленные нами текстовые файлы всегда будут в том же формате, который я показал. В этом случае каждая строка должна начинаться с алфавита (char), а затем иметь значение int (например, 1000) и значение без знака int (например, 1). В таком случае, действительно ли мне нужно беспокоиться о различии между числом 1 и символом ‘1’?