我有一个上传组件,我应该在其中导入一个 xml 文件以解析它。
我正在尝试使用 File.createTempFile 方法从物理上创建文件,但是发生了一些奇怪的事情。
例如,如果我获取名为“test.xml”的文件并使用 createTempFile 方法在磁盘上创建它,生成文件的名称将变为类似于“test.xml13234xml”。如何正确创建文件?
我有一个上传组件,我应该在其中导入一个 xml 文件以解析它。
我正在尝试使用 File.createTempFile 方法从物理上创建文件,但是发生了一些奇怪的事情。
例如,如果我获取名为“test.xml”的文件并使用 createTempFile 方法在磁盘上创建它,生成文件的名称将变为类似于“test.xml13234xml”。如何正确创建文件?
这在使用 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();
}
}
}