将文件拆分为流

上周,我讨论了类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

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

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

相关文章

数据模型

数据模型 现实世界中的事物及其联系,经过两级抽象和转换后形成了计算机世界中的数据及其联系,而数据模型就是用来描述数据及其联系的。 数据库中存放数据的结构是由数据模型决定的,数据模型是数据库的框架&#xff0c;是数据库系统的核心和基础。 数据模型是描述数据、数据联系…

activemq优先级_ActiveMQ消息优先级:工作原理

activemq优先级在邮件列表中 &#xff0c;通常会围绕ActiveMQ的消息优先级支持不断提出一些问题&#xff0c;以及有关观察到的行为和“真正支持什么”的好问题&#xff1f; 我希望可以帮助您了解幕后情况以及可以支持的优先级。 详细信息可能会有些麻烦。 如果您对这些细节不感…

移动通信

通信: 信源和信宿间信息的传输和交换构成了通信。 2)分类通信&#xff1a;固定通信&#xff0c;移动通信移动通信通信双方至少有-方在移动中(或者临时停留在某一非预定的位置 上)进行信息传输和交换。 这包括移动体(车辆、船舶、飞机和行人)和移动体之间的通信&#xff0c;移动…

移动通信(2)

二 移动通信系统工作方式 1)通信系统传输方式: 传输方式&#xff1a;单向&#xff0c;双向&#xff08;单工&#xff0c;半双工&#xff0c;双工&#xff09; 注意移动通信系统中所定义的工作方式与通信原理中并不一致。 2)工作方式类别 (1)单工通信:通信双方电台仅能交替地进行…

Java 9概览

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

数据库(3)——关系

关系的形式化定义和概念 &#xff08;1&#xff09;关系上域的定义Domain1)域是一组具有相同数据类型的值的集合,又称为值域。(用D表示)2)域中所包含的值的个数称为域的基数(用m表示)。 在关系中用域表示属性的取值范围。 D1{李力,王平&#xff0c;刘伟} , m3 ; &#xff08;2&…

数据库(4)——候选码和主键

候选码或候选键&#xff08;Candidate Key&#xff09; 如果在一个关系中&#xff0c;存在一个或一组属性的值能唯一地标识该关系的一个元组&#xff0c;则这个属性或属性组称为该关系的候选码或候选键&#xff0c;一个关系可能存在多个候选码。 候选码性质&#xff1a;唯一性&…

adf开发_了解ADF Faces clientComponent属性

adf开发我相信大多数ADF开发人员都知道ADF Faces属性clientComponent 。 在本文中&#xff0c;我将展示该属性实际上如何影响组件渲染以及它如何改变其行为。 让我们开始考虑一个非常简单的示例&#xff1a; <af:inputText label"Label 1" id"it1" /&g…

通信原理

绪论 1&#xff09;信息&#xff0c;消息&#xff0c;信号通信&#xff1a;利用电&#xff08;或者光&#xff09;信号传输消息中所包含的信息。信息&#xff1a;消息的内涵。 消息&#xff1a;信息的物理表现形式。&#xff08;可分为两类连续消息语音&#xff0c;音乐&#x…

Picocli 2.0:事半功倍

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

通信原理—通信系统组成

通信系统的组成 1一般模型信源——>发送设备——>信道&#xff08;噪声源&#xff09;——>接收设备——>信宿 通信系统是指传递信息所需的一切设备和信道的总体。 信源 &#xff1a;把消息变化原始电信号&#xff08;基带信号&#xff09;&#xff0c;非电量转化为…

无线通信(补充)

长波通信 长波通信是波长为1 000&#xff5e;10 000m&#xff08;频率为30&#xff5e;300kHz&#xff09;的无线电通信。 主要用于军事上&#xff0c;如潜艇通信、地下通信及导航等。 在一定范围内&#xff0c;长波通信以地波传播为主&#xff0c;当通信距离大于地波的最大传播…

Java 20年

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

数据库设计()

数据库设计1 数据库设计的任务数据库设计是指根据用户需求研制数据库结构和行为的过程。对于一个给定的应用环境&#xff0c;构造最优的数据库模式&#xff0c;建立数据库及其应用系统;有效地存储数据&#xff0c;满足用户的信息要求和处理要求。 2数据库设计的特点 结构源于行…

移动通信—无线波传播

无线波传播 发射天线或自然辐射源所辐射的无线电波,通过自然条件下的媒质到达接受天线的过程称为无线电波传播。无线电波与可见光、X射线与γ射线-.样同属于电磁波,它们都是以电场和磁场为其特征的- -种电场震动。电磁波的频谱范围很宽,从几赫到3X 1023Hz(波长从几十兆米到10-9…

使用Dropwizard度量标准监视和测量无功应用

在上一篇文章中&#xff0c;我们创建了一个简单的索引代码&#xff0c;该代码可以对ElasticSearch进行数千个并发请求。 监视系统性能的唯一方法是老式的日志记录语句&#xff1a; .window(Duration.ofSeconds(1)) .flatMap(Flux::count) .subscribe(winSize -> log.debug(…

移动通信-多径效应,多普勒效应,菲涅尔区,阴影效应,快衰落,慢衰落

多径效应 信号从发射端到接收端常有许多时延不同、损耗各异的传输路径&#xff0c;可以是直射、反射或是绕射。无线电波的多径效应是指不同路径的相同信号在按收端叠加会增大或减小接收信号能量的现象。 时间色散 在无线通信中&#xff0c;无线电波从发射端到接收端会经过直射、…

拆分为流

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

四旋翼

更新2018/11 1系统设计 硬件总体框架&#xff08;认识四旋翼的基本组成&#xff09; 机架主要的两种&#xff08;x型控制更难&#xff0c;动作灵活&#xff09; 十字型,X字型 桨 7040,8045&#xff08;常用&#xff09;&#xff0c;前四位直径&#xff0c;后四位角度 正反螺旋…

hotspot线程模型_Linux上的HotSpot GC线程CPU占用空间

hotspot线程模型以下问题将测试您对Linux操作系统上运行的Java应用程序的垃圾收集和高CPU故障排除的知识。 当调查过多的GC和/或CPU利用率时&#xff0c;此故障排除技术尤其重要。 它将假定您无权使用高级监控工具&#xff0c;例如Compuware dynaTrace甚至JVisualVM。 将来将介…