2013-11-07 2 views
6

Я знаю, как читать файл с Java с использованием Scanner и File IOException, но единственное, что я не знаю, - это как сохранить текст в файлах как массив.Java читает файл и сохраняет текст в массиве

Вот snippet моего кода:

public static void main(String[] args) throws IOException{ 
    // TODO code application logic here 

    // // read KeyWestTemp.txt 

    // create token1 
    String token1 = ""; 

    // for-each loop for calculating heat index of May - October 


    // create Scanner inFile1 
    Scanner inFile1 = new Scanner(new File("KeyWestTemp.txt")); 

    // while loop 
    while(inFile1.hasNext()){ 

     // how can I create array from text read? 

     // find next line 
     token1 = inFile1.nextLine(); 

Вот что содержит мой KeyWestTemp.txt файл:

70.3, 70.8, 73.8, 77.0, 80.7, 83.4, 84.5, 84.4, 83.4, 80.2, 76.3, 72.0 

ответ

12

хранятся в виде строк:

public class ReadTemps { 

    public static void main(String[] args) throws IOException { 
    // TODO code application logic here 

    // // read KeyWestTemp.txt 

    // create token1 
    String token1 = ""; 

    // for-each loop for calculating heat index of May - October 

    // create Scanner inFile1 
    Scanner inFile1 = new Scanner(new File("KeyWestTemp.txt")).useDelimiter(",\\s*"); 

    // Original answer used LinkedList, but probably preferable to use ArrayList in most cases 
    // List<String> temps = new LinkedList<String>(); 
    List<String> temps = new ArrayList<String>(); 

    // while loop 
    while (inFile1.hasNext()) { 
     // find next line 
     token1 = inFile1.next(); 
     temps.add(token1); 
    } 
    inFile1.close(); 

    String[] tempsArray = temps.toArray(new String[0]); 

    for (String s : tempsArray) { 
     System.out.println(s); 
    } 
    } 
} 

Для поплавков:

import java.io.File; 
import java.io.IOException; 
import java.util.LinkedList; 
import java.util.List; 
import java.util.Scanner; 

public class ReadTemps { 

    public static void main(String[] args) throws IOException { 
    // TODO code application logic here 

    // // read KeyWestTemp.txt 

    // create token1 

    // for-each loop for calculating heat index of May - October 

    // create Scanner inFile1 
    Scanner inFile1 = new Scanner(new File("KeyWestTemp.txt")).useDelimiter(",\\s*"); 


    // Original answer used LinkedList, but probably preferable to use ArrayList in most cases 
    // List<Float> temps = new LinkedList<Float>(); 
    List<Float> temps = new ArrayList<Float>(); 

    // while loop 
    while (inFile1.hasNext()) { 
     // find next line 
     float token1 = inFile1.nextFloat(); 
     temps.add(token1); 
    } 
    inFile1.close(); 

    Float[] tempsArray = temps.toArray(new Float[0]); 

    for (Float s : tempsArray) { 
     System.out.println(s); 
    } 
    } 
} 
+0

'new LinkedList ();' что оправдывает использование связанного списка в этом случае? – njzk2

+0

@ njzk2 Хм, я не думаю, что для этого есть веская причина. ArrayList, вероятно, будет предпочтительнее, если в список не будет добавлено неизвестное большое количество температур. Обновлен мой ответ. – rainkinz

+0

это большой. Хороший пример – JegsVala

0
int count = -1; 
String[] content = new String[200]; 
while(inFile1.hasNext()){ 

    content[++count] = inFile1.nextLine(); 
} 

EDIT

Похоже, вы хотите создать массив с плавающей точкой, для этого создать буи

int count = -1; 
Float[] content = new Float[200]; 
while(inFile1.hasNext()){ 

    content[++count] = Float.parseFloat(inFile1.nextLine()); 
} 

тогда ваш массив поплавка будет выглядеть

content[0] = 70.3 
content[1] = 70.8 
content[2] = 73.8 
content[3] = 77.0 and so on 
+0

сбой, как только в файле содержится более 200 строк. что с преинкрементацией? count будет содержать количество строк чтения - 1 .... – njzk2

+0

Да, 200 было предположением, я обычно храню содержимое в одном массиве. Да, счетчик будет хранить количество прочитанных строк. –

+0

в вашем случае, нет, счет 0, когда была прочитана 1 строка. 'Я обычно храню содержимое в одном массиве'. Я не понял эту часть. – njzk2

0
while(inFile1.hasNext()){ 

    token1 = inFile1.nextLine(); 

    // put each value into an array with String#split(); 
    String[] numStrings = line.split(", "); 

    // parse number string into doubles 
    double[] nums = new double[numString.length]; 

    for (int i = 0; i < nums.length; i++){ 
     nums[i] = Double.parseDouble(numStrings[i]); 
    } 

} 
0

Просто прочитайте весь файл в StringBuilder, а затем разделить строку на точке следующего пробела. Вы получите массив строк.

Scanner inFile1 = new Scanner(new File("KeyWestTemp.txt")); 

StringBuilder sb = new Stringbuilder(); 
while(inFile1.hasNext()) { 
    sb.append(inFile1.nextLine()); 
} 

String[] yourArray = sb.toString().split(", "); 
+0

Можете ли вы объяснить мне более подробно, что вы подразумеваете под этим, я довольно новичок в программировании на Java. –

+0

Отредактированный и добавленный пример. –

2

Если вы не знаете количество строк в вашем файле, у вас нет размера, с помощью которого можно инициализировать массив. В этом случае имеет смысл использовать список:

List<String> tokens = new ArrayList<String>(); 
while (inFile1.hasNext()) { 
    tokens.add(inFile1.nextLine()); 
} 

После этого, если вам нужно, вы можете скопировать в массив:

String[] tokenArray = tokens.toArray(new String[0]); 
0

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

String st, full; 
full=""; 
BufferedReader br = new BufferedReader(new FileReader(URL)); 
while ((st=br.readLine())!=null) { 
    full+=st; 
} 

«полный» будет завершенной комбинацией всех линий. Если вы хотите добавить разрыв строки между строками текста вы могли бы сделать full+=st+"\n";

+0

это невероятно медленно даже на небольших файлах в диапазоне 100kb-1mb. вы можете увидеть некоторые статистические данные здесь http://stackoverflow.com/a/17757230/347508 вместо этого используйте построитель строк! – kritzikratzi

-1

Я использую этот метод:

import java.util.Scanner; 
import java.io.File; 
import java.io.FileNotFoundException; 

public class TEST { 
    static Scanner scn; 

public static void main(String[] args) { 
    String text = ""; 

    try{ 
     scn = new Scanner(new File("test.txt")); 
    }catch(FileNotFoundException ex){System.out.println(ex.getMessage());} 
    while(scn.hasNext()){ 
     text += scn.next(); 
     } 
     String[] arry = text.split(","); 

    //if need converting to float do this: 
    Float[] arrdy = new Float[arry.length]; 
    for(int i = 0; i < arry.length; i++){ 
      arrdy[i] = Float.parseFloat(arry[i]); 
     } 
    System.out.println(Arrays.toString(arrdy)); 
      } 
} 
+0

Почему вы используете 'Scanner' для чтения файла в предварительно разделенном виде, чтобы просто присоединиться к частям и разделить их снова? В чем причина добавить такой ответ на 3-летний вопрос без каких-либо новых хороших идей? Обратите внимание, что в вашем коде есть и другие «неприятные запахи». Почему 'scn' является статическим членом вместо локальной переменной? Что произойдет, если есть «FileNotFoundException»? (Подсказка: исключение NullPointerException). Не закрывать сканер также не очень хорошо, если этот фрагмент будет использоваться в более крупном приложении. – SergGr

Смежные вопросы