Java IO 流 -- 随机读取和写入流 RandomAccessFile (文件分割和合并)
RandomAccessFile 相对其它流多了一个seek() 方法指定指针的偏移量。
1、指定起始位置读取剩余内容
public static void test01() throws IOException {
RandomAccessFile raf = new RandomAccessFile("src/com/xzlf/io/CopyFile.java", "r");
// 随机读取
raf.seek(2);
byte[] flush = new byte[1024];
int len = -1;
while((len=raf.read(flush)) != -1) {
System.out.println(new String(flush,0,len));
}
raf.close();
}
2、指定起始位置和实际大小
public static void test02() throws IOException {
RandomAccessFile raf = new RandomAccessFile("src/com/xzlf/io/CopyFile.java", "r");
// 起始位置
int beginPos = 2+1026;
// 实际大小
int actualSize = 1026;
// 随机操作
raf.seek(beginPos);
// 缓冲容器
byte[] flush = new byte[1024];
int len = -1;
while ((len = raf.read(flush)) != -1) {
if(actualSize > len) {
System.out.println(new String(flush, 0, len));
actualSize -= len;
}else {
System.out.println(new String(flush, 0, actualSize));
break;
}
}
raf.close();
}
3、封装
package com.xzlf.io;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.RandomAccessFile;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
public class SplitFile {
// 源头
private File src;
// 目的地
private String destDir;
// 所有分割后文件存储路劲
List<String> destPath;
// 每块大小
int blockSize;
// 块数
int size;
public SplitFile(String srcPaht, String destDir) {
this(srcPaht, destDir, 1024);
}
public SplitFile(String srcPath, String destDir, int blockSize) {
this.src = new File(srcPath);
this.destDir = destDir;
this.blockSize = blockSize;
this.destPath = new ArrayList<String>();
init();
}
// 初始化
private void init() {
// 总长度
long len = this.src.length();
// 块数
this.size = (int) Math.ceil(len * 1.0 / blockSize);
for(int i = 0; i < size; i++) {
this.destPath.add(this.destDir + "/" + i + "-" + this.src.getName());
}
}
/**
* 分割
* 1、计算每一块的起始位置及大小
* 2、分割
* @throws IOException
*/
public void split() throws IOException {
File src = this.src;
// 总长度
long len = src.length();
// 起始位置和实际大小
int beginPos = 0;
int actualSize = 0;
for(int i = 0; i < size; i++) {
beginPos = i * blockSize;
if(i == size -1) { // 最后一块
actualSize = (int) len;
}else {
actualSize = blockSize;
len -= actualSize; // 剩余量
}
System.out.println(i + "-->" + beginPos);
splitDetail(i, beginPos, actualSize);
}
}
/**
* 指定第 i 块、起始位置、实际长度
* @param i
* @param beginPos
* @param actualSize
* @throws IOException
*/
private void splitDetail(int i, int beginPos, int actualSize) throws IOException {
RandomAccessFile raf = new RandomAccessFile(src, "r");
RandomAccessFile raf2 = new RandomAccessFile(destPath.get(i), "rw");
raf.seek(beginPos);
byte[] flush = new byte[1024];
int len = -1;
while((len = raf.read(flush)) != -1) {
if(actualSize > len) {// 获取本次读取的所有内容
raf2.write(flush, 0, len);
actualSize -= len;
}else {
raf2.write(flush, 0, actualSize);
break;
}
}
raf.close();
raf2.close();
}
/**
* 文件的合并
* @param destPaht
* @throws IOException
*/
public void merge(String destPath) throws IOException {
// 输出流
OutputStream os = new BufferedOutputStream(new FileOutputStream(destPath, true));
Vector<InputStream> vi = new Vector<InputStream>();
// 输入流
for (int i = 0; i < this.destPath.size(); i++) {
vi.add(new BufferedInputStream(new FileInputStream(this.destPath.get(i))));
}
SequenceInputStream sis = new SequenceInputStream(vi.elements());
// 文件拷贝
byte[] flush = new byte[1024];
int len = -1;
while((len = sis.read(flush)) != -1) {
os.write(flush, 0, len);
}
// 释放资源
os.flush();
os.close();
sis.close();
}
}
4、添加测试代码测试:
public static void main(String[] args) throws IOException {
// SplitFile sf = new SplitFile("src/com/xzlf/io/CopyFile.java", "dest");
SplitFile sf = new SplitFile("水电费.png", "dest");
sf.split();
// sf.merge("CopyFile.java");
sf.merge("水电费-merge.png");
}
Java IO 流 -- 随机读取和写入流 RandomAccessFile (文件分割和合并)的更多相关文章
- Java中的字符串流的读取和写入(创建文件并判断重复账户)
各位我又来了!!哎!好心酸!我还没注册到三天!!没法登上博客的首页!!心累!! import java.io.BufferedOutputStream; import java.io.Buffered ...
- JAVA IO分析二:字节数组流、基本数据&对象类型的数据流、打印流
上一节,我们分析了常见的节点流(FileInputStream/FileOutputStream FileReader/FileWrite)和常见的处理流(BufferedInputStream/B ...
- Java IO(十二) 字符流 Writer 和 Reader
Java IO(十二) 字符流 Reader和 Writer 一.介绍 涉及到文件(如果是纯文本文件形式)操作时,Java除了提供 FIle(文件和目录路径名的抽象表示形式) 和 FileDescri ...
- nodeks —— fs模块 —— 从流中 读取和写入数据
Fs流读取和写入数据 使用文件流来读取大文件不会卡顿 1, 从流中读取数据 var fs = require("fs"); var data = ''; var count = 0 ...
- Java配置文件Properties的读取、写入与更新操作
/** * 实现对Java配置文件Properties的读取.写入与更新操作 */ package test; import java.io.BufferedInputStream; import j ...
- 对Java配置文件Properties的读取、写入与更新操作
http://breezylee.iteye.com/blog/1340868 对Java配置文件Properties的读取.写入与更新操作 博客分类: javase properties 对Jav ...
- 实现对Java配置文件Properties的读取、写入与更新操作
/** * 实现对Java配置文件Properties的读取.写入与更新操作 */ package test; import java.io.BufferedInputStream; import j ...
- JAVA IO分析三:IO总结&文件分割与合并实例
时间飞逝,马上就要到2018年了,今天我们将要学习的是IO流学习的最后一节,即总结回顾前面所学,并学习一个案例用于前面所学的实际操作,下面我们就开始本节的学习: 一.原理与概念 一.概念流:流动 .流 ...
- Java IO学习笔记三:MMAP与RandomAccessFile
作者:Grey 原文地址:Java IO学习笔记三:MMAP与RandomAccessFile 关于RandomAccessFile 相较于前面提到的BufferedReader/Writer和Fil ...
随机推荐
- RMQ(倍增法求ST)
解决什么问题:区间查询最值 倍增思想:每次得出结果的范围呈2的幂次增长,有人说相当于二分,目前我觉得相当于线段树的查找. 具体理解看代码: /*倍增法求ST*/ #include<math.h& ...
- adb的多种连接方式(二)
一,设备连接 1,USB数据线连接 win10下USB连接Android 1.手机端的设置,以红米4为例: a.打开开发者模式,小米手机打开开发者模式方法为,连续点击MIUI版本,就可以进入开发者模式 ...
- 【LeetCode】15.三数之和
题目描述 1. 三数之和 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 注意: ...
- sql 模块 pymysql 数据库操作
1. 添加一个部门. import pymysql def main(): no = int(input('编号: ')) name = input('名字: ') loc = input('所在地: ...
- 使用内部枚举类作为外部类的参数的Mybatis的参数该如何判断
新写了一个接口,期望根据不同的参数来给数据库中不同的字段进行传值.这里使用了内部静态枚举类的方式进行传值,在写mybatis动态sql时,如果是普通对象,一般使用,那么使用枚举类,如何判断枚举类的值呢 ...
- 手工注入——MySQL手工注入实战和分析
今天进行了MySQL手工注入实战,分享一下自己的实战过程和总结,这里环境使用的是墨者学院的在线靶场.话不多说,咱们直接开始. 第一步,判断注入点 通过 ' 和构造 and 1=1 和 and 1=2 ...
- 实验四 数据查询3-group by等
实验四 数据库查询 一. 实验内容: 1. Group by语句 2. Having 语句 3. Order by语句 4. Limit语句 5. Union语句 6. Handler语句 二. ...
- Maximum splitting
Maximum splitting You are given several queries. In the i-th query you are given a single positive i ...
- mysql清空表后id重1开始
通过"truncate table 表名"方式重置清空id,让id从1开始自动递增,
- STM32F103ZET6 GPIO的使用
1.GPIO简介 STM32F103ZET6有多个GPIO组,如GPIOA.GPIOB.GPIOC...等等.每个GPIO组具有16个IO口. GPIO组的寄存器都是类似的,每个GPIO组都有2个32 ...