使用固定数量的字节java读取文件

时间:2015-02-15 10:01:05

标签: java file byte filestream

我正在编写一个复制大文件的程序,所以我想读取特定的字节数并写入另一个文件。我想复制文件并获得相同的字节数。但我越来越多了。另外,我还希望文件的内容保持不变。我在这做错了什么?如果有人能解释为什么我会收到这些额外的文本,那就太棒了。

的test.txt

sometext sometext sometext sometext
sometext sometext sometext sometext
sometext sometext sometext sometext
sometext sometext sometext sometext

Practice.java

public class Practice{
    public static void main(String[] args){

    byte[] buffer = new byte[100];

    try{
        FileInputStream f = new FileInputStream("test.txt");
        FileWriter writer = new FileWriter("copy_test.txt");
        int b;
        while ((b=f.read(buffer)) != -1 )
            writer.write(new String(buffer));
        writer.close();
    } catch(Exception e){
        e.printStackTrace();
    }
 }
}

copy_test.txt

sometext sometext sometext sometext
sometext sometext sometext sometext
sometext sometext sometext sometext
sometext sometext sometext sometext
metext sometext sometext
sometext sometext sometext

1 个答案:

答案 0 :(得分:5)

您的代码存在一些问题:

  • 您正在使用默认平台编码将二进制数据转换为文本(通过调用new String(byte[])而不是指定编码
  • 您正在使用默认平台编码将文本写入磁盘(使用FileWriter
  • 您无条件地将缓冲区的整个转换为文本,即使您的阅读没有填写 - 您可以使用{{1}中的一个来修复此问题构造函数重载获取偏移量和字节数,并传递String0作为参数,尽管我不会这样做。使用try-with-resources语句。
  • 您根本没有关闭输入流,如果抛出异常,您就不会关闭编写器。使用try-with-resources语句。
  • 您正在抓住b - 这通常是一个坏主意。如果必须,请捕获特定的例外;我个人很少Exception块 - 通常如果出现问题,中止整个当前操作是合适的。 (当然,有些情况下你可以重试等。)我知道这可能只是在你的示例代码中,而不是你的真实代码。
  • 如果你只是想复制一个文件,根本没有理由在二进制和文本之间进行转换 - 坚持使用输入流和输出流
  • 如果您只是尝试复制文件,则可以使用Files.copy来避免编写任何代码,假设您使用的是Java 7.(如果您使用的是#39) ;不,你应该!)

如果您只想将catch复制到InputStream(并且您还没有实用程序库可用 - 这是 lot 的一部分库)你可以使用类似的东西:

OutputStream