java 多线程-为什么使用Java多线程下载文件时下载后的文件和服务器端文件大小一模一样但是无法打开

问题描述

为什么使用Java多线程下载文件时下载后的文件和服务器端文件大小一模一样但是无法打开

为什么使用Java多线程下载文件时下载后的文件和服务器端文件大小一模一样但是无法打开??

package com.miuitust.mutilethread;

import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;

public class MutileThreadDownload {

    private static int THREADCOUNT = 3;

    private static long blocksize;

    public static void main(String[] args) throws Exception {

        // 服务器文件路径
        String path = "http://localhost/demo.exe";
        URL url = new URL(path);

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setConnectTimeout(5000);
        int code = conn.getResponseCode();

        if (code == 200) {
            long size = conn.getContentLength();

            System.out.println("服务器文件的大小:" + size);

            blocksize = size / THREADCOUNT;

            //在本地创建一个空白的文件
            File file = new File("target.exe");
            RandomAccessFile raf = new RandomAccessFile(file, "rw");
            raf.setLength(size);

            //20,796,344   20,796,344
            //开启线程
            for (int i = 1; i <= THREADCOUNT; i++) {
                long startIndex = (i - 1) * blocksize;
                long endIndex = i * blocksize - 1;

                if (i == THREADCOUNT) {
                    endIndex = size-1;
                }
                System.out.println("开启线程:" + i + "下载的位置:" + startIndex + "~"
                        + endIndex);
                new DownloadThread(i, startIndex, endIndex, path).start();
            }
        }

        conn.disconnect();
    }

    private static class DownloadThread extends Thread {
        private int threadId;
        private long startIndex;
        private long endIndex;
        private String path;

        public DownloadThread(int threadId, long startIndex, long endIndex,
                String path) {
            super();
            this.path = path;
            this.threadId = threadId;
            this.startIndex = startIndex;
            this.endIndex = endIndex;
        }

        @Override
        public void run() {

            try {
                URL url = new URL(path);
                HttpURLConnection conn = (HttpURLConnection) url
                        .openConnection();
                conn.setRequestMethod("GET");
                conn.setRequestProperty("Range", "bytes=" + startIndex + "-"
                        + endIndex);
                conn.setConnectTimeout(5000);
                int code = conn.getResponseCode();
                System.out.println("服务器状态码:" + code);

                InputStream is = conn.getInputStream();
                File file = new File("target.exe");

                RandomAccessFile raf = new RandomAccessFile(file, "rw");

                //指定文件开始写的位置
                raf.seek(startIndex);
                System.out.println("第" + threadId + "个线程写文件的开始位置:" + startIndex);

                int len = 0;
                byte[] buffer = new byte[1024];
                while ((len = is.read(buffer)) != -1  && startIndex < endIndex) {
                    raf.write(buffer, 0, len);
                }
                is.close();
                raf.close();
                System.out.println("线程" + threadId + "下载完毕了");
            } catch (Exception e) {
                e.printStackTrace();
            }

        }

    }
}

有没有大神晓得是怎么回事呢?

解决方案

用ultraedit之类的工具打开看看内容是不是一样

解决方案二:

不懂帮猜,会不会是下载的文件 编码 和源文件不一致?

解决方案三:

很简单,你根本没下载到文件,而是只是指定了文件的大小和原文件一样大,就是所谓的占位,你这是分段下载文件,响应码改成206就可以了

时间: 2024-09-03 05:33:51

java 多线程-为什么使用Java多线程下载文件时下载后的文件和服务器端文件大小一模一样但是无法打开的相关文章

input file-C#上传文件时找不到文件~求解~!!

问题描述 C#上传文件时找不到文件~求解~!! //后台代码 public static class Qiniu_API { public static string Bucket = """";//空间名 public static string Domain = """";//域名 static Qiniu_API() { Config.ACCESS_KEY = ""<AK>"&q

android xm l pull-android 用pull 解析xml文件时,直接遇到文件结束(END_DOCUMENT)

问题描述 android 用pull 解析xml文件时,直接遇到文件结束(END_DOCUMENT) xml 文件 <?xml version="1.0" encoding="UTF-8"?> xmlns:gd="http://schemas.google.com/g/2005" xmlns:opensearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:db=

关于java问题-我的是myeclipse9.0,为什么导入后的文件不转换到图形设计界面啊???

