大文件拆分小文件求top_将文件拆分为流

大文件拆分小文件求top

上周,我讨论了类Pattern新的(@since 1.8)方法splitAsStream只能根据流的需要从字符序列中读取字符序列,并且不能继续进行模式匹配以创建所有可能的元素并返回它作为流。 这种行为是流的本质,它是支持高性能应用程序的必经之路。

正如我在上周承诺的那样,在本文中,我将展示splitAsStream的实际应用,在该应用中,处理流而不是将整个字符串拆分成数组并对其进行处理确实有意义。

正如您可能从文章标题中猜到的那样,该应用程序正在将文件与一些标记分开。 只要文件的长度不超过2GB,就可以将其表示为CharSequence 。 限制来自以下事实: CharSequence的长度是int值,在Java中为32位。 文件长度为long ,为64位。 由于从文件读取比从已在内存中的字符串读取要慢得多,因此使用流处理的惰性是有意义的。 我们需要的是一个由文件备份的字符序列实现。 如果可以的话,我们可以编写如下程序:

public static void main(String[] args) throws FileNotFoundException {Pattern p = Pattern.compile("[,\\.\\-;]");final CharSequence splitIt = new FileAsCharSequence(new File("path_to_source\\SplitFileAsStream.java"));p.splitAsStream(splitIt).forEach(System.out::println);}

该代码不读取文件的任何部分,但不需要,假定实现FileAsCharSequence不会读取文件贪婪的内容。 FileAsCharSequence类的实现可以是:

package com.epam.training.regex;import java.io.*;public class FileAsCharSequence implements CharSequence {private final int length;private final StringBuilder buffer = new StringBuilder();private final InputStream input;public FileAsCharSequence(File file) throws FileNotFoundException {if (file.length() > (long) Integer.MAX_VALUE) {throw new IllegalArgumentException("File is too long to handle as character sequence");}this.length = (int) file.length();this.input = new FileInputStream(file);}@Overridepublic int length() {return length;}@Overridepublic char charAt(int index) {ensureFilled(index + 1);return buffer.charAt(index);}@Overridepublic CharSequence subSequence(int start, int end) {ensureFilled(end + 1);return buffer.subSequence(start, end);}private void ensureFilled(int index) {if (buffer.length() < index) {buffer.ensureCapacity(index);final byte[] bytes = new byte[index - buffer.length()];try {int length = input.read(bytes);if (length < bytes.length) {throw new IllegalArgumentException("File ended unexpected");}} catch (IOException e) {throw new RuntimeException(e);}try {buffer.append(new String(bytes, "utf-8"));} catch (UnsupportedEncodingException ignored) {}}}
}

该实现只从文件读取那么多字节,这是对charAtsubSequence的最后一个实际方法调用所需要的。

如果您有兴趣,可以改进此代码,以仅将真正需要的字节保留在内存中,并删除已经返回到流中的字节。 要知道不需要什么字节,上一篇文章提供了一个很好的提示,那就是splitAsStream永远不会接触索引比最后一次调用subSequence的第一个( start )参数小的subSequence 。 但是,如果您以一种丢弃字符的方式实现代码,并且如果有人要访问已经抛出的字符而失败,那么它将无法真正实现CharSequence接口,尽管只要使用splitAsStream ,它仍然可以很好地工作。长期以来实现不会改变,并且开始需要一些已经传递的字符。 (嗯,我不确定,但是如果我们使用一些复杂的正则表达式作为拆分模式,也可能会发生这种情况。)

编码愉快!

翻译自: https://www.javacodegeeks.com/2017/11/split-file-stream.html

大文件拆分小文件求top

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334158.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何取消ie.html,IE浏览器安全警告怎么关闭

部分用户在使用IE浏览器打开某些页面的时候&#xff0c;可能会出现一个“安全警告”的对话框&#xff0c;虽然影响不大&#xff0c;但是每次出现都让人很烦闷&#xff0c;这个时候你就可以根据下面的操作去关闭这个功能。自从百度近日开启了HTTPS安全网页功能之后&#xff0c;每…

