1分成两部分  用randomaccessfile

package org.example;import java.io.RandomAccessFile;
import java.util.HashMap;
import java.util.Map;public class App {public static void main(String[] args) throws Exception {//读文件//一行一行分割字符串//再向1个hashMap存放对应的数据Map<String, Integer> mp = new HashMap<String, Integer>();RandomAccessFile raf = new RandomAccessFile("e:/word.txt", "rw");int len = (int) raf.length();byte[] bts = new byte[len];raf.read(bts);//文件获取一半posint halfLen = (int) raf.length() / 2;byte[] one = null;byte[] two = null;if (bts[halfLen] == '\n') {one = new byte[(len + 1) / 2];two = new byte[(len + 1) / 2];System.arraycopy(bts, 0, one, 0, len / 2);System.arraycopy(bts, len / 2, two, 0, len / 2);} else {int p = len / 2;for (; p < len; p++) {if (bts[p] == '\n') {break;}}//如果分割后面已经没有回车if (p == len) {one = bts;} else {one = new byte[p];two = new byte[len - p + 1];System.arraycopy(bts, 0, one, 0, p);System.arraycopy(bts, p, two, 0, len - p- 1);}}raf.close();String str = new String(one);System.out.println(str);System.out.println("==============");if (two != null) {String str1 = new String(two);System.out.println(str1);}System.out.println("world".hashCode() % 3);}
}

效果图

分割成两部分

2模仿hadoop filesplit任意切片

先写实体类

package org.example;/*** @Description:* @author:myh* @date: 2021/9/16  0:14*/
public class FileSplit {private int start;private String filePath;private int length;private String host;public FileSplit() {}public FileSplit(int start, String filePath, int length, String host) {this.start = start;this.filePath = filePath;this.length = length;this.host = host;}public int getStart() {return start;}public void setStart(int start) {this.start = start;}public String getFilePath() {return filePath;}public void setFilePath(String filePath) {this.filePath = filePath;}public int getLength() {return length;}public void setLength(int length) {this.length = length;}public String getHost() {return host;}public void setHost(String host) {this.host = host;}
}

psvm

package org.example;import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;/*** @Description:* @author:myh* @date: 2021/9/16  0:15*/
public class TextInputFormat {String filePath = "e:/word.txt";String host = "192.168.100.195";/*** 用户对文件的分割** @param numSplit 分割的块数* @return*/public List<FileSplit> getSplits(int numSplit) throws Exception {//文件总长度RandomAccessFile raf = new RandomAccessFile(filePath, "rw");int len = (int) raf.length();// 根据需要进行分割int splitSize = len / numSplit;// 判断字符是否合理 如果不合理就向前继续找文件的分割符号// 找到分割符号后记录这个文件分割符号的位置 FileSplit path  start len host(192.168.50.200:9000)// 找到文件很多的分割点 每个分割点都可以记录// 所有的FileSplit存放在1个List集合中List<FileSplit> fs = new ArrayList<FileSplit>();int location = 0;// 在用户使用时再用你的RandomAccessFile seek 进行文件读取byte bt = 0;try {do {if (location + splitSize < len) {raf.seek(location + splitSize);//跳到对应的文件位置if (raf.readByte() == 10) {FileSplit cut = new FileSplit(location, filePath, splitSize, host);fs.add(cut);location += splitSize = 1;//将location游标先前推进} else {//如果不是一个回车就必须向前读取 直到找到回车或文件末尾int blockSize = splitSize;//设置当前块默认大小byte cbt = raf.readByte();try {while (cbt != 10 && cbt != 0) {blockSize++;cbt = raf.readByte();}} catch (IOException e) {}FileSplit cut = new FileSplit(location, filePath, blockSize, host);fs.add(cut);location += blockSize;if (cbt == 0) {break;}}} else {//如果location+splitSize 超過文件總長度 就直接將最後一段存放在一個FileSplit中FileSplit sp = new FileSplit(location, filePath, len - location, host);fs.add(sp);break;}} while (true);} catch (Exception e) {}return fs;}public static void main(String[] args) throws Exception {System.out.println(new TextInputFormat().getSplits(5));}
}

效果图

文件分割方式 模仿hadoop手写一个工作原理 模仿hadoop filesplit任意切片相关推荐

  1. vue 使用fs_模仿vue-cli,手写一个脚手架

    vue-cli 在vue的开发的过程中,经常会使用到vue-cli脚手架工具去生成一个项目.在终端运行命令vue create hello-world后,就会有许多自动的脚本运行. 为什么会这样运行呢 ...

  2. [css] 让你手写一个reset的文件,你应该怎么写?要考虑哪些方面呢?

    [css] 让你手写一个reset的文件,你应该怎么写?要考虑哪些方面呢? 肯定首先考虑的是浏览器本身的样式,还有浏览器兼容.margin,padding ==>0ul,ol list styl ...

  3. 【干货】JDK动态代理的实现原理以及如何手写一个JDK动态代理

    动态代理 代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理模式从类型上来说,可以分为静态代理和动态代理两种类型. 在解 ...

  4. 未能加载文件或程序集或它的某一个依赖项_手写一个miniwebpack

    前言 之前好友希望能介绍一下 webapck 相关的内容,所以最近花费了两个多月的准备,终于完成了 webapck 系列,它包括一下几部分: webapck 系列一:手写一个 JavaScript 打 ...

  5. 第二季:5公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁【Java面试题】

    第二季:5值传递和引用传递[Java面试题] 前言 推荐 值传递 说明 题目 24 TransferValue醒脑小练习 第二季:5公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自 ...

  6. 手写一个基于NIO的迷你版Tomcat

    笔者也建立的自己的公众号啦,平时会分享一些编程知识,欢迎各位大佬支持~ 扫码或微信搜索北风IT之路关注 本文公众号地址:手写一个基于NIO的迷你版Tomcat 在很久之前看到了一篇文章写一个迷你版的T ...

  7. 用 Node.js 手写一个 DNS 服务器

    DNS 是实现域名到 IP 转换的网络协议,当访问网页的时候,浏览器首先会通过 DNS 协议把域名转换为 IP,然后再向这个 IP 发送 HTTP 请求. DNS 是我们整天在用的协议,不知道大家是否 ...

  8. 手写一个简单的IOC容器

    手写一个简单的IOC容器 原文 http://localhost:4000/2020/02/25/SSM/spring/%E6%89%8B%E5%86%99%E4%B8%80%E4%B8%AA%E5% ...

  9. 手写一个山寨版的springmvc框架

    文章目录 一,环境准备 二,项目结构搭建 三,简易版的前端控制器 DnDispatcherServlet 四,测试springmvc的性能 五,结束语 首先贴出来一张从网上copy下来的 spring ...

  10. 如何手写一个支持H.265的高清播放器

    概述 音视频编解码技术在当前的互联网行业中十分热门,特别是高清视频播放器的开发,其中包括4K.8K等超高清分辨率的播放器,具有极高的市场需求和广泛的应用场景.H265编码技术更是实现高清视频压缩的重要 ...

最新文章

  1. 用BFS(广度优先搜索queuelist)算法解决农夫过河问题
  2. python中options设置_如何使用ChromeOptions在Python selenium中禁用CSS
  3. nginx无法访问index.html,ThinkPHP5 + nginx配置(index.php无法访问404)
  4. SuperBenchmarker一个用.NET编写的压测工具
  5. STM32的AFIO时钟什么时候开启?
  6. 文件压缩——哈夫曼树编码2.0
  7. xshell5 Xshell6 商业版的破解版
  8. 论一只爬虫的自我修养11:Scrapy框架之初窥门径
  9. Word导出带目录的PDF
  10. MSCD software disk for win vista龙帝国vista 软件光盘合集
  11. Landlock:一种新型Linux安全模块
  12. 数据分析案例——销售利润不达标原因分析及应对策略
  13. Nutch 笔记(二):Craw more urls and Recrawl
  14. 容斥原理和概率与数学期望
  15. 微信视频号直播数据哪里可以看?
  16. MySQL通过sql语句获取当前日期|时间|时间戳
  17. 微软视频直播服务器,使用微软云媒体服务快速搭建视频直播
  18. 《ELK Stack权威指南 》第1章 入门示例
  19. 1999-2018年全国地级市面板数据
  20. 高频电路设计布线技巧十项规则

热门文章

  1. 一位H3CIE攻坚之旅
  2. c语言scanf用法例子,scanf(scanf用法举例)
  3. Quartz表达式介绍及简单使用
  4. 51开发板的功能及简单使用
  5. Android基础教程之Button事件发送消息到通知栏Notification
  6. 激光雷达SLAM三维建图、点云算法 点云处理 自己写的算法 没用任何现成的库文件
  7. 软件质量属性:可用性
  8. C#条形码图像生成库
  9. 网线制作实验相关内容
  10. Arduino开发板使用TFT LCD液晶显示屏的终极新手入门指南