如何使用java

时间:2015-09-17 10:00:23

标签: java file file-io inputstream

我有一些word文档和excel表格,其中包含一些图像以及文件文本内容。我想创建该文件的副本并将其保存在特定位置。我尝试了以下方法,即在指定位置创建文件,但文件已损坏且无法读取。

InputStream document = Thread.currentThread().getContextClassLoader().getResourceAsStream("upgradeworkbench/Resources/Upgrade_TD_Template.docx");
    try {
        OutputStream outStream = null;
        Stage stage = new Stage();
        stage.setTitle("Save");
        byte[] buffer= new byte[document.available()];
        document.read(buffer);
        FileChooser fileChooser = new FileChooser();
        fileChooser.setInitialFileName(initialFileName);
        if (flag) {
            fileChooser.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("Microsoft Excel Worksheet", "*.xls"));
        } else {
            fileChooser.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("Microsoft Word Document", "*.docx"));
        }
        fileChooser.setTitle("Save File");
        File file = fileChooser.showSaveDialog(stage);
        if (file != null) {
            outStream = new FileOutputStream(file);
            outStream.write(buffer);
    //                            IOUtils.copy(document, outStream);
        }
    } catch (IOException ex) {
        System.out.println(ex.getMessage());
    }

任何人都可以建议我以任何不同的方式获取正确的文件。

PS:我正在使用InputStream读取文件,因为它在项目jar中。

PPS:我也试过Files.copy(),但它没有用。

3 个答案:

答案 0 :(得分:1)

我建议你永远不要相信InputStream.available知道输入的实际大小,因为它只返回准备好从缓冲区立即读取的字节数。它可能返回一个小数字,但并不意味着文件很小,但缓冲区暂时是半满的。

完全读取InputStream并将其写在OutputStream上的正确算法是:

int n;
byte[] buffer=new byte[4096];
do
{
    n=input.read(buffer);
    if (n>0)
    {
        output.write(buffer, 0, n);
    }
}
while (n>=0);

答案 1 :(得分:0)

您可以使用Files.copy()方法。

  

将输入流中的所有字节复制到文件中。返回时,输入流将在流的末尾。

答案 2 :(得分:0)

使用:

Files.copy(document, file.toPath(), StandardCopyOption.REPLACE_EXISTING);

正如班级所说,第二个参数是路径,而不是文件。

通常,由于这是2015年,使用Path并删除File;如果API仍然使用File,请将其设置为在最后可能的时刻使用它并一直使用Path。