2011-01-17 2 views
1

Я могу успешно читать текстовый файл, используя классы InputFileStream и Scanner. Это очень легко, но мне нужно сделать что-то более сложное, чем это. Немного о моем проекте вначале. У меня есть устройство с датчиками, и я использую регистратор, который будет записывать каждые 10 сек данные от датчиков в текстовый файл. Каждые 10 секунд это новая строка данных. Так что я хочу, когда я читаю файл, это захватить каждый отдельный датчик в массив. Например: скорости высота широты долготыРазбор текстового файла с использованием java, предложения, необходимые для использования

22 250 46,123245 122,539283

25 252 46,123422 122,534223

Поэтому мне нужно, чтобы захватить данные высоты (250, 252) в альт массива []; и т. д. vel [], lat [], long [] ...

Тогда последняя строка текстового файла будет отличаться от информации только одной строкой. Он будет иметь дату, пройденное расстояние, timeElapsed.

Итак, после небольшого исследования я наткнулся на InputStream, Reader, StreamTokenizer и Scanner. Мой вопрос в том, какой из них вы бы порекомендовали для моего случая? Возможно ли сделать то, что мне нужно сделать в моем случае? и сможет ли он проверить, что такое последняя строка файла, чтобы он мог захватить дату, расстояние и т. д. Спасибо!

ответ

0

Я бы использовал сканер. Взгляните на примеры here. Еще один вариант использования BufferedReader для чтения строки, а затем метод parse для синтаксического анализа этой строки в нужные вам жетоны.

Также вы можете найти это thread полезным.

Очень короткая база кода по ссылке выше. В массиве ввода есть ваши токены данных файла.

public static void main(String[] args) { 
    BufferedReader in=null; 
    List<Integer> velocityList = new ArrayList<Integer>(); 
    List<Integer> altitudeList = new ArrayList<Integer>(); 
    List<Double> latitudeList = new ArrayList<Double>(); 
    List<Double> longitudeList = new ArrayList<Double>(); 
    try { 
     File file = new File("D:\\test.txt"); 
     FileReader reader = new FileReader(file); 
     in = new BufferedReader(reader); 
     String string; 
     String [] inputs; 
     while ((string = in.readLine()) != null) { 
      inputs = string.split("\\s"); 
      //here is where we copy the data from the file to the data stucture 
      if(inputs!=null && inputs.length==4){ 
       velocityList.add(Integer.parseInt(inputs[0])); 
       altitudeList.add(Integer.parseInt(inputs[1])); 
       latitudeList.add(Double.parseDouble(inputs[2])); 
       longitudeList.add(Double.parseDouble(inputs[3])); 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally{ 
     try { 
      if(in!=null){ 
       in.close(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    //here are the arrays you want!!! 
    Integer [] velocities = (Integer[]) velocityList.toArray(); 
    Integer [] altitiudes = (Integer[]) altitudeList.toArray(); 
    Double [] longitudes = (Double[]) longitudeList.toArray(); 
    Double [] latitudes = (Double[]) latitudeList.toArray(); 
} 
+0

спасибо .. но как бы я применил к тому, что мне нужно? В последнем примере из предоставленной ссылки он ищет следующий тип данных (int, string) .. что если у меня есть строка, int, int, int, float, float .. – t0x13

+0

Класс Scanner очень полезен, если вы имеете дело с разные типы данных. В вашем случае данные всегда числовые? – CoolBeans

+0

данные будут либо int, либо float .. Я не включил все мои данные, но у меня также будет время и время, и я хочу быть «String» – t0x13

0

Как ваши данные относительно просты, BufferedReader и StringTokenizer должны сделать трюк. Вам придется читать вперед по одной строке, чтобы обнаружить, когда больше нет линий.

Ваш код может быть что-то вроде этого

 BufferedReader reader = new BufferedReader(new FileReader("your text file")); 

     String line = null; 
     String previousLine = null; 

     while ((line = reader.readLine()) != null) { 
      if (previousLine != null) { 
      //tokenize and store elements of previousLine 
      } 
      previousLine = line; 
     } 
     // last line read will be in previousLine at this point so you can process it separately 

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

+0

Вы можете использовать String.split() вместо 'StringTokenizer', например' String [] fields = previousLine.split ("") ' – Damien

+0

StringTokenizer .. преобразует ли каждый элемент в String? Мне нужен массив int и float. – t0x13

1

Reader + String.split()

String line; 
String[] values; 
BufferedReader reader = new BufferedReader(new FileReader(args[0])); 
List<Integer> velocity = new ArrayList<Integer>(); 
List<Integer> altitude = new ArrayList<Integer>(); 
List<Float> latitude = new ArrayList<Float>(); 
List<Float> longitude = new ArrayList<Float>(); 

while (null != (line = reader.readLine())) { 
    values = line.split(" "); 
    if (4 == values.length) { 
     velocity.add(Integer.parseInt(values[0])); 
     altitude.add(Integer.parseInt(values[1])); 
     latitude.add(Float.parseFloat(values[2])); 
     longitude.add(Float.parseFloat(values[3])); 
    } else { 
     break; 
    } 
} 

Если вам нужны массивы не список:

velocity.toArray(); 

Насколько я undestand линии данных имеет 4 пунктов и последняя строка имеет 3 пунктов (дата, расстояние, прошедшее время)

+0

На самом деле арраисты более применимы к тому, что мне нужно. Спасибо, я попробую это, похоже, именно то, что мне нужно. – t0x13

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