使用固定字节数读取文件 java
Reading a file using fixed number of bytes java
我正在编写一个程序来复制大文件,所以我想读取特定数量的字节并写入另一个文件。我想复制文件并获得相同数量的字节。但我越来越多。另外,我还希望文件的内容保持不变。我在这里做错了什么?如果有人能解释为什么我会收到这些额外的文字,那就太好了。
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();
}
}
}
复制_test.txt
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.(如果你不是,你应该是!)
如果您只想将 InputStream
复制到 OutputStream
(并且您没有可用的实用程序库 - 这是 lot[=39 的一部分=] 库)你可以只使用类似的东西:
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = input.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
我正在编写一个程序来复制大文件,所以我想读取特定数量的字节并写入另一个文件。我想复制文件并获得相同数量的字节。但我越来越多。另外,我还希望文件的内容保持不变。我在这里做错了什么?如果有人能解释为什么我会收到这些额外的文字,那就太好了。
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();
}
}
}
复制_test.txt
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.(如果你不是,你应该是!)
如果您只想将 InputStream
复制到 OutputStream
(并且您没有可用的实用程序库 - 这是 lot[=39 的一部分=] 库)你可以只使用类似的东西:
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = input.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}