1

我有一个上传组件,我应该在其中导入一个 xml 文件以解析它。

我正在尝试使用 File.createTempFile 方法从物理上创建文件,但是发生了一些奇怪的事情。

例如,如果我获取名为“test.xml”的文件并使用 createTempFile 方法在磁盘上创建它,生成文件的名称将变为类似于“test.xml13234xml”。如何正确创建文件?

4

1 回答 1

2

这在使用 iecreateTempFile方法时是预期的,因为它隐式地创建了一个带有随机前缀的文件:

// a part of createTempFile method
private static final SecureRandom random = new SecureRandom();
static File generateFile(String prefix, String suffix, File dir) {
    long n = random.nextLong();
    if (n == Long.MIN_VALUE) {
        n = 0;      // corner case
    } else {
        n = Math.abs(n);
    }
    return new File(dir, prefix + Long.toString(n) + suffix);
}

这应该给出类似'test.xml13234xml'的东西。

如果您想创建一个具有正确名称的文件并保留它以供以后使用,您可以在uploadSucceeded方法中重命名/移动它。

public class ExampleUpload implements Upload.Receiver, Upload.SucceededListener {
    private Upload xmlUpload;
    private File tempFile;

    public ExampleUpload() {
        this.xmlUpload = new Upload("Upload:", this);
        this.xmlUpload.addSucceededListener(this);
    }

    @Override
    public OutputStream receiveUpload(String filename, String mimeType) {
        try {
            tempFile = File.createTempFile(filename, "xml");
            tempFile.deleteOnExit();
            return new FileOutputStream(tempFile);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    public void uploadSucceeded(SucceededEvent event) {
        try {
            File destinationFile = new File("c:\\" + event.getFilename());
            FileUtils.moveFile(tempFile, destinationFile));
            // TODO read and parse destinationFile
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
于 2013-09-18T12:16:41.543 回答