Как читать целые числа из файла, используя BufferedReader из Java? - PullRequest
0 голосов
/ 27 марта 2019

Я работаю с BufferedReader на Java и надеялся получить какое-то руководство, когда дело доходит до чтения целых чисел.

Подводя итог, каждая строка входного файла будет представлять одно ребро в неориентированном графике. Он будет содержать два целых числа, конечные точки ребра, за которыми следует действительное число, вес ребра. Последняя строка будет содержать -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 ]

1 голос
/ 27 марта 2019

Я бы начал с проверки, могу ли я прочитать файл (для этого можно использовать File.canRead()). Затем я скомпилировал бы регулярное выражение 1005 * с тремя операциями группировки. Тогда я бы использовал 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);
            }
        }
    }
}
1 голос
/ 27 марта 2019

Переключитесь на 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.");
    }
}
0 голосов
/ 27 марта 2019

Вместо использования read вы можете просто использовать readLine, а затем использовать разделение с вашим разделителем в три пробела, я думаю?

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