利用Scanner類對檔案讀取,並獲取相應的資訊
阿新 • • 發佈:2018-12-02
package input; import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import core.Coord; import core.SettingsError; import core.Tuple; public class ExternalMovementReader { /*註釋行的字首 */ public static final String COMMENT_PREFIX = "#"; private Scanner scanner; private double lastTimeStamp = -1; private String lastLine; private double minTime; private double maxTime; private double minX; private double maxX; private double minY; private double maxY; private boolean normalize; public ExternalMovementReader(String inFilePath) { this.normalize = true; File inFile = new File(inFilePath); try { scanner = new Scanner(inFile); } catch (FileNotFoundException e) { throw new SettingsError("Couldn't find external movement input " + "file " + inFile); } String offsets = scanner.nextLine(); try { Scanner lineScan = new Scanner(offsets); minTime = lineScan.nextDouble(); maxTime = lineScan.nextDouble(); minX = lineScan.nextDouble(); maxX = lineScan.nextDouble(); minY = lineScan.nextDouble(); maxY = lineScan.nextDouble(); } catch (Exception e) { throw new SettingsError("Invalid offset line '" + offsets + "'"); } lastLine = scanner.nextLine(); } public List<Tuple<String, Coord>> readNextMovements() { ArrayList<Tuple<String, Coord>> moves = new ArrayList<Tuple<String, Coord>>(); if (!scanner.hasNextLine()) { return moves; } Scanner lineScan = new Scanner(lastLine); double time = lineScan.nextDouble(); String id = lineScan.next(); double x = lineScan.nextDouble(); double y = lineScan.nextDouble(); if (normalize) { time -= minTime; x -= minX; y -= minY; } lastTimeStamp = time; while (scanner.hasNextLine() && lastTimeStamp == time) { lastLine = scanner.nextLine(); if (lastLine.trim().length() == 0 || lastLine.startsWith(COMMENT_PREFIX)) { continue; /* skip empty and comment lines */ } // add previous line's tuple moves.add(new Tuple<String, Coord>(id, new Coord(x,y))); lineScan = new Scanner(lastLine); try { time = lineScan.nextDouble(); id = lineScan.next(); x = lineScan.nextDouble(); y = lineScan.nextDouble(); } catch (Exception e) { throw new SettingsError("Invalid line '" + lastLine + "'"); } if (normalize) { time -= minTime; x -= minX; y -= minY; } } if (!scanner.hasNextLine()) { // add the last tuple of the file moves.add(new Tuple<String, Coord>(id, new Coord(x,y))); } return moves; } }