У меня есть 700 CSV-файлов каждый размером около 5-7 МБ. Я использую Spring boot. Все, что мне нужно сделать, это прочитать эти 700 CSV-файлов. Поэтому, когда в каталог добавляется новый файл, вызывается метод fileUpdatedOrAdded()
из FileWatcherJob.java
. Он делает некоторые проверки и просто пытается прочитать файлы по существу.
FileWatcherJob.java
public class FileWatcherJob implements DirectoryScanListener {
private final static Logger logger = LoggerFactory.getLogger(FileWatcherJob.class);
public static final String LISTENER_NAME = "DirScanListenerName";
private static boolean fileFound = true;
private ReadFile readFile = new ReadFile();
public void filesUpdatedOrAdded(File[] files) {
if (fileFound) {
System.out.println("------------- I am doing it again-------------");
for (File file : files) {
logger.info("File Found : {}", file.getName());
}
logger.info("ALL THE FILES ARE AVAILABLE NOW");
if (!readFile.getFileAStored()) {
readFile.readAllFiles("D:\\FileToRead\\fileA.csv");
}
if (!readFile.getFileBStored()) {
readFile.readAllFiles("D:\\FileToRead\\fileB.csv");
}
//Read Miscallenous Files including File A and File B
if (readFile.getFileAStored() && readFile.getFileBStored()) {
readFile.readAllFiles("D:\\FileToRead\\");
}
fileFound = false;
logger.info("-------------- I am done -----------------");
}
}
}
ReadFile.java
public class ReadFile {
private static final Logger LOGGER = LoggerFactory.getLogger(ReadFile.class);
private Map<Path, List<String>> fileA = new HashMap<>();
private Map<Path, List<String>> fileB = new HashMap<>();
private Boolean fileAStored = false;
private Boolean fileBStored = false;
private Map<Path, List<String>> miscallenousFiles = new HashMap<>();
public Boolean getFileAStored() {
return fileAStored;
}
public Boolean getFileBStored() {
return fileBStored;
}
public void readAllFiles(String path) {
try (Stream<Path> paths = Files.walk(Paths.get(path)).collect(toList()).parallelStream()
){
paths.forEach(filePath -> {
//LOGGER.info("CHECK IF FILE IS REGULAR");
if (filePath.toFile().exists()) {
String fileName = filePath.getFileName().toString();
try {
LOGGER.info("START LOADING THE CONTENT OF FILE " + fileName);
List<String> loadedFile = readContent(filePath);
storeAandBFiles(fileName, filePath, loadedFile);
} catch (Exception e) {
LOGGER.info("ERROR WHILE READING THE CONTENT OF FILE");
LOGGER.error(e.getMessage());
}
}
});
} catch (IOException e) {
LOGGER.info("ERROR WHILE READING THE FILES IN PARALLEL");
LOGGER.error(e.getMessage());
}
}
private List<String> readContent(Path filePath) throws IOException {
//LOGGER.info("START READING THE FILE, LINE BY LINE");
return Files.readAllLines(filePath, StandardCharsets.ISO_8859_1);
}
private void storeAandBFiles(String fileName, Path filePath, List<String> loadedFile) {
//LOGGER.info("START STORING THE FILE");
if (fileName.contains("fileA") && !fileAStored) {
fileA.put(filePath.getFileName(), loadedFile);
fileAStored = true;
}
if (fileName.contains("fileB") && !fileBStored) {
fileB.put(filePath.getFileName(), loadedFile);
fileBStored = true;
}
}
}
Я продолжаю получать ошибку ниже:
Задание group1.FileScanJobName выдало необработанное исключение:
java.lang.OutOfMemoryError: пространство кучи Java
Я не понимаю, в чем проблема. Может кто-нибудь, пожалуйста, помогите?
Одна странная вещь, и я подозреваю причину проблемы в том, что даже когда в каталог не добавляется новый файл, наблюдатель все равно почему-то говорит, что в каталоге обнаружен новый файл!