2013-07-15 2 views
1

если у меня есть эта строка в файле: 2 18 4 3 и я хочу прочитать ее как отдельные целые числа, как я могу?преобразование одной строки в отдельные целые числа

я использую bufferreader:

BufferedReader(new FileReader("mp1.data.txt")); 

я пытался использовать:

BufferedReader(new RandomAccessFile("mp1.data.txt")); 

так что я могу использовать метод

.readCahr(); 

, но я получил сообщение об ошибке

если я использую

int w = in.read(); 

он будет читать ASCII, и я хочу его, как он есть (в дес.)

я думал, чтобы прочитать его как строку, но затем я мог отделить каждый номер?

также я думал, чтобы каждое число в строке, но файл у меня есть длинный с номерами

+0

[Сканер # nextInt] (http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextInt()) может работать. – Dukeling

+0

Прочитайте строку в строке с именем line. Затем используйте String [] values ​​= line.split (""); затем преобразовать каждое значение в int – AlexWien

ответ

0

После того, как вы читаете строку с помощью BufferedReader, вы можете использовать String.split(regex) метод для разбиения строки пробела ("\\s").

for(String s : "2 18 4 3".split("\\s")) { 
     int i = Integer.parseInt(s); 
     System.out.println(i); 
    } 
1

Важно использовать более сложные проблемы в разработке программного обеспечения, разбив их на более мелкие. В этом случае, у вас есть три задачи:

  1. прочитать строку из файла
  2. разбить его на отдельные части (еще строк)
  3. Convert каждую часть в целое

Java делает каждый из них просто:

  1. Используйте BufferedReader.readLine(), чтобы прочитать строку в виде строки первого
  2. Похоже, расщепление так просто, как расщепление на пространстве с String.split():

    String[] bits = line.split(" "); 
    

    Если это не достаточно хорошо, вы можете использовать более сложное регулярное выражение в split вызова.

  3. Проанализируйте каждую часть используя Integer.parseInt().

Другим вариантом для расщепления части является использование Splitter класса от Guava. Лично я предпочитаю это, но это вопрос вкуса.

0

Если вы используете Java 7+, вы можете использовать этот метод полезности:

List<String> lines = Files.readAllLines(file, Charset.forName("UTF-8")); 
for (String line: lines) { 
    String[] numbers = line.split("\\s+"); 
    int firstNumber = Integer.parseInt(numbers[0]); 
    //etc 
} 
1

Вы можете split() строку, а затем использовать метод Integer.parseInt() для того, чтобы преобразовать все элементы в Integer объектов.

try { 
    BufferedReader br = new BufferedReader(new FileReader("mp1.data.txt")); 
    String line = null; 
    while ((line = br.readLine()) != null) { 
    String[] split = line.split("\\s"); 
    for (String element : split) { 
     Integer parsedInteger = Integer.parseInt(element); 
     System.out.println(parsedInteger); 
    } 
    } 
} 
catch (IOException e) { 
    System.err.println("Error: " + e); 
} 
5

Рассмотрим с помощью Scanner:

Scanner scan = new Scanner(new File("mp1.data.txt")); 

Вы можете использовать scan.nextInt() (который возвращает int, не String) так долго, как scan.hasNextInt().

Нет необходимости для этого уродливого расщепления и разбора :)

Однако, обратите внимание, что этот подход будет продолжать чтение целых чисел мимо первой линии (если это не то, что вы хотите, вы, вероятно, следует соблюдать рекомендации, изложенные в другие ответы для чтения и обработки только одной строки).

Кроме того, hasNextInt() вернет false, как только в файле обнаружено нецелое число. Если вам нужен способ обнаружения и обработки недействительных данных, вы должны снова рассмотреть другие ответы.

+0

Лично я не являюсь поклонником API «Сканера». Мой опыт вопросов переполнения стека заключается в том, что это слишком легко использовать плохо. Я думаю, что расщепление и разборчивость чище, чем «Сканер» здесь: он гарантирует, что вы получите только целые числа из * одной строки и знаете, сколько из них есть. Как ваше решение работает, если в следующей строке * также есть целые числа? И как это указывает на отказ? –

+0

@JonSkeet Как и все, это зависит от большего контекста того, что OP действительно пытается сделать. Его описание проблемы, по крайней мере, на мой взгляд, указывает на сценарий, для которого специально разработан «Сканер». Если OP требует подробных подробностей, то он может непременно продолжать использовать «BufferedReader», но упоминание «Scanner» является разумным. – arshajii

+0

Ну, он сказал, что у него есть «эта строка в файле» без указания, что это строка * только * в файле. Я могу придумать больше ситуаций, в которых это решение не подходит *, чем ситуации, когда это лучший подход. Здесь многое может пойти не так, и вы не упомянули об этом. –

0

Попробуйте это;

try{ 
    // Open the file that is the first 
    FileInputStream fstream = new FileInputStream("textfile.txt"); 
    BufferedReader br = new BufferedReader(new InputStreamReader(fstream)); 
    String strLine; 
    //Read File Line By Line 
    while ((strLine = br.readLine()) != null) { 
     //split line by whitespace 
     String[] ints = strLine.split(" "); 

     int[] integers = new int[ints.length]; 

     // to convert from string to integers - Integer.parseInt ("123") 
     for (int i = 0; i < ints.length; i++) { 
      integers[i] = Integer.parseInt(ints[i]); 
     } 
     // now do what you want with your integer 
     // ... 
    } 
    in.close(); 
} catch (Exception e) {//Catch exception if any 
    System.err.println("Error: " + e.getMessage()); 
} 
Смежные вопросы