如何逐字节复制二进制文件

时间:2013-10-09 08:04:01

标签: java file-io

我目前正试图解决用Java读取和写入文件的一个问题。

所以任务是,我直接获取我想要读取的文件的InputStream对象(我没有实际文件只是InputStream对象),并且从这个对象我想重新创建原始文件。

我试图逐字节地从文件中读取数据,并在anather文件中写入相同内容。

但它仅适用于.txt文件,不适用于doc,docx,PDF文件。我没有检查非.txt格式的其余部分,但我希望它适用于所有格式。

对于非txt格式,文件已生成,但其中的内容不可见。

所以我的问题是如何使用所有类型文件格式的InputStream对象重新创建文件。

以下是我用来编写文件的示例代码。

    File file = new File("/home/sumit/Documents/newAbc.docx");
    File fileAbc = new File("/home/sumit/Documents/abc.docx");
    InputStream inputStream = new FileInputStream(fileAbc); // this is just for this sample code snippet but orginally I already have InputStream object.
    // if file doesnt exists, then create it
    if (!file.exists()) {
        file.createNewFile();
    }

    FileWriter fw = new FileWriter(file.getAbsoluteFile());
    BufferedWriter bw = new BufferedWriter(fw);

    int data = inputStream.read();
    while(data != -1) {
      //do something with data...
      bw.write(data);       
      data = inputStream.read();

    }
    inputStream.close();
    bw.close();

以上代码已正确编译和执行,但创建的文件未正确显示内容。

搜索时我发现我无法直接从这里阅读Doc,PDf等:Reading .docx file in java

但是从http://poi.apache.org/ POI库我找不到任何能告诉我如何使用InputStream写入文件的内容。

有谁知道如何解决上述问题?

1 个答案:

答案 0 :(得分:1)

*Writer类用于文本上下文,并根据某些编码进行转换,默认情况下为标准平台编码。 因此,您希望使用FileOutputStream而不是FileWriter来编写二进制文件格式。

此外,您最终还是希望使用byte[]缓冲区来读取和写入以进行优化。