Java中的File.createTempFile获取不兼容的类型错误

安德鲁 :

到现在,我在临时目录中创建文件并对其进行处理的地方,我的代码都能正常工作。

但是现在我试图提供实际要在其中创建xml文件的特定目录。所以在方法上createTmpXmlFile

    private static Path createTmpXmlFile(final String prefix) {
        try {
            log.info("Creating temporary file {}{}", prefix, XML_SUFFIX);
            return Files.createTempFile(Paths.get(gleifZipFile), prefix, XML_SUFFIX);

        } catch (IOException e) {
            throw new IllegalStateException("Could not create tmp file at " + prefix + XML_SUFFIX + ". ", e);
        }
    }

我从

return Files.createTempFile(prefix, XML_SUFFIX);

return File.createTempFile(prefix, XML_SUFFIX, "/tmp/in");

我得到以下错误:

java:不兼容的类型:java.lang.String无法转换为java.io.File。

如果我在这里更改逻辑,那么它会影响正在调用createTmpXmlFile方法的其他方法。

我真的不明白如何解决这个问题。下面是我的代码:

@Slf4j
public class InputCS implements Runnable {

    public static final String XML_SUFFIX = ".xml";
    
    @Value("${gleifdataimporter.file.dir}")    
    private String gleifZipFile;

    private void processleifZipFile() {
        final AtomicBoolean isInsideLeiRecord = new AtomicBoolean();
        isInsideLeiRecord.set(false);
        final StringBuilder currentLeiRecordXml = new StringBuilder();

        try (FileSystem zipFs = FileSystems.newFileSystem(jobRunner.getInputZipPath(), null)) {
            Path tmpXMLPath = xmlFileFromLeiZipFile(zipFs);

            try (Stream<String> lines = Files.lines(tmpXMLPath)) {
                AtomicInteger processedLinesCounter = new AtomicInteger();
                AtomicInteger currentLineNumber = new AtomicInteger();
                lines.sequential().forEach(handleLineAndIncrementLineNumber(isInsideLeiRecord, currentLeiRecordXml, processedLinesCounter, currentLineNumber));
                log.info("{} lines of XML file inside LEIF input ZIP file {} processed.", processedLinesCounter.get(), jobRunner.getInputZipPath());
            }catch (IOException e) {
                throw new IllegalStateException("Problem reading input file at " + jobRunner.getInputZipPath() + ".", e);
            } finally {
                Files.delete(tmpXMLPath);
            }
        } 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("leif__" + System.currentTimeMillis());
        for (Path rootDir : zipFs.getRootDirectories()) {
            try (Stream<Path> files = treeAt(rootDir)) {
                log.info("Trying to extract LEIF 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 LEIF 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(Paths.get(gleifZipFile), 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);
        }
    }
    
}
samabcde:
  1. 根据Slaw的建议,使用Files#createTempFile(Path,String,String,FileAttribute ...)指定用于创建临时文件的目录。
  2. 使用Paths#get(String,String...)面向Java 7或8,或Path#of(String,String...)用于Java的11或更高版本转换StringPath进一步阅读:Paths.get与Path.of

private static Path createTmpXmlFile(final String prefix) {
    try {
        // Java 11 or later
        // return Files.createTempFile(Path.of("/tmp/in"), prefix, XML_SUFFIX);
        // Java 8
        return Files.createTempFile(Paths.get("/tmp/in"), prefix, XML_SUFFIX);
    } catch (IOException e) {
        throw new IllegalStateException("Could not create tmp file at " + prefix + XML_SUFFIX + ". ", e);
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章