Java: чтение целых чисел из файла в массив
File fil = new File("Tall.txt");
FileReader inputFil = new FileReader(fil);
BufferedReader in = new BufferedReader(inputFil);
int [] tall = new int [100];
String s =in.readLine();
while(s!=null)
{
int i = 0;
tall[i] = Integer.parseInt(s); //this is line 19
System.out.println(tall[i]);
s = in.readLine();
}
in.close();
Я пытаюсь использовать файл Tall.txt для записи целых чисел, содержащихся в них, в массив с именем "высокий". Он делает это в некоторой степени, но также когда я запускаю его, он выдает следующее исключение (:
Exception in thread "main" java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at BinarySok.main(BinarySok.java:19)
Почему именно он это делает и как его удалить? Как я вижу, я читаю файл как строки, а затем преобразую его в ints, что не является незаконным.
Ответы
Ответ 1
Возможно, вы захотите сделать что-то вроде этого (если вы находитесь в java 5 и выше)
Scanner scanner = new Scanner(new File("tall.txt"));
int [] tall = new int [100];
int i = 0;
while(scanner.hasNextInt()){
tall[i++] = scanner.nextInt();
}
Ответ 2
У вас должна быть пустая строка в вашем файле.
Возможно, вы захотите обернуть вызовы parseInt в блоке "try":
try {
tall[i++] = Integer.parseInt(s);
}
catch (NumberFormatException ex) {
continue;
}
Или просто проверьте пустые строки перед разбором:
if (s.length() == 0)
continue;
Обратите внимание, что при инициализации вашей индексной переменной i
внутри цикла она всегда равна 0. Вы должны перенести объявление перед циклом while
. (Или сделать его частью цикла for
.)
Ответ 3
Для сравнения, вот еще один способ прочитать файл. У него есть одно преимущество: вам не нужно знать, сколько целых чисел есть в файле.
File file = new File("Tall.txt");
byte[] bytes = new byte[(int) file.length()];
FileInputStream fis = new FileInputStream(file);
fis.read(bytes);
fis.close();
String[] valueStr = new String(bytes).trim().split("\\s+");
int[] tall = new int[valueStr.length];
for (int i = 0; i < valueStr.length; i++)
tall[i] = Integer.parseInt(valueStr[i]);
System.out.println(Arrays.asList(tall));
Ответ 4
Похоже, что Java пытается преобразовать пустую строку в число. У вас есть пустая строка в конце серии чисел?
Возможно, вы можете исправить код, подобный этому
String s = in.readLine();
int i = 0;
while (s != null) {
// Skip empty lines.
s = s.trim();
if (s.length() == 0) {
continue;
}
tall[i] = Integer.parseInt(s); // This is line 19.
System.out.println(tall[i]);
s = in.readLine();
i++;
}
in.close();
Ответ 5
У вас могут быть путаницы между разными окончаниями строк. Файл Windows завершит каждую строку возвратом каретки и фидом строк. Некоторые программы в Unix будут читать этот файл так, как если бы у него была лишняя пустая строка между каждой строкой, потому что он увидит возврат каретки как конец строки, а затем увидит, что линия-канал является еще одним концом строки.
Ответ 6
File file = new File("E:/Responsibility.txt");
Scanner scanner = new Scanner(file);
List<Integer> integers = new ArrayList<>();
while (scanner.hasNext()) {
if (scanner.hasNextInt()) {
integers.add(scanner.nextInt());
} else {
scanner.next();
}
}
System.out.println(integers);