随机操作文件,这个IO流对象与其他流对象不一样,不属于字节流也不属于字符流,继承于Object,独自成为一个IO流派系;
该类不算是IO体系中子类;
而是直接继承自Object;
但是它是IO包中成员,因为它具备读和写功能;
内部封装了一个数组,而且通过指针对数组的元素进行操作,可以通过getFilePointer获取指针位置;同时可以通过seek改变指针的位置;
其实完成读写的原理就是内部封装了字节输入流和输出流;
通过构造函数可以看出,该类只能操作文件;
而且操作文件还有模式,只读r,读写rw等;
如果模式为只读r,不会创建文件,会去读取一个已存在文件,如果该文件不存在,则会出现异常,如果模式rw,操作的文件不存在,会自动创建,如果存在则不会覆盖;
该流对象的作用在于,可以将一个数据文件,分段用多线程进行下载

下面模拟一个对单视频多线程下载的案例
线程类
package com.javaxl.io.other;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.RandomAccessFile;
/**
* @author 小李飞刀
* @site www.javaxl.com
* @company
* @create 2019-06-16 9:10
*/
public class DownLoadThread extends Thread{
//线程id
private int threadId;
private int StartPos;
private int EndPos;
private String FileURL;
private File SaveFile;
public DownLoadThread(int threadId, int StartPos, int EndPos, String FileURL, File SaveFile){
this.threadId = threadId;
this.StartPos = StartPos;
this.EndPos = EndPos;
this.FileURL = FileURL;
this.SaveFile = SaveFile;
}
@Override
public void run() {
try {
InputStream is = new FileInputStream(FileURL);
int len = 0;
byte[] buf = new byte[1024];
RandomAccessFile raf = new RandomAccessFile(SaveFile, "rw");
raf.seek(StartPos);
while((len = is.read(buf)) > 0) {
raf.write(buf, 0, len);
}
is.close();
System.out.println("线程" + threadId + "下载完毕!!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
主线程方法
package com.javaxl.io.other;
import java.io.*;
/**
* @author 小李飞刀
* @site www.javaxl.com
* @company
* @create 2019-06-16 9:10
*
* 要十分注意StartPos 和 EndPos 设置
*/
public class DownloadFile {
public final static String FileURL = "C:\\1、树形组件tree讲解.mp4";
public final static int COUNT = 5; //分段数
public static File SaveFile;
public static void main(String[] args) throws IOException {
method_COUNT();
}
public static void method_COUNT() throws IOException {
int position = FileURL.lastIndexOf("\\");
String fileName = FileURL.substring(position + 2); //文件名
System.out.println("file name is :" + fileName);
File file = new File(FileURL);
long FileLength = file.length();
System.out.println("文件总长度为:" + FileLength);
SaveFile = new File("C:\\partFiles\\" + fileName);
RandomAccessFile raf = new RandomAccessFile(SaveFile, "rw"); //若没有该文件,则自动创建
raf.setLength(FileLength); //设置文件长度
raf.close();
//分块大小
long blockSize = FileLength / COUNT;
for (int i = 0; i <= COUNT; i++) {
Long StartPos = i * blockSize;
Long EndPos = (i + 1) * blockSize - 1;
//最后一条线程EndPos = FileLength
if (i == COUNT) {
EndPos = FileLength;
}
System.out.println("线程" + i + "下载的部分为:" + StartPos + "---" + EndPos);
new DownLoadThread(i, StartPos.intValue(), EndPos.intValue(), FileURL, SaveFile).start();
}
}
}
控制台截图

对应的视频也下载到了C:\partFiles\1、树形组件tree讲解.mp4
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有