Java IO流 之 RandomAccessFile 多线程下载

Posted verejava

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java IO流 之 RandomAccessFile 多线程下载相关的知识,希望对你有一定的参考价值。

http://www.verejava.com/?id=16994721196019

package com.randomaccessfile;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;

public class TestThreadDownload
{
    
    public static void main(String[] args)
    {
        try
        {
            InputStream is=new FileInputStream(new File("res/raf/water.jpg"));
            long contentLength=is.available();
            
            //创建一个跟要下载的文件同大小的文件
            RandomAccessFile raf=new RandomAccessFile(new File("res/raf/new2.jpg"),"rw");
            raf.setLength(contentLength);
            raf.close();
            //计算每段要下载多长
            long earchLength=contentLength/5;
            if(contentLength%5!=0)
            {
                earchLength++;
            }
            for(int i=0;i<5;i++)
            {
                new Thread(new DownloadThread(earchLength,i)).start();
            }

        } catch (FileNotFoundException e)
        {
            e.printStackTrace();
        } catch (IOException e)
        {
            e.printStackTrace();
        }
    }
    
    static class  DownloadThread implements Runnable
    {
        private long earchLength;
        private int i;
        
        public DownloadThread(long earchLength,int i)
        {
            this.earchLength=earchLength;
            this.i=i;
        }
        @Override
        public void run()
        {
            RandomAccessFile raf=null;
            try
            {
                InputStream is=new FileInputStream(new File("res/raf/water.jpg"));
                long skip=earchLength*i;
                is.skip(skip);
                raf = new RandomAccessFile(new File("res/raf/new2.jpg"),"rw");
                raf.seek(skip);
                int l=0;
                System.out.println(raf.getFilePointer());
                while((raf.getFilePointer()<=skip+earchLength)&&((l=is.read())!=-1))
                {
                    raf.write(l);
                }
            } catch (FileNotFoundException e)
            {
                e.printStackTrace();
            } catch (IOException e)
            {
                e.printStackTrace();
            }
            finally
            {
                try
                {
                    raf.close();
                } catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
            
        }
        
    }
}

http://www.verejava.com/?id=16994721196019

以上是关于Java IO流 之 RandomAccessFile 多线程下载的主要内容,如果未能解决你的问题,请参考以下文章

java基础之IO流

Java 之IO流及应用

重新java系列之IO流

JAVA基础之IO流

java之IO流

java之IO流