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

use*_*119 1 java byte file filestream

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

的test.txt

sometext sometext sometext sometext
sometext sometext sometext sometext
sometext sometext sometext sometext
sometext sometext sometext sometext
Run Code Online (Sandbox Code Playgroud)

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();
    }
 }
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

您的代码有几个问题:

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

如果你只是想一个拷贝InputStreamOutputStream(你有没有一个实用程序库提供-这是一个部分很多库),你可以使用这样的:

byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = input.read(buffer)) != -1) {
    output.write(buffer, 0, bytesRead);
}
Run Code Online (Sandbox Code Playgroud)