问题描述 我的是myeclipse9.0,为什么导入后的文件不转换到图形设计界面啊??? 问题如题 ,就是如何将 "Source"和"Design"调出来 也就是如何跳转到设计界面实行设计,我的是java设计界面,求大神指导.... 解决方案 导入文件后,应打开后缀名为form的文件,才能转换到图形图形界面,如先打开的是后缀名为java的文件应关闭该文件,在打开后缀名为form文件 解决方案二: 按照正确的步骤重新导一次,应该是你中间步骤有错误.

win7电脑中如何让EditPlus软件在保存文件时不生成bak文件

  EditPlus软件,想必熟悉代码的朋友都不会对这个软件感到陌生吧?是的,在w764位旗舰版电脑中,EditPlus软件是专门用来查看代码的一款软件,也是很多用户都常使用到的一个软件.虽然说这款软件小巧方便,但是也存在一定的问题,想必很多用户都已经发现了吧,在win7旗舰版电脑中使用EditPlus软件,在保存文件的时候会自动生成一个bak文件,这次你删除掉了,下次它还会生成,那么咱们是否有办法可以禁止这个bak文件的生成呢?下面,小编就来详细的介绍一下吧! 1.首先,咱们打开win7旗舰版

安装VSTO文件时,提示为文件dll计算出的哈希值与清单中的指定值不同

问题描述 用VS2010生成的VSTO文件,安装时提示错误:为文件Word.UI.dll计算出的哈希值与清单中的指定值不同.项目也没有使用clickonce发布,详细提示如下:System.Deployment.Application.InvalidDeploymentException:为文件Word.UI.dll计算出的哈希值与清单中的指定值不同.在Microsoft.VisualStudio.Tools.Applications.Deployment.ClickOnceAddInDeplo

winhttp 亚马逊云盘-使用winhttp向亚马逊云盘上传文件时,报12030错误

问题描述 使用winhttp向亚马逊云盘上传文件时,报12030错误 我用winhttp协议做上传文件时,上传文件到云盘,上传中途在WinHttpWriteData 处出错,报12030,有谁知道,有避免的方法吗 解决方案 12030 ERROR_INTERNET_CONNECTION_ABORTED The connection with the server has been terminated. 是不是有中文名等特殊字符 解决方案二: 不是这个原因,我传小文件就能传成功,传大文件就会报那

vc++-加密文件时是如何选取信息作为加密算法的输入的? 如何实现?

问题描述 加密文件时是如何选取信息作为加密算法的输入的? 如何实现? 我要编写一个文件(夹)加解密的软件. 相关算法有DES.AES等等. 这些算法的输入的要求是固定的位数. 那么当我选取某个要加密的文件时,是这么文件什么部分的信息作为该算法的输入的呢?如何获取这个固定位数的明文? 同理当解密是,加密了的文件我如何获得它所拥有的密文,经过解密算法,输出明文,然后将这明文还原成原文件? 如何保证每一个不同的文件的这个摘要是唯一的? 解决方案 每个文件循环读取一定大小加密.一块块操作.

浏览器预览PHP文件时顶部出现空白影响布局分析原因及解决办法_php技巧

在编写PHP文件过程中,发现在浏览器预览PHP文件时,顶部会出现一行空白,影响了页面的布局. 关于BOM header的解释如下: 通常情况下,使用Windows系统自带的记事本程序编写网页程序,但在编写或修改php博客系统代码后,进行调试时总是会出现如同以下几点问题: –不能登入或者不能登出: –页顶出现一条空白: –页顶出现错误警告: –其它不正常的情况. 分析原因: 由于使用UTF-8编码,在编写或修改代码后都保存为utf-8编码格式.虽然现在几乎所有的文本编辑软件都可以显示并编辑UTF-

Java技术体验:HTTP多线程下载,端口侦听和自启动服务

一个网友正好需要这个东西,我就把几个技术整合到了一起.包括三个部分,实现时也是逐个做到的 多线程的文件下载,HTTP协议 把这个功能做成一个HTTP的服务,侦听在某个端口上,方便非Java的系统使用 把这个功能封装为一个Windows服务,在机器启动时可以自动启动 我们逐个看程序. 一.多线程下载 这个主要使用了HTTP协议里面的一个Range参数,他设置了你读取数据的其实位置和终止位置. 经常使用flashget的用户在查看连接的详细信息时,应该经常看到这个东西.比如 Range:bytes=