Harshita Sethi
Harshita Sethi

Reputation: 2125

How to make a copy of a file containing images and text using java

I have some word documents and excel sheets which has some images along with the file text content. I want to create a copy of that file and keep it at a specific location. I tried the following method which is creating file at specified location but the file is corrupted and cannot be read.

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());
    }

Can anyone suggest me any different ways to get the proper file.

PS: I am reading the file using InputStream because it is inside the project jar.

PPS: I also tried Files.copy() but it didnt work.

Upvotes: 1

Views: 717

Answers (3)

Little Santi
Little Santi

Reputation: 8783

I suggest you never trust on InputStream.available to know the real size of the input, because it just returns the number of bytes ready to be immediately read from the buffer. It might return a small number, but doesn't mean the file is small, but that the buffer is temporarily half-full.

The right algorithm to read an InputStream fully and write it over an OutputStream is this:

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

Upvotes: 1

fge
fge

Reputation: 121712

Use:

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

As the class says, the second argument is a Path, not a File.

Generally, since this is 2015, use Path and drop File; if an API still uses File, make it so that it uses it at the last possible moment and use Path all the way.

Upvotes: 0

BetaRide
BetaRide

Reputation: 16834

You can use the Files.copy() methods.

Copies all bytes from an input stream to a file. On return, the input stream will be at end of stream.

Upvotes: 0

Related Questions