Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用DataInputStream逐字节复制文件会在完成之前停止_Java_Io_Inputstream - Fatal编程技术网

Java 使用DataInputStream逐字节复制文件会在完成之前停止

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

我用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_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);
}