Java: чтение целых чисел из файла в массив - PullRequest
13 голосов
/ 20 ноября 2008
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", чтобы записать содержащиеся в них целые числа в массив с именем "tall". Это делает это до некоторой степени, но также, когда я запускаю его, оно выдает следующее исключение (:

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)

Почему именно это происходит, и как мне это удалить? На мой взгляд, я читаю файл как строки, а затем преобразую его в целые, что не является незаконным.

Ответы [ 6 ]

43 голосов
/ 20 ноября 2008

Возможно, вы захотите сделать что-то подобное (если вы в 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();
}
9 голосов
/ 20 ноября 2008

В вашем файле должна быть пустая строка.

Возможно, вы захотите обернуть ваши вызовы parseInt в блок try:

try {
  tall[i++] = Integer.parseInt(s);
}
catch (NumberFormatException ex) {
  continue;
}

Или просто проверьте наличие пустых строк перед синтаксическим анализом:

if (s.length() == 0) 
  continue;

Обратите внимание, что при инициализации индексной переменной i внутри цикла она всегда равна 0. Вы должны переместить объявление до цикла while. (Или сделать его частью цикла for.)

3 голосов
/ 28 апреля 2009

Для сравнения, вот еще один способ прочитать файл. У него есть одно преимущество: вам не нужно знать, сколько в файле целых чисел.

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));
2 голосов
/ 20 ноября 2008

Похоже, 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();
1 голос
/ 20 ноября 2008

У вас могут возникнуть путаницы между различными окончаниями строки. Файл Windows заканчивает каждую строку возвратом каретки и переводом строки. Некоторые программы в Unix будут читать этот файл так, как если бы он имел дополнительную пустую строку между каждой строкой, поскольку он будет видеть возврат каретки как конец строки, а затем будет видеть перевод строки как другой конец строки.

0 голосов
/ 03 октября 2017
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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...