sql 计算两个小数乘积_数学篇|学会这些数学计算技巧,想不满分都难!

计算是小学数学的基础&#xff0c;四则运算和混合运算是计算要考察的重点。在这里我们总结了小学用到的所有计算定律和简便方法&#xff0c;包括运算定律、运算法则、运算顺序和速算技巧四大部分&#xff0c;帮助小学生牢固掌握数学知识点。先赞后看&#xff0c;收获满满&#…

Linux 如何关闭防火墙

一、使用 System V init 作为初始化系统的 Linux&#xff08;例如&#xff1a;CentOS 6.x&#xff09; 关闭防火墙的命令&#xff1a; chkconfig iptables off或 service iptables stop二、使用 systemd 作为初始化系统的 Linux&#xff08;例如&#xff1a;CentOS 7.x&#…

java学习2018年_Java 20年

java学习2018年二十年前&#xff0c;在苏黎世的一间公寓里发生了两件事。 我的女儿迈出了第一步&#xff0c;一位年轻的博士后研究员&#xff08;她的父亲&#xff09;迈出了使用Java的第一步。 很难完全了解当时的Java。 在这些时代&#xff0c;TCL盛行&#xff0c;Java时代与…

html 不透明阴影,CSS_css box-shadow阴影不透明的解决办法,如下面示例: 复制代码代码如 - phpStudy...

如下面示例&#xff1a;复制代码代码如下:phpStudy.shadow{width:120px;height:120px;border:1px solid #ccc;background:#fff;font-size:12px;padding:10px;-moz-box-shadow:0 4px 4px #999;-webkit-box-shadow:0 4px 4px #999;box-shadow:0 4px 4px #999;*filter: progid:DXI…

shell 脚本和 bash 脚本的关系

Shell 分类 常见的 Shell 有 sh、bash、csh、tcsh、ash 等。其中 bash shell 是 Linux 的默认 shell。即 bash 是 shell 的一种。 bash 脚本和 shell 脚本 bash 脚本仅是 shell 脚本的一种&#xff0c;csh 脚本也是 shell 脚本的一种。bash 脚本也可以称为 shell 脚本

mysql两个字段相减_MySQL 中NULL和空值的区别?

作为后台开发&#xff0c;在日常工作中如果要接触Mysql数据库&#xff0c;那么不可避免会遇到Mysql中的NULL和空值。那你知道它们有什么区别吗&#xff1f;学不动了&#xff0c;也不想知道它们有什么区别。大兄弟&#xff0c;不行啊&#xff0c;要面试&#xff01;前些天我的好…

做好计划事半功倍论文_Picocli 2.0:事半功倍

做好计划事半功倍论文介绍 Picocli是一个单文件命令行解析框架&#xff0c;它使您几乎不需要任何代码即可创建命令行应用程序。 使用Option或Parameters注释应用程序中的字段&#xff0c;picocli将分别使用命令行选项和位置参数填充这些字段。 例如&#xff1a; Command(name …

halcon python缺陷检测_Halcon学习笔记之缺陷检测(一)

*surface_scratch.hdev:extraction of surface scratches via local thresholding and morphological post-processing*dev_close_window()dev_update_window(‘off’)******step: acquire image //获取图片*****read_image(Image,’surface_scratch’) //读入图片名为’surfac…

Linux 脚本文件中开头的#!/bin/bash和#!/bin/sh是什么意思

解释 #!/bin/sh&#xff1a;表示此脚本使用 /bin/sh 来解释执行&#xff0c;#! 是特殊的表示符&#xff0c;其后面跟的是解释此脚本的 shell 的路径。 我们知道 shell 有很多种&#xff0c;例如&#xff0c;bash、csh、sh等&#xff0c;sh 是其中的一种&#xff0c;命令文件所…

srp unity_SRP是骗局

srp unity根据罗伯特马丁 &#xff08; Robert Martin&#xff09;的 《 清洁法 》&#xff08; Clean Code&#xff09; &#xff0c;“ 单一责任原则 ”意味着“一个阶级应该只有一个改变的理由”。 让我们尝试解密这个模糊的语句&#xff0c;看看它如何帮助我们设计更好的面…

