gpt4 book ai didi

java - 为什么不应该相等的两个文件不相等?我用 Java Socket 下载了一个文件,并将它与用 Mozilla 下载的相同文件进行比较

转载 作者:行者123 更新时间:2023-12-03 11:52:33 25 4
gpt4 key购买 nike

我正在使用 Java Socket 下载文件。该代码仅用于测试文件是否相等。它是一个更大项目的一部分。

import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Arrays;


public class Compare {

/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
Socket sk = null;
try
{
sk = new Socket("wlab.cs.bilkent.edu.tr", 80);
if (sk.isConnected())
{

PrintWriter out = new PrintWriter(sk.getOutputStream(),true);
out.println("GET /" + "/PA2/test5MB.bin" + " HTTP/1.1");
out.println("Host: " + 80);
// out.println("Range: " + 0 + '-' + 5242879);
out.println("Connection: close\r\n");
out.println("");
out.flush();

}
}catch(Exception e){

}


// receive file
byte [] mybytearray = new byte [5242880]; // when i use HEAD, this size is returned.

// FileInputStream is = new FileInputStream("C:\\Users\\Eda\\workspace\\network1\\t1est5MB.bin");
InputStream is = sk.getInputStream(); //when I used this one, the files don't match, but the above declaration works.

FileOutputStream fos = new FileOutputStream( new File ("C:\\Users\\Eda\\workspace\\network1\\tesst5MB.bin"));
BufferedOutputStream bos = new BufferedOutputStream(fos);


int offset3 = 0;
int numRead3 = 0;
System.out.println("1 in length: " +mybytearray.length);

while(offset3 < mybytearray.length
&& (numRead3=is.read(mybytearray, offset3, mybytearray.length-offset3)) >= 0 )


{
offset3 += numRead3;
// is=sk.getInputStream();
}
bos.write(mybytearray);
is.close();

bos.close();

//rest is for comparing two binary files.works except for the file I downloaded in this code above.
try{
File filename=new File("C:\\Users\\Eda\\workspace\\network1\\tesst5MB" +".bin");
File filename2=new File("C:\\Users\\Eda\\workspace\\network1\\t1est5MB" +".bin");
if(filename.exists() && filename2.exists())
System.out.println("both exists");

int size = (int)filename.length();
System.out.println("size1: " + size);
byte[] byteArray1 = new byte[size];
size = (int)filename2.length();

System.out.println("size2: " + size);
byte[] byteArray2 = new byte[size];

DataInputStream infile1 = new DataInputStream(new FileInputStream(filename));


DataInputStream infile2 = new DataInputStream(new FileInputStream(filename2));


int offset1 = 0;
int numRead1 = 0;


int offset2 = 0;
int numRead2 = 0;
System.out.println("1 in length: " +byteArray1.length);

while(offset1 < byteArray1.length
&& (numRead1=infile1.read(byteArray1, offset1, byteArray1.length-offset1)) >= 0)


{
offset1 += numRead1;

}

infile1.close();


while(offset2 < byteArray2.length
&& (numRead2=infile2.read(byteArray2, offset2, byteArray2.length-offset2)) >= 0)


{
offset2 += numRead2;

}

infile2.close();


System.out.println(Arrays.equals(byteArray1,byteArray2));
}
catch(Exception e){

}

}

}

当我通过逐字节读取文件并进行比较来复制文件时,它们是相等的。但是当我通过 Socket 下载文件并将其与我用 Mozilla 下载的文件进行比较时(它们应该相等),它们不相等。我不知道我的 sk.getInputStream() 有什么问题。我被困在这里。你能告诉我怎么做吗?我不知道该怎么办。他们只是不平等,我不知道为什么。
我给出的文件大小是我使用 HEAD 请求时的文件大小。 5 MB

最佳答案

当您使用原始套接字连接时,您将获得需要解析的 HTTP header ,而不是保存到输出文件中。实际数据在您看到一行中的两个换行符后开始,表示标题的结尾。您应该阅读 Content-length从标题,而不是硬编码。

如果您打开下载的文件(使用 Socket 制作的文件),您将看到那些 HTTP header 。

如果这是作为生产代码(不只是玩玩或一次性交易),则不应使用 Socket for HTTP。 HTTP 比您在此处实现的要复杂得多。至少,您应该检查结果代码以确保得到 200。

看看java.net.URLConnection

关于java - 为什么不应该相等的两个文件不相等?我用 Java Socket 下载了一个文件,并将它与用 Mozilla 下载的相同文件进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4534663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com