如何使用Java中的BufferedReader从文件中读取整数?

时间:2019-03-27 01:42:21

标签: java file io integer bufferedreader

我正在使用Java中的BufferedReader,并且希望在读取整数时获得一些指导。

总而言之,输入文件的每一行将代表无向图中的一条边。它包含两个整数,即边缘的端点,后跟一个实数,即边缘的权重。最后一行将包含-1,以表示输入的结尾。

我创建了一个BufferedReader对象,并初始化了一个整数变量和

文件格式如下:

 0   1    5.0
 1   2    5.0
 2   3    5.0
...
 5  10    6.0
 5  11    4.0
17  11    4.0
-1
public static void processFile(String inputFilePath) throws IOException {
        //Check to see if file input is valid
        if (inputFilePath == null || inputFilePath.trim().length() == 0) {
            throw new IllegalArgumentException("Error reading file.");
        }

        //Initialize required variables for processing the file
        int num = 0;
        int count = 0;

        try {
            //We are reading from the file, so we can use FileReader and InputStreamReader.
            BufferedReader fileReader = new BufferedReader(new FileReader(inputFilePath));
            //Read numbers from the line
            while ((num = fileReader.read()) != -1) { //Stop reading file when -1 is reached
                //First input is the start

                //Second input is the end
                //Third input is the weight



            }
        } catch (IOException e) {
            throw new IOException("Error processing the file.");
        }
    } 

这是我到目前为止尝试过的,但是我想知道如何获取每一行代码,并让第一个数字为“ start”变量,第二个数字为“ end”变量,第三个数字是“重量”变量?我在网上看到一些创建数组的解决方案,但是由于文件格式的原因,我有些困惑。我可以帮助澄清有关的任何信息

3 个答案:

答案 0 :(得分:1)

切换到readLine并使用扫描仪:

public static void processFile(String inputFilePath) throws IOException {
    // Check to see if file input is valid
    if (inputFilePath == null || inputFilePath.trim()
                                              .length() == 0) {
        throw new IllegalArgumentException("Error reading file.");
    }

    // Initialize required variables for processing the file
    String line;
    int count = 0;

    // We are reading from the file, so we can use FileReader and InputStreamReader.
    try (BufferedReader fileReader = new BufferedReader(new FileReader(inputFilePath))) {

        // Read numbers from the line
        while ((line = fileReader.readLine()) != null) { // Stop reading file when -1 is reached
            Scanner scanner = new Scanner(line);

            // First input is the start
            int start = scanner.nextInt();

            if (start == -1) {
                break;
            }

            // Second input is the end
            int end = scanner.nextInt();

            // Third input is the weight
            double weight = scanner.nextDouble();

            // do stuff
        }
    } catch (IOException e) {
        throw new IOException("Error processing the file.");
    }
}

答案 1 :(得分:1)

我首先要检查我是否可以读取文件(您可以使用File.canRead()来执行此操作)。接下来,我将通过三个分组操作来编译一个正则表达式。然后,我将使用BufferedReader.readLine()来阅读文本行; read()调用返回一个字符。然后只剩下解析匹配的行。而且我认为吞下原始异常只是为了重新抛出异常没有任何目的(实际上,您丢失了当前方式的所有堆栈跟踪信息)。放在一起,

public static void processFile(String inputFilePath) throws IOException {
    File f = new File(inputFilePath);
    if (!f.canRead()) {
        throw new IllegalArgumentException("Error reading file.");
    }

    // Initialize required variables for processing the file
    try (BufferedReader fileReader = new BufferedReader(new FileReader(inputFilePath))) {
        Pattern p = Pattern.compile("^\\s*(\\d+)\\s+(\\d+)\\s+(\\d.+)$");
        String line;
        while ((line = fileReader.readLine()) != null) {
            Matcher m = p.matcher(line);
            if (m.matches()) {
                int start = Integer.parseInt(m.group(1));
                int end = Integer.parseInt(m.group(2));
                double weight = Double.parseDouble(m.group(3));
                System.out.printf("start=%d, end=%d, weight=%.2f%n", start, end, weight);
            }
        }
    }
}

答案 2 :(得分:0)

除了使用read之外,您还可以只使用readLine然后使用split,而分隔符为三个空格?

        try (BufferedReader fileReader = new BufferedReader(new FileReader(inputFilePath))) {
            String line;
            while(!(line = fileReader.readLine()).equals("-1")) {
                String[] edge = line.split("   ");
                int start = Integer.parseInt(edge[0]);
                int end = Integer.parseInt(edge[1]);
                double weight = Double.parseDouble(edge[2]);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }