Text file parsing using java, suggestions needed on which one to use

浪尽此生 提交于 2019-12-24 13:33:33

问题


I can successfully read text file using InputFileStream and Scanner classes. It's very easy but I need to do something more complex than that. A little background about my project first.. I have a device with sensors, and I'm using logger that will log every 10sec data from sensors to a text file. Every 10 sec its a new line of data. So what I want is when I read a file is to grab each separate sensor data into an array. For example: velocity altitude latitude longitude

22 250 46.123245 122.539283

25 252 46.123422 122.534223

So I need to grab altitude data (250, 252) into an array alt[]; and so forth vel[], lat[], long[]...

Then the last line of the text file will different info, just a single line. It will have the date, distance travelled, timeElapsed..

So after doing a little research I came across InputStream, Reader, StreamTokenizer and Scanner class. My question is which one would you recommend for my case? Is it possible to do what I need to do in my case? and will it be able to check what the last line of the file is so it can grab the date, distance and etc.. Thank you!


回答1:


I would use Scanner. Take a look at the examples here. Another option for you to use BufferedReader to read a line and then have parse method to parse that line into the tokens you want.

Also you might find this thread to be useful.

Very quick code base on the link above. The inputs array has your file data tokens.

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();
}



回答2:


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;
    }
}

If you need arrays not list:

velocity.toArray();

As far I undestand data lines has 4 items and last line has 3 items (date, distance, elapsed time)




回答3:


As your data is relatively simple, BufferedReader and StringTokenizer should do the trick. You'll have to read ahead by one line to detect when there are no more lines left.

Your code could be something like this

      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

But how you process the line itself is really up to you, you can use Scanner if you're feeling more comfortable with it.



来源:https://stackoverflow.com/questions/4717838/text-file-parsing-using-java-suggestions-needed-on-which-one-to-use

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!