Reading a file using fixed number of bytes java
我正在编写一个程序来复制大文件,所以我想读取特定数量的字节并写入另一个文件。我想复制文件并获得相同的字节数。但我越来越多了。另外,我还希望文件的内容保持不变。我在这里做错了什么?如果有人能解释为什么我会收到这个额外的文字,那就太好了。
test.txt
1 2 3 4 | sometext sometext sometext sometext sometext sometext sometext sometext sometext sometext sometext sometext sometext sometext sometext sometext |
实践.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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
1 2 3 4 5 6 | sometext sometext sometext sometext sometext sometext sometext sometext sometext sometext sometext sometext sometext sometext sometext sometext metext sometext sometext sometext sometext sometext |
您的代码有几个问题:
-
您正在使用默认平台编码将二进制数据转换为文本(通过调用
new String(byte[]) 而不是指定编码 -
您正在使用默认平台编码将文本写入磁盘(使用
FileWriter ) -
您无条件地将整个缓冲区转换为文本,即使您的读取没有填充它 - 您可以通过使用
String 构造函数重载之一来解决这个问题,该重载采用偏移量和字节数,并传递0 和b 用于参数,尽管我不会。使用 try-with-resources 语句。 - 您根本没有关闭输入流,如果抛出异常,您也没有关闭编写器。使用 try-with-resources 语句。
-
您正在捕获
Exception - 这通常是个坏主意。如果必须,捕获特定异常;就我个人而言,我只有很少的catch 块 - 通常如果出现问题,则中止整个当前操作是合适的。 (当然,在某些情况下您可以重试等。)我知道这可能只是在您的示例代码中,而不是在您的真实代码中。 - 如果您只是尝试复制文件,则根本没有理由在二进制和文本之间进行转换 - 坚持使用输入流和输出流
-
如果你只是想复制一个文件,你可以使用
Files.copy 来避免编写任何代码,假设你使用的是 Java 7。(如果你不是,你应该是!)
如果您只想将
1 2 3 4 5 | byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = input.read(buffer)) != -1) { output.write(buffer, 0, bytesRead); } |