返回顶部
首页 > 资讯 > 后端开发 > Python >java中使用Files.readLines()处理文本中行数据方式
  • 880
分享到

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

2024-04-02 19:04:59 880人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录使用Files.readLines()处理文本中行数据被readLine()折腾了一把发数据读数据readLine()的实质(下面是从jdk源码摘出来的)小结,使用readLin

使用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(),以免为了等待一个换行/回车符而一直阻塞

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: java中使用Files.readLines()处理文本中行数据方式

本文链接: https://lsjlt.com/news/159500.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java中使用Files.readLines()处理文本中行数据方式
    目录使用Files.readLines()处理文本中行数据被readLine()折腾了一把发数据读数据readLine()的实质(下面是从JDK源码摘出来的)小结,使用readLin...
    99+
    2024-04-02
  • java中怎样使用Files.readLines()处理文本中行数据方式
    java中怎样使用Files.readLines()处理文本中行数据方式,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。使用Files.readLines()处理...
    99+
    2023-06-22
  • SQL中怎么处理文本数据
    SQL中怎么处理文本数据,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。导入数据  为了简单,我们用一个只有三行(三个文档)的文本文件(a....
    99+
    2024-04-02
  • Caffe中怎么处理文本数据
    在Caffe中处理文本数据通常需要进行以下步骤: 数据预处理:将文本数据转换成适合Caffe处理的格式,一般是将文本数据转换成图...
    99+
    2024-03-07
    Caffe
  • Torch中如何处理文本数据
    在Torch中处理文本数据通常需要进行以下步骤: Tokenization:将文本数据分割成单词或者子词。可以使用现成的toke...
    99+
    2024-04-02
  • Java使用Collections.sort对中文进行排序方式
    目录使用Collections.sort对中文进行排序Collections.sort 排序 注解使用Collections.sort对中文进行排序 使用collections.so...
    99+
    2024-04-02
  • 如何在CentOS中使用awk命令处理文本数据
    在CentOS中使用awk命令处理文本数据可以通过以下步骤: 打开终端,使用以下命令输入awk命令: awk '{ p...
    99+
    2024-04-02
  • 怎么使用Python处理文本数据
    本篇内容介绍了“怎么使用Python处理文本数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!用python处理文本数据实验目的熟悉pyth...
    99+
    2023-07-02
  • 使用Go语言处理中文文本
    编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天编程网就整理分享《使用Go语言处理中文文本》,文章...
    99+
    2024-04-04
  • 使用Java如何将SQL脚本文件执行到数据库中
    使用Java如何将SQL脚本文件执行到数据库中?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。方式一:直接读取SQL脚本文件的内容,然后传递到SQL中。代码:RunSqlSe...
    99+
    2023-05-31
    java sql 数据库
  • LangChain 使用文本描述的方式操作MySQL中的数据
    一、LangChain 使用文本描述的方式操作MySQL中的数据 在 LangChain 中提供了 SQLDatabaseChain ,可以通过语义文本去操作 MySQL中的数据,例如在 MySQL 中有如下表数据: 用户表 CREATE ...
    99+
    2023-08-16
    langchain mysql
  • PHP 中如何使用数组进行数据处理?
    PHP是一种广泛应用于Web开发的脚本语言。在PHP中,数组是一种非常重要的数据结构,用于存储和处理大量数据。数组提供了一种方便的方式来组织和访问数据,使得数据处理变得更加容易和高效。在本文中,我们将介绍PHP中如何使用数组进行数据处理,希...
    99+
    2023-10-24
    数组 unix numpy
  • 如何使用Java中的自然语言处理API进行文本打包?
    自然语言处理(NLP)是一种人工智能领域的分支,它涉及到计算机如何处理和分析人类语言。在Java中,有许多NLP库和API可以帮助开发人员处理文本。在本文中,我们将介绍如何使用Java中的自然语言处理API进行文本打包。 安装和配置Ja...
    99+
    2023-07-09
    自然语言处理 api 打包
  • Java中如何使用函数处理大数据并进行重定向?
    在Java编程中,我们经常需要处理大量的数据,这些数据可能来自于文件、网络或数据库等数据源。对于这些数据,我们通常需要进行一系列的操作,比如过滤、排序、统计等。如果我们直接使用循环来处理这些数据,效率会非常低下。因此,在Java中,我们通...
    99+
    2023-08-23
    函数 大数据 重定向
  • Java中怎么处理大文本文件
    今天就跟大家聊聊有关Java中怎么处理大文本文件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。集算器与Java应用程序的集成结构如下:下面举例说明集算器协助JAVA查询大文本的基本过...
    99+
    2023-06-17
  • Java如何使用Collections.sort对中文进行排序方式
    本篇文章为大家展示了Java如何使用Collections.sort对中文进行排序方式,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。使用Collections.sort对中文进行排序使用collec...
    99+
    2023-06-25
  • 如何在Linux中使用Java进行大数据存储和处理?
    在当今互联网时代,数据的存储和处理已经成为了很多企业和组织的重要任务。而随着大数据技术的发展,许多企业和组织开始使用Java语言进行大数据存储和处理。本文将介绍如何在Linux中使用Java进行大数据存储和处理。 一、环境搭建 在Linux...
    99+
    2023-07-26
    linux 大数据 存储
  • C++技术中的大数据处理:如何使用MapReduce框架进行分布式大数据处理?
    通过使用 c++++ 中的 hadoop mapreduce 框架,可以实现以下大数据处理步骤:1. 将数据映射到键值对;2. 汇总或处理具有相同键的值。该框架包括 mapper 和 r...
    99+
    2024-05-12
    大数据处理 c++ 键值对
  • Java中Scanner使用方式:单行/多行输入
    目录问题最好解决的情况单行输入多个参数多行输入多个参数,每行参数个数不定问题 解决这种情况下的Scanner输入:单行,多行,数值,字符串 平时写程序一般不用Scanner,线上笔试...
    99+
    2024-04-02
  • 使用Shell脚本怎么逐行处理文本文件
    使用Shell脚本怎么逐行处理文本文件?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。通过read命令完成.read 命令从标准输入中读取一行,并把输入行的每个字...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作