html5app大赛,Anyoffice -HTML5大赛 悦心(基于H5开发安卓音乐app)-项目总结

悦心,一款音乐播放器应用。由“女立方”团队开发。眼下。较为流行的音乐播放器有QQ音乐、网易云音乐、多米音乐等。“悦心”音乐播放器的主要功能&#xff0c;提供音乐数据库&#xff0c;点击列表播放音乐&#xff0c;还可对歌曲进行收藏。加入专属音乐心情功能。1.歌曲播放过程…

如何执行shell脚本文件

文章目录 一、使用 shell 命令解释器执行脚本二、使用命令 source 执行脚本文件三、使用路径方式执行脚本文件为什么不能在当前目录直接执行当前目录下的脚本文件呢?四、使用命令 exec 执行脚本文件五、它们有什么区别六、验证是否开启子进程(一)通过父 shell 中的变量是否正…

python 40位的数减个位数_Python——进制表示与转换

在前面两篇文章中介绍了基本的数据类型(Python——记录3——数据类型1&#xff0c;Python——记录4——数据类型2)&#xff0c;其中讲到浮点数的计算是通过转换成二进制进行的&#xff0c;那么到底什么是二进制&#xff0c;以及计算机到底包含了哪些进制呢&#xff1f;其实0和1…

javaee概览_Java 9概览

javaee概览对于许多Java 9来说&#xff0c;似乎是一个维护版本&#xff0c;它推动了不能在Java 8中实现的项目Jigsaw。但是&#xff0c;随着JDK中的新模块系统以及与之相关的许多内部更改&#xff0c;Java 9也带来了开发人员工具箱中一些很棒的新内容。 以下是重点内容&#xf…

Linux 命令之 source -- 在当前Shell环境中从指定文件读取和执行命令

文章目录一、命令介绍二、命令格式三、命令示例一、命令介绍 source 命令会在当前 Shell 环境中从指定文件读取和执行命令。source 命令通常用于重新执行刚修改的初始化文件&#xff0c;使之立即生效&#xff0c;而不必注销并重新登录。 source 命令&#xff08;从 C Shell 而…

opc调试软件_组态王和三菱OPC软件完美演绎天塔之光

许多朋友因为在学习组态王的过程中因为没有实物PLC而发愁&#xff0c;这里我通过天塔之光实例分享一个三菱OPC软件模拟实物PLC与组态王通信的方法。一、需要软件组态王软件三菱PLC编程软件GX Works2三菱OPC软件MX OPC Configurator二、控制要求主画面如上图所示的天塔灯光&…

jar混淆,防止反编译,Allatori工具混淆jar包

文章目录 Allatori工具简介下载解压配置config.xml注意事项 Allatori工具简介 官网地址&#xff1a;https://allatori.com/ Allatori不仅混淆了代码&#xff0c;还最大限度地减小了应用程序的大小&#xff0c;提高了速度&#xff0c;同时除了你和你的团队之外&#xff0c;任何人…

计算机基础知识学前自测,2011计算机二级C语言学前自测题:DOS的基本操作

DOS的基本操作1.DOS系统启动后&#xff0c;下列文件中常驻内存的是( )。A)DOS.COM B)COMMAND.COMC)DISKCOPY.COM D)SYS.COM2.若当前盘为C盘&#xff0c;在A盘目录\data中只有文本文件test.DAT&#xff0c;A 盘当前目录为根目录&#xff0c;则查看该文件的内容可使用的命令是( )…

string拆分为int_拆分为流

string拆分为int我正在为我工​​作的公司准备正则表达式教程更新。 原始教程创建于2012年&#xff0c;从那时起Java发生了一点变化。 有新的Java语言版本&#xff0c;尽管Java中的正则表达式处理仍不完善&#xff08;nb。它仍使用非确定性FSA&#xff09;&#xff0c;但仍有一…