1. 程式人生 > >利用Scanner類對檔案讀取,並獲取相應的資訊

利用Scanner類對檔案讀取,並獲取相應的資訊

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