我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java中怎样使用Files.readLines()处理文本中行数据方式

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java中怎样使用Files.readLines()处理文本中行数据方式

java中怎样使用Files.readLines()处理文本中行数据方式,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

使用Files.readLines()处理文本中行数据

开发中遇到对数据库导出到文件里的数据进行处理,然后对处理后的数据再重新写回文件中,在这个过程中使用到了Files.readLines()方法

public void lineProcess(File file) throws IOException {    Files.readLines(file, Charset.defaultCharset(), new LineProcessor() {        File outFile = new File("outfile");//处理后的数据输出文件        List<String> lines = new ArrayList<String>();        @Override        public boolean processLine(String line) throws IOException {            String newLine = "";            //file中的 line数据格式:name,age,address -> NAME,AGE,ADDRESS,            String[] contents = line.split(",");            for (int i=0;i<contents.length;i++){                newLine.concat(contents[i].toLowerCase());            }            lines.add(newLine);            //将处理后的数写入新的文件 outFile            FileUtils.writeLines(outFile,lines,true);            lines.clear();            return true;        }        @Override        public Object getResult() {            try{                FileUtils.writeLines(outFile,lines,true);            }catch (Exception e){                e.getCause();            }            lines.clear();            return null;        }    });}

方法中的LineProcessor()实现对每一行数据处理逻辑。

依赖guava

<dependency>    <groupId>com.google.guava</groupId>    <artifactId>guava</artifactId>    <version>19.0</version></dependency>

被readLine()折腾了一把

虽然写IO方面的程序不多,但BufferedReader/BufferedInputStream倒是用过好几次的,原因是:

它有一个很特别的方法:readLine(),使用起来特别方便,每次读回来的都是一行,省了很多手动拼接buffer的琐碎;

它比较高效,相对于一个字符/字节地读取、转换、返回来说,它有一个缓冲区,读满缓冲区才返回;一般情况下,都建议使用它们把其它Reader/InputStream包起来,使得读取数据更高效。

对于文件来说,经常遇到一行一行的,特别相符情景。

这次是在蓝牙开发时,使用两个蓝牙互相传数据(即一个发一个收),bluecove这个开源组件已经把数据读取都封装成InputStream了,也就相当于平时的IO读取了,很自然就使用起readLine()来了。

发数据

BufferedWriter output = new BufferedWriter(new OutputStreamWriter(conn.openOutputStream())); int i = 1;String message = "message " + i;while(isRunning) {    output.write(message+"/n");     i++;}

读数据

BufferedReader input = new BufferedReader(new  InputStreamReader(m_conn.openInputStream()));String message = "";String line = null;while((line = m_input.readLine()) != null) {    message += line;}System.out.println(message);

上面是代码的节选,使用这段代码会发现写数据时每次都成功,而读数据侧却一直没有数据输出(除非把流关掉)。经过折腾,原来这里面有几个大问题需要理解:

误以为readLine()是读取到没有数据时就返回null(因为其它read方法当读到没有数据时返回-1),而实际上readLine()是一个阻塞函数,当没有数据读取时,就一直会阻塞在那,而不是返回null;因为readLine()阻塞后,System.out.println(message)这句根本就不会执行到,所以在接收端就不会有东西输出。要想执行到System.out.println(message),一个办法是发送完数据后就关掉流,这样readLine()结束阻塞状态,而能够得到正确的结果,但显然不能传一行就关一次数据流;另外一个办法是把System.out.println(message)放到while循环体内就可以。

readLine()只有在数据流发生异常或者另一端被close()掉时,才会返回null值。

如果不指定buffer大小,则readLine()使用的buffer有8192个字符。在达到buffer大小之前,只有遇到"/r"、"/n"、"/r/n"才会返回。

readLine()的实质(下面是从JDK源码摘出来的)

String readLine(boolean ignoreLF) throws IOException { StringBuffer s = null; int startChar;        synchronized (lock) {            ensureOpen();     boolean omitLF = ignoreLF || skipLF;     bufferLoop:     for (;;) {  if (nextChar >= nChars)      fill(); //在此读数据  if (nextChar >= nChars) {       if (s != null && s.length() > 0)   return s.toString();      else   return null;  }      ......//其它}private void fill() throws IOException { ..../其它 int n; do {     n = in.read(cb, dst, cb.length - dst); //实质 } while (n == 0); if (n > 0) {     nChars = dst + n;     nextChar = dst; }    }

从上面看出,readLine()是调用了read(char[] cbuf, int off, int len) 来读取数据,后面再根据"/r"或"/n"来进行数据处理。

在Java I/O书上也说了:

public String readLine() throws IOException
This method returns a string that contains a line of text from a text file. /r, /n, and /r/n are assumed to be line breaks and are not included in the returned string. This method is often used when reading user input from System.in, since most platforms only send the user's input to the running program after the user has typed a full line (that is, hit the Return key).
readLine() has the same problem with line ends that DataInputStream's readLine() method has; that is, the potential to hang on a lone carriage return that ends the stream . This problem is especially acute on networked connections, where readLine() should never be used.

小结,使用readLine()一定要注意

读入的数据要注意有/r或/n或/r/n

没有数据时会阻塞,在数据流异常或断开时才会返回null

使用socket之类的数据流时,要避免使用readLine(),以免为了等待一个换行/回车符而一直阻塞

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java中怎样使用Files.readLines()处理文本中行数据方式

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java中怎样使用Files.readLines()处理文本中行数据方式

java中怎样使用Files.readLines()处理文本中行数据方式,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。使用Files.readLines()处理
2023-06-22

Python中使用NumPy进行数据处理方式

NumPy是Python中用于数据处理的强大库。它提供高效的多维数组处理,并拥有丰富的数学、统计和布尔运算功能。NumPy还支持广播,允许在不同形状的数组上执行运算。它在数据科学中广泛应用,包括数据清理、分析、机器学习和图像处理。尽管NumPy具有高效性和功能强大等优势,但它也存在处理稀疏数据和内存消耗问题,并且可能需要一定的学习曲线。
Python中使用NumPy进行数据处理方式
2024-04-02

如何使用Java进行大数据处理?(Java在大数据处理中有哪些应用方法和工具?)

Java在大数据处理中发挥着重要作用,提供广泛的工具和框架。ApacheSpark、Hadoop、Hive和Pig支持快速数据处理、分布式存储和交互式查询。Oozie和Azkaban帮助调度数据处理作业。Lucene和Elasticsearch提供文本数据搜索。Kafka和Storm用于实时数据流处理。Mahout、SparkMLlib和Weka等其他库提供机器学习功能。利用这些工具,Java开发人员可以高效处理大数据。
如何使用Java进行大数据处理?(Java在大数据处理中有哪些应用方法和工具?)
2024-04-02

LangChain 使用文本描述的方式操作MySQL中的数据

一、LangChain 使用文本描述的方式操作MySQL中的数据 在 LangChain 中提供了 SQLDatabaseChain ,可以通过语义文本去操作 MySQL中的数据,例如在 MySQL 中有如下表数据: 用户表 CREATE
2023-08-16

使用Java如何将SQL脚本文件执行到数据库中

使用Java如何将SQL脚本文件执行到数据库中?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。方式一:直接读取SQL脚本文件的内容,然后传递到SQL中。代码:RunSqlSe
2023-05-31

如何使用PHP进行JSON数据的处理?(PHP中如何处理JSON格式的数据?)

PHPJSON处理指南使用PHP处理JSON数据,实现轻松高效的数据交换。解码JSON:使用json_decode()将字符串转换为PHP变量。编码JSON:使用json_encode()将PHP变量转换为字符串。自定义选项:JSON_UNESCAPED_UNICODE:不转义Unicode字符。JSON_NUMERIC_CHECK:将数字字符串转换为数字。错误处理:json_last_error():获取错误代码。json_last_error_msg():获取错误消息。安全注意事项:验证JSON数据以
如何使用PHP进行JSON数据的处理?(PHP中如何处理JSON格式的数据?)
2024-04-02

C++技术中的大数据处理:如何使用MapReduce框架进行分布式大数据处理?

通过使用 c++++ 中的 hadoop mapreduce 框架,可以实现以下大数据处理步骤:1. 将数据映射到键值对;2. 汇总或处理具有相同键的值。该框架包括 mapper 和 reducer 类,用于分别执行映射和汇总阶段。C++
C++技术中的大数据处理:如何使用MapReduce框架进行分布式大数据处理?
2024-05-12

怎么在R语言中使用dplyr包对数据进行处理

这期内容当中小编将会给大家带来有关怎么在R语言中使用dplyr包对数据进行处理,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、数据筛选函数:#可使用filter()函数筛选/查找特定条件的行或者样本#f
2023-06-08

如何使用Python中的字符串操作函数处理大规模文本数据

如何使用Python中的字符串操作函数处理大规模文本数据,需要具体代码示例随着互联网的快速发展和数据的不断增加,大规模文本数据处理成了现代科技中的一个重要课题。Python作为一门简单易学且功能强大的编程语言,提供了丰富的字符串操作函数,能
2023-10-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录