1

我可以使用 InputFileStream 和 Scanner 类成功读取文本文件。这很容易,但我需要做一些比这更复杂的事情。首先是关于我的项目的一些背景知识。我有一个带有传感器的设备,我正在使用记录器,它将每 10 秒从传感器记录一次数据到一个文本文件中。每 10 秒就有一个新的数据行。所以我想要的是当我读取文件时将每个单独的传感器数据抓取到一个数组中。例如:速度高度纬度经度

22 250 46.123245 122.539283

25 252 46.123422 122.534223

所以我需要将高度数据 (250, 252) 抓取到数组 alt[]; 等等 vel[]、lat[]、long[]...

然后文本文件的最后一行将有不同的信息,只有一行。它将具有日期,行驶距离,经过的时间..

所以在做了一些研究之后,我遇到了 InputStream、Reader、StreamTokenizer 和 Scanner 类。我的问题是你会为我的情况推荐哪一个?在我的情况下可以做我需要做的事情吗?它是否能够检查文件的最后一行是什么,以便它可以获取日期、距离等。谢谢!

4

3 回答 3

1

阅读器 + 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();

据我所知,数据行有 4 项,最后一行有 3 项(日期、距离、经过时间)

于 2011-01-17T22:13:08.940 回答
0

我会使用扫描仪。看看这里的例子。您可以使用 BufferedReader 读取一行,然后使用 parse 方法将该行解析为您想要的标记的另一个选项。

此外,您可能会发现此线程很有用。

基于上面链接的非常快速的代码。输入数组具有您的文件数据标记。

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();
}
于 2011-01-17T21:11:15.377 回答
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如果你感觉更舒服,你可以使用它。

于 2011-01-17T21:11:34.353 回答