RandomAccessFile 相对其它流多了一个seek() 方法指定指针的偏移量。

1、指定起始位置读取剩余内容

  1. public static void test01() throws IOException {
  2. RandomAccessFile raf = new RandomAccessFile("src/com/xzlf/io/CopyFile.java", "r");
  3. // 随机读取
  4. raf.seek(2);
  5. byte[] flush = new byte[1024];
  6. int len = -1;
  7. while((len=raf.read(flush)) != -1) {
  8. System.out.println(new String(flush,0,len));
  9. }
  10. raf.close();
  11. }

2、指定起始位置和实际大小

  1. public static void test02() throws IOException {
  2. RandomAccessFile raf = new RandomAccessFile("src/com/xzlf/io/CopyFile.java", "r");
  3. // 起始位置
  4. int beginPos = 2+1026;
  5. // 实际大小
  6. int actualSize = 1026;
  7. // 随机操作
  8. raf.seek(beginPos);
  9. // 缓冲容器
  10. byte[] flush = new byte[1024];
  11. int len = -1;
  12. while ((len = raf.read(flush)) != -1) {
  13. if(actualSize > len) {
  14. System.out.println(new String(flush, 0, len));
  15. actualSize -= len;
  16. }else {
  17. System.out.println(new String(flush, 0, actualSize));
  18. break;
  19. }
  20. }
  21. raf.close();
  22. }

3、封装

  1. package com.xzlf.io;
  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.FileNotFoundException;
  7. import java.io.FileOutputStream;
  8. import java.io.IOException;
  9. import java.io.InputStream;
  10. import java.io.OutputStream;
  11. import java.io.OutputStreamWriter;
  12. import java.io.RandomAccessFile;
  13. import java.io.SequenceInputStream;
  14. import java.util.ArrayList;
  15. import java.util.List;
  16. import java.util.Vector;
  17. public class SplitFile {
  18. // 源头
  19. private File src;
  20. // 目的地
  21. private String destDir;
  22. // 所有分割后文件存储路劲
  23. List<String> destPath;
  24. // 每块大小
  25. int blockSize;
  26. // 块数
  27. int size;
  28. public SplitFile(String srcPaht, String destDir) {
  29. this(srcPaht, destDir, 1024);
  30. }
  31. public SplitFile(String srcPath, String destDir, int blockSize) {
  32. this.src = new File(srcPath);
  33. this.destDir = destDir;
  34. this.blockSize = blockSize;
  35. this.destPath = new ArrayList<String>();
  36. init();
  37. }
  38. // 初始化
  39. private void init() {
  40. // 总长度
  41. long len = this.src.length();
  42. // 块数
  43. this.size = (int) Math.ceil(len * 1.0 / blockSize);
  44. for(int i = 0; i < size; i++) {
  45. this.destPath.add(this.destDir + "/" + i + "-" + this.src.getName());
  46. }
  47. }
  48. /**
  49. * 分割
  50. * 1、计算每一块的起始位置及大小
  51. * 2、分割
  52. * @throws IOException
  53. */
  54. public void split() throws IOException {
  55. File src = this.src;
  56. // 总长度
  57. long len = src.length();
  58. // 起始位置和实际大小
  59. int beginPos = 0;
  60. int actualSize = 0;
  61. for(int i = 0; i < size; i++) {
  62. beginPos = i * blockSize;
  63. if(i == size -1) { // 最后一块
  64. actualSize = (int) len;
  65. }else {
  66. actualSize = blockSize;
  67. len -= actualSize; // 剩余量
  68. }
  69. System.out.println(i + "-->" + beginPos);
  70. splitDetail(i, beginPos, actualSize);
  71. }
  72. }
  73. /**
  74. * 指定第 i 块、起始位置、实际长度
  75. * @param i
  76. * @param beginPos
  77. * @param actualSize
  78. * @throws IOException
  79. */
  80. private void splitDetail(int i, int beginPos, int actualSize) throws IOException {
  81. RandomAccessFile raf = new RandomAccessFile(src, "r");
  82. RandomAccessFile raf2 = new RandomAccessFile(destPath.get(i), "rw");
  83. raf.seek(beginPos);
  84. byte[] flush = new byte[1024];
  85. int len = -1;
  86. while((len = raf.read(flush)) != -1) {
  87. if(actualSize > len) {// 获取本次读取的所有内容
  88. raf2.write(flush, 0, len);
  89. actualSize -= len;
  90. }else {
  91. raf2.write(flush, 0, actualSize);
  92. break;
  93. }
  94. }
  95. raf.close();
  96. raf2.close();
  97. }
  98. /**
  99. * 文件的合并
  100. * @param destPaht
  101. * @throws IOException
  102. */
  103. public void merge(String destPath) throws IOException {
  104. // 输出流
  105. OutputStream os = new BufferedOutputStream(new FileOutputStream(destPath, true));
  106. Vector<InputStream> vi = new Vector<InputStream>();
  107. // 输入流
  108. for (int i = 0; i < this.destPath.size(); i++) {
  109. vi.add(new BufferedInputStream(new FileInputStream(this.destPath.get(i))));
  110. }
  111. SequenceInputStream sis = new SequenceInputStream(vi.elements());
  112. // 文件拷贝
  113. byte[] flush = new byte[1024];
  114. int len = -1;
  115. while((len = sis.read(flush)) != -1) {
  116. os.write(flush, 0, len);
  117. }
  118. // 释放资源
  119. os.flush();
  120. os.close();
  121. sis.close();
  122. }
  123. }

