Используя Java 8, как мне прочитать содержимое файла, где я получаю только то, что идет после двоеточия в любом месте файла? - PullRequest
0 голосов
/ 06 сентября 2018

Мой файл ниже:

Start Simulator Configuration File
Version/Phase: 2.0
File Path: Test_2e.mdf
Projector cycle time {msec}: 25
Processor cycle time {msec}: 10
Keyboard cycle time {msec}: 50
Monitor display time {msec}: 20
Scanner cycle time {msec}: 10
Hard drive cycle time {msec}: 15
Log: Log to Both
Log File Path: logfile_1.lgf
End Simulator Configuration File

как мне прочитать файл, откуда я получаю только то, что идет после ":" Мне нужно десять вещей.

Мне удалось получить это далеко:

public ConfigureClass(String fileName) throws IOException {


        BufferedReader inputStream = null; 

        try{

            inputStream = new BufferedReader(new FileReader(fileName));

            String test; 
            int index = 0; 

            while((test = inputStream.readLine()) != null){

            arrOfStr[index++] = test.split(": ");


            }
            for(int i =0; i < index; i++){
                System.out.println(arrOfStr[i]);
            }

        } finally{
            if(inputStream != null){
                inputStream.close(); 
            }
        }
        }
    }

Я разбил файл на строки. Каждая строка - это собственная строка. Я попытался разделить эти строки по двоеточию, чтобы получить два значения: что до, то что после. С этими двумя значениями я хотел поместить их в массив. Было бы неплохо проигнорировать начало симулятора ... и конец симулятора ... линии. Я также должен учитывать большее количество циклов, чтобы быть в данном файле.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Вы можете использовать

String[] arrOfStr;
try(Stream<String> lines = Files.lines(Paths.get(fileName))) {
    arrOfStr = lines
            .skip(1).limit(10)
            .map(s -> s.substring(s.indexOf(": ")+2))
            .toArray(String[]::new);
}

Это полезно только для фиксированной структуры, показанной в вашем примере файла. Поскольку вы хотите получить массив с определенным значением для каждого индекса, он должен быть фиксированным.

В противном случае рассмотрите возможность использования Map:

Map<String,String> config;
try(Stream<String> lines = Files.lines(Paths.get(fileName))) {
    config = lines
            .map(s -> s.split(": ", 2))
            .filter(a -> a.length == 2)
            .collect(Collectors.toMap(a -> a[0], a -> a[1]));
}
System.out.println("Log is "+config.getOrDefault("Log", "Undefined"));
System.out.println("All values:");
config.forEach((key, value) -> System.out.println("  "+key+" = "+value));
Log is Log to Both
All values:
  Processor cycle time {msec} = 10
  Keyboard cycle time {msec} = 50
  Projector cycle time {msec} = 25
  Hard drive cycle time {msec} = 15
  Log = Log to Both
  Scanner cycle time {msec} = 10
  Monitor display time {msec} = 20
  Version/Phase = 2.0
  File Path = Test_2e.mdf
  Log File Path = logfile_1.lgf

Кстати, в следующий раз, когда вы будете иметь дело с BufferedReader (или любым ресурсом) вручную, вы также должны использовать оператор try-with-resource , который обрабатывает закрытие автоматически (и лучше, чем ручное закрытие в блоке finally):

String header;
Map<String,String> config;
try(BufferedReader br = new BufferedReader(new FileReader(fileName))) {
    header = br.readLine();
    config = br.lines()
      .map(s -> s.split(": ", 2))
      .filter(a -> a.length == 2)
      .collect(Collectors.toMap(a -> a[0], a -> a[1]));
}
System.out.println("Header is "+header);
System.out.println("Log is "+config.getOrDefault("Log", "Undefined"));
System.out.println("All values:");
config.forEach((key, value) -> System.out.println("  "+key+" = "+value));
0 голосов
/ 06 сентября 2018

Вот один из способов сделать это ...

  • Использовать try with resources
  • проверить, содержит ли строка : и разбить только на 2 строки, и выбрать 2-й элемент
  • removeIf строка пуста или равна нулю

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Test {

    public static void main(String[] args) throws Exception {
        System.out.println(Arrays.toString(configureClass("c:/file.txt")));
    }

    public static String[] configureClass(String fileName) throws IOException {
        List<String> lines = new ArrayList<String>();
        // try with resources
        try (BufferedReader inputStream = new BufferedReader(new FileReader(fileName));) {
            String test;
            while ((test = inputStream.readLine()) != null) {
                // check if line contains ": "
                if (test.contains(": "))
                    // split into 2 strings and pick 2
                    lines.add(test.split(": ", 2)[1]);
            }
            // remove is line is empty of null
            lines.removeIf(line -> (line == null || line.trim().length()==0));
        }
        return lines.toArray(new String[0]);
    }
}

Пример выполнения:

[2.0, Test_2e.mdf, 25, 10, 50, 20, 10, 15, Log to Both, logfile_1.lgf]

Еще один способ сделать это ....


import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class Test {

    public static void main(String[] args) throws Exception {
        System.out.println(Arrays.toString(configureClass("c:/file.txt")));
    }

    public static String[] configureClass(String fileName) throws IOException {
        List<String> results = new ArrayList<String>();
        // try with resources
        try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
            stream
                .filter(line -> line.contains(": "))
                .forEach(line -> results.add(line.substring(line.indexOf(": ")+2, line.length())));
        }
        return results.toArray(new String[0]);
    }
}
...