Как название говорит, что я не могу прочитать содержимое файла (файл CSV) при запуске одного и того же кода в контейнере Linux < /p>
private Set loadConfigurations(Path file, CodeType codeType) throws IOException {
log.debug("File exists? " + Files.exists(file));
log.debug("Path " + file.toString());
log.debug("File " + file.toFile().toString());
log.debug("File absolute path " + file.toAbsolutePath().toString());
String line;
Set configurations = new HashSet(); // this way we ignore duplicates in the same file
try(BufferedReader br = new BufferedReader(new FileReader(file.toFile()))){
while ((line = br.readLine()) != null) {
configurations.add(build(line, codeType));
}
}
log.debug("Loaded " + configurations.size() + " configurations");
return configurations;
}
< /code>
Журналы возвращают «true» и путь для файла в обеих системах (локально на Windows и в контейнере Linux Docker). В Windows он загружает «15185 конфигурации», но в контейнер он загружает «0 Конфигурации». Я использую команду Head, и в файле есть строки.var vehicleConfigurations = Files.lines(file)
.map(line -> build(line, codeType))
.collect(Collectors.toCollection(HashSet::new));
< /code>
Но у этого есть проблема (только в контейнере) относительно содержания. Он считывает файл, но не весь файл, он достигает данной строки (скажем, строка 8000) и не читает его полностью (читает около половины строки перед запятой). Затем я получаю java.lang.arrayindexoutofboundsexception, потому что мой метод сборки пытается разделить линию, и я доступен к индексу 1 (которого он не имеет, только 0): < /p>
private VehicleConfiguration build(String line, CodeType codeType) {
String[] cells = line.split(lineSeparator);
var vc = new VehicleConfiguration();
vc.setVin(cells[0]);
vc.setCode(cells[1]);
vc.setType(codeType);
return vc;
}
< /code>
Что может быть проблемой? Я не понимаю, как работает один и тот же код (в Java) на Windows, но не на контейнере Linux. Это не имеет смысла. < /P>
Я использую Java 11. Файл копируется с использованием объемов в файле скомплектования Docker, как это: < /p>
volumes:
- ./file-sources:/file-sources
< /code>
Я затем скопирую файл (используя команду CP в контейнере Linux) из файлов-источников в /root, потому что именно здесь приложение прислушивается к появлению новых файлов. Затем содержимое файла читается с помощью методов, которые я описал. Пример данных файла (нет странных символов):
< /p>
Заранее спасибо. < /p>
Обновление: пробое с методом NewbufferedReader, тот же результат (работает на Windows, не работает на контейнере Linux): < / p>
private Set loadConfigurations(Path file, CodeType codeType) throws IOException {
String line;
Set configurations = new HashSet(); // this way we ignore duplicates in the same file
try(BufferedReader br = Files.newBufferedReader(file)){
while ((line = br.readLine()) != null) {
configurations.add(build(line, codeType));
}
}
log.debug("Loaded " + configurations.size() + " configurations");
return configurations;
}
< /code>
wc -l в контейнере Linux (in /ret) возвращает: 15185 hard_001.csv < /p>
Обновление: это не решение, но я обнаружил Это, отбросив файлы непосредственно в папку с файлами-источниками и сделает эту папку папкой, которую прослушивает код, файлы читаются. Таким образом, в основном кажется, что проблема более очевидна с использованием CP/MV внутри контейнера в другую папку. Может быть, файл читается до того, как он полностью скопирован/перенесен, и поэтому он читает 0 конфигураций?
Подробнее здесь: https://stackoverflow.com/questions/632 ... -container