随机操作文件,这个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晓码阁 版权所有