Java 使用DataInputStream逐字节复制文件会在完成之前停止
我用java编写了以下程序,使用DataInput\Output Stream复制文件Java 使用DataInputStream逐字节复制文件会在完成之前停止,java,io,inputstream,Java,Io,Inputstream,我用java编写了以下程序,使用DataInput\Output Stream复制文件 import java.io.*; public class FileCopier { public static void main(String args[]) throws Exception { File file = new File("/home/Sample.mkv"); File copy = new File("/home/Copy_of_S
import java.io.*;
public class FileCopier {
public static void main(String args[]) throws Exception
{
File file = new File("/home/Sample.mkv");
File copy = new File("/home/Copy_of_Sample.mkv");
if(copy.exists())
{
copy.delete();
}
copy.createNewFile();
DataInputStream din = new DataInputStream(new FileInputStream(file));
DataOutputStream dout = new DataOutputStream(new FileOutputStream(copy));
byte c;
c = 1;
long time = System.currentTimeMillis();
while(c!=-1)
{
c = (byte) din.read();
dout.write(c);
}
time = System.currentTimeMillis() - time;
System.out.println(time);
}
}
然而,我没有得到预期的结果。据我所知,read()方法DataInputStream从输入流中读取下一个字节,并将其转换为int。在这里,我再次将其转换为字节,并将该字节写入另一个文件,但这仍然无法按预期工作。我试图复制的原始文件大小为8.5 MB,而复制的文件大小仅为5.3 MB
请帮助我理解为什么会发生这种情况
提前感谢,,
Nishant问题在于在检查结果是否为-1之前强制转换(字节)
,该值是用于指示EOF的前哨值
在5.3MB左右,读取了一个值为255的字节,并且(byte)255==-1
,这导致循环在输入结束之前终止
将其更改为不强制转换“字节”
而且,这必须是最低效的拷贝实现之一。。使用缓冲流和是两种简单的方法,可以大大加快速度。DataInputStream的read()方法将数据的下一个字节读取为0-255之间的值。Java中的字节数据类型是有符号的,因此其值从-128到127。这就是为什么当强制转换到一个字节时,某些值显示为-1,从而停止它
最好的选择是使用int
int c = 0;
while(c!=-1)
{
c = din.read();
dout.write(c);
}
使用int表示将读取和写入正确的值
(我没有足够的rep来注释,但是一个char是无符号的,Java中有两个字节。它的值永远不会是-1。)read方法返回一个整数而不是一个字节 从输入流读取数据的下一个字节。字节的值为 以0到255范围内的整数返回。如果没有可用的字节 由于已到达流的末尾,因此值-1为 返回 因此,您将获得一个int,检查该值是否不是-1,并将其转换回字节以将其写入outputstream
int c = -1;
while((c = din.read()) !=-1)
{
dout.write((byte)c);
}
据我所知,read()方法DataInputStream从输入流中读取下一个字节并将其转换为int
对。所以它应该是intc代码>和非字节c代码>
在这里,我再次将其转换为字节,并将该字节写入另一个文件
所以,这是你的错误。将字节
再次转换为字节
我试图复制的原始文件大小为8.5 MB,而复制的文件大小仅为5.3 MB
如前所述,读取/遇到了值为'-1'
且不是的字节
,文件结束标记-1
。
通过read()
方法将其作为值'255'
的整数返回。
您的代码将其存储为'-1'字节
中的'c'
,导致而(c!=-1)
检查失败并中途终止
int c = -1;
while((c = din.read()) !=-1)
{
dout.write((byte)c);
}