无法使用Java下载数据文件

无法使用Java下载数据文件,java,file,sockets,stream,Java,File,Sockets,Stream,我需要用Java下载一个文件。我可以使用此代码下载文本文件。但我下载图像[数据]文件时遇到问题。它们被写入已损坏的磁盘。我做错了什么 FileOutputStream fileOutputStream = new FileOutputStream(url .getPath().substring(url.getPath().lastIndexOf("/") + 1)); BufferedReader bufferedReader = new BufferedRea

我需要用Java下载一个文件。我可以使用此代码下载文本文件。但我下载图像[数据]文件时遇到问题。它们被写入已损坏的磁盘。我做错了什么

FileOutputStream fileOutputStream = new FileOutputStream(url
                .getPath().substring(url.getPath().lastIndexOf("/") + 1));
BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));
String line = "";
long l = 0;
while (!(line = bufferedReader.readLine()).isEmpty()) {
    System.out.println(line);
    if (line.contains("Content-Length:")) {
        l = Long.parseLong(line.substring(
                "Content-Length:".length()).trim());
    }
}

byte[] bytes = new byte[socket.getSendBufferSize()];
BufferedWriter bufferedWriter = new BufferedWriter(
        new OutputStreamWriter(fileOutputStream));
int x = 0;
long fullLength = 0;
int length = 0;
DataInputStream dataInputStream = new DataInputStream(
        socket.getInputStream());
DataOutputStream dataOutputStream = new DataOutputStream(
        fileOutputStream);
while (fullLength < l
        && (length = dataInputStream.read(bytes)) != -1) {
    dataOutputStream.write(bytes, 0, length);

    System.out.print(length + " ");
    bufferedWriter.flush();
    fullLength += length;
}

fileOutputStream.flush();
bufferedWriter.close();
socket.close();
FileOutputStream FileOutputStream=新的FileOutputStream(url)
.getPath().substring(url.getPath().lastIndexOf(“/”+1));
BufferedReader BufferedReader=新的BufferedReader(
新的InputStreamReader(socket.getInputStream());
字符串行=”;
长l=0;
而(!(line=bufferedReader.readLine()).isEmpty()){
系统输出打印项次(行);
if(line.contains(“内容长度:”){
l=Long.parseLong(line.substring(
“内容长度:”.Length()).trim());
}
}
byte[]bytes=新字节[socket.getSendBufferSize()];
BufferedWriter BufferedWriter=新的BufferedWriter(
新的OutputStreamWriter(fileOutputStream));
int x=0;
长全长=0;
整数长度=0;
DataInputStream DataInputStream=新DataInputStream(
socket.getInputStream());
DataOutputStream DataOutputStream=新DataOutputStream(
文件输出流);
而(全长
看起来您正在尝试使用HTTP协议下载二进制文件。实际上,这可以通过更简单的方式实现:

final URL url = new URL("http://upload.wikimedia.org/wikipedia/commons/9/94/Giewont_and_Wielka_Turnia.jpg");  //1
final InputStream input = url.openStream();  //2
final OutputStream output = new BufferedOutputStream(new FileOutputStream("giewont.jpg")); //3
IOUtils.copy(input, output);  //4
input.close();  //5
output.close();
分步骤:

  • 创建指向要下载的资源的
    URL
  • openStream()
    逐字节读取文件。底层的
    URL
    实现处理套接字、
    内容长度等
  • 创建一个空文件以保存数据
  • 输入
    的内容复制到
    输出
    。我使用Apache来避免在循环中进行枯燥和容易出错的复制
  • 关闭两条溪流。您需要关闭
    输入
    以关闭实际套接字(可能在流结束后隐式发生?)和
    输出
    以刷新缓冲区
  • …就这样
    请注意,由于您基本上是逐字节复制数据,因此文本文件(无论编码如何)和二进制文件都能正确传输。

    Hm,混合使用读卡器(特别是可能提前读取的缓冲读卡器)和底层流似乎是您的问题。谢谢。逐字节复制解决了这个问题。我认为缓冲总是最好的选择。再次感谢。