4、添加测试代码测试:

  1. public static void main(String[] args) throws IOException {
  2. // SplitFile sf = new SplitFile("src/com/xzlf/io/CopyFile.java", "dest");
  3. SplitFile sf = new SplitFile("水电费.png", "dest");
  4. sf.split();
  5. // sf.merge("CopyFile.java");
  6. sf.merge("水电费-merge.png");
  7. }

Java IO 流 -- 随机读取和写入流 RandomAccessFile (文件分割和合并)的更多相关文章

  1. Java中的字符串流的读取和写入(创建文件并判断重复账户)

    各位我又来了!!哎!好心酸!我还没注册到三天!!没法登上博客的首页!!心累!! import java.io.BufferedOutputStream; import java.io.Buffered ...

  2. JAVA IO分析二:字节数组流、基本数据&对象类型的数据流、打印流

    上一节,我们分析了常见的节点流(FileInputStream/FileOutputStream  FileReader/FileWrite)和常见的处理流(BufferedInputStream/B ...

  3. Java IO(十二) 字符流 Writer 和 Reader

    Java IO(十二) 字符流 Reader和 Writer 一.介绍 涉及到文件(如果是纯文本文件形式)操作时,Java除了提供 FIle(文件和目录路径名的抽象表示形式) 和 FileDescri ...

  4. nodeks —— fs模块 —— 从流中 读取和写入数据

    Fs流读取和写入数据 使用文件流来读取大文件不会卡顿 1, 从流中读取数据 var fs = require("fs"); var data = ''; var count = 0 ...

  5. Java配置文件Properties的读取、写入与更新操作

    /** * 实现对Java配置文件Properties的读取.写入与更新操作 */ package test; import java.io.BufferedInputStream; import j ...

  6. 对Java配置文件Properties的读取、写入与更新操作

    http://breezylee.iteye.com/blog/1340868 对Java配置文件Properties的读取.写入与更新操作 博客分类: javase properties  对Jav ...

  7. 实现对Java配置文件Properties的读取、写入与更新操作

    /** * 实现对Java配置文件Properties的读取.写入与更新操作 */ package test; import java.io.BufferedInputStream; import j ...

  8. JAVA IO分析三:IO总结&文件分割与合并实例

    时间飞逝,马上就要到2018年了,今天我们将要学习的是IO流学习的最后一节,即总结回顾前面所学,并学习一个案例用于前面所学的实际操作,下面我们就开始本节的学习: 一.原理与概念 一.概念流:流动 .流 ...

  9. Java IO学习笔记三:MMAP与RandomAccessFile

    作者:Grey 原文地址:Java IO学习笔记三:MMAP与RandomAccessFile 关于RandomAccessFile 相较于前面提到的BufferedReader/Writer和Fil ...

随机推荐

  1. java NIO理解分析与基本使用

    我前段时间的一篇博客java网络编程--多线程数据收发并行总结了服务端与客户端之间的收发并行实践.原理很简单,就是针对单一客户端,服务端起两个线程分别负责read和write操作,然后线程保持阻塞等待 ...

  2. leetcode并发题解

    按序打印 解法一:使用volatile public class FooWithVolatile { private volatile int count; public FooWithVolatil ...

  3. Chart控件的使用

    1.开启滚动条(ScaleView.Size除以Interval ,大概是中间出现纵线的数量,一般动ScaleView.Size) chart1.ChartAreas[0].CursorX.AutoS ...

  4. 基于 HTML5 WebGL 的楼宇智能化集成系统(二)

    前言       一套完整的可视化操作交互上,必不可少 2D/3D 的融合,在上期我们介绍了有关 3D 场景的环视漫游.巡视漫游以及动画效果,还包括了冷站场景.热站场景以及智慧末端的实现原理,本期主要 ...

  5. Kubernetes Pod钩子

    目录 1.Pod容器钩子最终目的 2.何为Pod容器钩子 3.基于PostStart演示 4.基于PreStop演示 5.优雅停止Java应用 1.Pod容器钩子最终目的 之前在生产环境中使用dubb ...

  6. Java反射(六)纯面向接口编程的简单框架实践

    我们知道在使用MyBatis开发时,只需要添加DAO接口和对应的映射XML文件,不需要写DAO的实现类,其实底层是通过动态代理实现. 本文将使用前几篇文章的知识点实现一个纯面向接口编程的简单框架,与M ...

  7. Git常用命令(二)

    git clone + URL 获取该项目源代码 $ git log 回顾提交历史 $ git log -p -(数字) 用来显示每次提交的内容差异+(数字)表示看最近几条 $ git log --s ...

  8. C#多线程系列(1):Thread

    目录 1,获取当前线程信息 2,管理线程状态 2.1 启动与参数传递 2.1.1 ParameterizedThreadStart 2.1.2 使用静态变量或类成员变量 2.1.3 委托与Lambda ...

  9. 20 java 基础回顾--中阶引入

    一.数据类型 基本数据类型(共:四类八种) 整数 byte short int long 浮点 float double 字符 char 布尔 boolean 引用数据类型(new的数据) Stude ...

  10. CH5701 开车旅行(倍增dp+set)

    传送门 解题思路: 一道比较有趣的题,解题工作主要分为两块: ①找出k(k=0表示小A先走,k=1表示小B先走,下面同理)从点i出发下一个到达的点to[k][i]; 一开始偷懒用了vector(偷懒一 ...