我在下面的代码中尝试在temp
目录中创建新文件,该xml
文件及其工作正常。
现在,每次我运行代码时,temp
由于XML文件的大小很大并且可能会充满我的临时空间,因此我想在创建新的xml文件之前从该目录中删除以前的xml文件。xml文件具有某些命名约定life__*.xml
。因此,它应该删除所有life__*.xml
文件。
我不确定我们是否可以tempFile.deleteOnExit()
在这里使用或如何使用它,因为我在java文件处理方面还很陌生,并且不知道在代码中的什么地方进行更改:
*/
@Slf4j
public class InputConsumer implements Runnable {
public static final String XML_SUFFIX = ".xml";
private void processlifeZipFile() { //check the number of line in xml input zip file processed
final AtomicBoolean isInsideLeiRecord = new AtomicBoolean();
isInsideLeiRecord.set(false);
final StringBuilder currentLeiRecordXml = new StringBuilder();
try (FileSystem zipFs = FileSystems.newFileSystem(jobRunner.getInputZipPath(), null); //check the zip file
Stream<String> lines = Files.lines(xmlFileFromLeiZipFile(zipFs))) { //streaming the lines inside xml file
AtomicInteger processedLinesCounter = new AtomicInteger();
AtomicInteger currentLineNumber = new AtomicInteger();
lines
.sequential()
.forEach(handleLineAndIncrementLineNumber(isInsideLeiRecord, currentLeiRecordXml, processedLinesCounter, currentLineNumber))
;
log.info("{} lines of XML file inside life input ZIP file {} processed.", processedLinesCounter.get(), jobRunner.getInputZipPath() //number of lines processed in xml file
);
} catch (IOException e) {
throw new IllegalStateException("Problem reading input file at " + jobRunner.getInputZipPath() + ".", e);
}
}
private Path xmlFileFromLeiZipFile(FileSystem zipFs) { //extracts the xml file from zip file
log.info("Input file {} exists: {}", jobRunner.getInputZipPath(), Files.exists(jobRunner.getInputZipPath()));
Path tmpXmlPath = createTmpXmlFile("life__" + System.currentTimeMillis());
for (Path rootDir : zipFs.getRootDirectories()) {
try (Stream<Path> files = treeAt(rootDir)) {
log.info("Trying to extract life XML file from ZIP file into {}.", tmpXmlPath);
final Path xmlFileInsideZip = files
.filter(isNotADir())
.filter(Files::isRegularFile)
.findFirst()
.orElseThrow(() -> new IllegalStateException("No file found in LEI ZIP file."));
log.info("Path to life XML file inside ZIP file: {}.", xmlFileInsideZip);
return copyReplacing(xmlFileInsideZip, tmpXmlPath);
}
}
throw new IllegalStateException("No file found in LEI ZIP file " + jobRunner.getInputZipPath() + ".");
}
private static Path createTmpXmlFile(final String prefix) {
try {
log.info("Creating temporary file {}{}", prefix, XML_SUFFIX);
return Files.createTempFile(prefix, XML_SUFFIX);
} catch (IOException e) {
throw new IllegalStateException("Could not create tmp file at " + prefix + XML_SUFFIX + ". ", e);
}
}
@NotNull
private static Path copyReplacing(Path from, Path to) {
requireNonNull(from, "Trying to copy from a path, which is null to path " + to + "."); //trying to copy file where no xml file exist in root directory
requireNonNull(to, "Trying to copy from path " + from + " to a path, which is null.");
try {
return Files.copy(from, to, REPLACE_EXISTING);
} catch (IOException e) {
throw new IllegalStateException("Cannot copy from " + from + " to " + to + ". ", e);
}
}
}
Andrew, Please try the below code change done in method processlifeZipFile() and see if it works.
private void processlifeZipFile() { //check the number of line in xml input zip file processed
final AtomicBoolean isInsideLeiRecord = new AtomicBoolean();
isInsideLeiRecord.set(false);
final StringBuilder currentLeiRecordXml = new StringBuilder();
Object jobRunner;
try (FileSystem zipFs = FileSystems.newFileSystem(jobRunner.getInputZipPath(), null); //check the zip file
java.nio.file.Path tmpXMLFilePath = xmlFile`enter code here`FromLeiZipFile(zipFs); // Change
Stream<String> lines = Files.lines(tmpXMLFilePath)) { //streaming the lines inside xml file
AtomicInteger processedLinesCounter = new AtomicInteger();
AtomicInteger currentLineNumber = new AtomicInteger();
lines
.sequential()
.forEach(handleLineAndIncrementLineNumber(isInsideLeiRecord, currentLeiRecordXml, processedLinesCounter, currentLineNumber))
;
log.info("{} lines of XML file inside life input ZIP file {} processed.", processedLinesCounter.get(), jobRunner.getInputZipPath() //number of lines processed in xml file
);
Files.delete(tmpXMLFilePath); // change
} catch (IOException e) {
throw new IllegalStateException("Problem reading input file at " + jobRunner.getInputZipPath() + ".", e);
}
}
编辑---->
我创建了一个新方法来删除除新的temp xml文件之外的所有其他文件。
void deleteXMLFiles(Path xmlPath) {
try {
final List<Path> pathsToDelete = Files.list(xmlPath.getParent()).sorted(Comparator.reverseOrder()).collect(Collectors.toList());
for(Path path : pathsToDelete) {
if (path.equals(xmlPath)) {
System.out.println("Skipping newly created XML file");
continue;
}
Files.delete(path);
System.out.println("Deleting -> " + path.toString());
}
}catch(IOException ioe) {
ioe.printStackTrace();
}
}
用对tmpXMLFilePath作为参数的新创建方法的调用替换“ Files.delete(tmpXMLFilePath); // change”行。
deleteXMLFiles(tmpXMLFilePath);
请参阅此答案以获取更多详细信息:https : //stackoverflow.com/a/47994874/13677537
编辑2 ---->
修改了方法deleteXMLFiles()以在删除之前检查文件名模式:
void deleteXMLFiles(Path xmlPath) {
try {
final List<Path> pathsToDelete = Files.list(xmlPath).sorted(Comparator.reverseOrder()).collect(Collectors.toList());
for (Path path : pathsToDelete) {
String xmlFileName = path.toString();
if (Pattern.matches(".*life__.*.xml", xmlFileName)) {
Files.delete(path);
System.out.println("Deleting -> " + xmlFileName);
}
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
修改了processlifeZipFile()方法调用以删除临时XML文件,然后再创建新的XML文件:
private void processlifeZipFile() { //check the number of line in xml input zip file processed
final AtomicBoolean isInsideLeiRecord = new AtomicBoolean();
isInsideLeiRecord.set(false);
final StringBuilder currentLeiRecordXml = new StringBuilder();
// Delete the old temp XML Files before starting the processing
deleteXMLFiles(Paths.get(System.getProperty("java.io.tmpdir")));
try (FileSystem zipFs = FileSystems.newFileSystem(jobRunner.getInputZipPath(), null); //check the zip file
Stream<String> lines = Files.lines(xmlFileFromLeiZipFile(zipFs))) { //streaming the lines inside xml file
AtomicInteger processedLinesCounter = new AtomicInteger();
AtomicInteger currentLineNumber = new AtomicInteger();
lines
.sequential()
.forEach(handleLineAndIncrementLineNumber(isInsideLeiRecord, currentLeiRecordXml, processedLinesCounter, currentLineNumber))
;
log.info("{} lines of XML file inside life input ZIP file {} processed.", processedLinesCounter.get(), jobRunner.getInputZipPath() //number of lines processed in xml file
);
} catch (IOException e) {
throw new IllegalStateException("Problem reading input file at " + jobRunner.getInputZipPath() + ".", e);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句