关于文件操作工具类及readLine()方法

news/2024/5/20 20:31:55

这里写自定义目录标题

  • 一:文件流通用操作工具类
    • 二、工具类讲解
    • 三、拓展报错解决

一:文件流通用操作工具类

package com.zkyq.file.common.utils;import com.zkyq.common.utils.DateUtils;
import com.zkyq.file.common.service.EleRealDataService;
import com.zkyq.file.common.service.impl.EleRealDataServiceImpl;
import com.zkyq.file.common.template.FileTemplate;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.*;
import java.nio.charset.StandardCharsets;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;/*** @创建人 KT* @创建时间 2023/6/12* @描述 文件的操作工具类*/
public class FileUtils {private static Logger logger = LoggerFactory.getLogger(JavaBeanUtils.class);/** 读取文件,并按照文件写入时间进行排序 */public static List<FileTemplate> readFileInfo(String rootDir) {List<FileTemplate> voList = new ArrayList<>();BufferedReader br = null;try {File[] files = new File(rootDir).listFiles((dir, fileName) -> fileName.endsWith(".txt"));if (files == null || files.length == 0) { return voList;}for (File file : files) {br = new BufferedReader(new InputStreamReader(new FileInputStream(file),StandardCharsets.UTF_8));String contentLine;while ((contentLine = br.readLine()) != null) {voList.add(new FileTemplate(file, file.lastModified(), contentLine));}br.close();}return voList;} catch (UnsupportedEncodingException e) {logger.error("获取文件流转码异常", e);} catch (FileNotFoundException e) {logger.error("获取文件流异常", e);} catch (IOException e) {logger.error("读取文件异常", e);}finally {try {if (br != null){br.close();}} catch (IOException e) {logger.error("关闭流异常", e);}}return voList;}/** 转移文件 */public static void backupsFile(String backupPath, FileTemplate fileVo){String day = DateUtils.getDay(0);File file = new File(backupPath + "\\" + day);if (!file.exists()){ file.mkdirs(); }File oldFile = fileVo.getFile();String name = oldFile.getName();File newFile = new File(backupPath + "\\" + day + "\\" + name);oldFile.renameTo(newFile);}/** 批量转移文件 */public static void backupsFiles(String backupPath, List<FileTemplate> fileVos){String day = DateUtils.getDay(0);String path = backupPath + "/" + day;File file = new File(path);if (!file.exists()){ file.mkdirs();}for (FileTemplate fileVo : fileVos) {if (fileVo.getFile().exists()){File oldFile = fileVo.getFile();String name = oldFile.getName();String newPath = path + "/" + name;File newFile = new File(newPath);oldFile.renameTo(newFile);}}}/** 删除文件夹及其下面所有的文件 */public static void deleteFile(String backupPath, Integer daysBefore){Integer day = Integer.valueOf(DateUtils.getDay(daysBefore));File file = new File(backupPath);if (file.isDirectory()){File[] files = file.listFiles();if (files != null && files.length != 0){for (File menuFile : files) {if (menuFile.isDirectory() && Integer.valueOf(menuFile.getName()) < day){ for (File document : menuFile.listFiles()) { document.delete(); } }menuFile.delete();}}}}public static void main(String[] args) throws ParseException {EleRealDataService realDataService = new EleRealDataServiceImpl();realDataService.insertRealInfo();}
}

二、工具类讲解

     工具类读取文件作用:
         此工具类不仅可以循环获取需要读取的文件,还可以获取读取一个文件里面的多条数据。即同时可以读取多个文件的多条内容。
     重点方法(读取多条数据方法)readLine()讲解:
         readLine()方法是属于BufferReader:字符读取流缓冲区的方法;它表示每次读取一行数据。
         参数:此方法不接受任何参数(行尾应以’\ n’或’\ r’或EOF来理解)。
         返回值:此方法返回此方法读取的String,并排除任何可用的终止符号。如果缓冲的流已经结束并且没有要读取的行,则此方法返回NULL。
         异常:如果发生I /O错误,则此方法将引发IOException。
     readLine()方法的原理及与rede()对比:
         readLine()方法无论读取一行数据还是读取多个字符,最终调用的方法还是读取字符流(Reader)中的read()方法,一次读取一个字符。
在这里插入图片描述
read()方法读取输入流

         read()方法读取的是单个字符,也可以说只要有输入流就会一直读取,返回的值是:作为一个整数(其范围从 0 到 65535 (0x00-0xffff))读入的字符,如果已到达流末尾,则返回 -1

         因此使用该方法时应该尽量避免输入流数据重复的发送,这样会导致read()读取到很长的重复数据,导致读取超时,但是对于仅有单次发送的输入流,则可以使用read()方法,具体使用如下:

InputStream in = client.getInputStream(); //获取到客户端的输入流
byte[] a = new byte[1024]; //定义字节数组
int len = in.read(a); //由于信息的传输是以二进制的形式,所以要以二进制的形式进行数据的读取
String data = new String(a, 0,len);
System.out.println("输入流消息:" + data);

Readline()方法读取输入流

         readLine方法读取一个是文本行。通过下列字符之一即可认为某行已终止:换行 (‘\n’)、回车 (‘\r’) 或回车后直接跟着换行。 返回的值是:包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
也就是说只要readLine方法读取到的输入流中含有回车换行符,则读取结束,这样的话对于连续重复发送的输入流信息,我们可以在每条信息的末尾增加一个回车换行符,这样readLine方法读取到该符号时就会自动结束,具体使用如下:

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "9527"));
String msg = br.readLine();
if(msg != null) {System.out.println("收到输入流信息:" + msg + "\n");
}

Readlines()方法读取输入流(Python)
         相对于readline()方法来说readlines()相对会快一些,因为readlines()是一次读取文本中的所有行,并且返回值是一个列表。

三、拓展报错解决

//报错信息
java.net.SocketTimeoutException: Read timed out

         即读取时间超时,但是从服务器发送过来的数据并不很长,所以按照正常情况下读取超时的情况一般是不会出现的,经过仔细研究发现是因为read()方法读取的是单个字符,会以流末尾作为结束,也就是说只要连接方一直在重复的发送数据,那么read()就会一直在读取一个很长的输入流,这样的话当然就会很容易造成读取超时的问题了,所以使用readLine()即解决此问题


https://www.xjx100.cn/news/848293.html

相关文章

Python高级系列教程:Python的进程和线程

学习目标 1、了解多任务的概念 2、了解进程的概念以及多进程的作用 3、掌握多进程完成多任务的工作原理及案例编写 4、掌握进程编号的获取方式以及进程使用的注意事项 5、了解线程的概念以及多线程的作用 6、掌握多进程完成多任务的工作原理及案例编写 一、多任务的概念 …

xxlJob任务管理平台500:xxl-job remoting error(connect timed out)

目录 一、问题截图 二、问题处理 2.1.查看执行器地址 2.2.查看本地端口 2.3.总结 三、关于地址的题外话 一、问题截图 此时可以看到code500&#xff0c;msg是连接超时&#xff0c;说明地址不通&#xff0c;那就是查看地址配置。 二、问题处理 2.1.查看执行器地址 …

Spring Boot进阶(50):Spring Boot如何全局统一处理异常?| 超级详细,建议收藏

1. 前言&#x1f525; 今天和大家讨论的是Spring Boot如何统一处理异常。这里先说一下我们为什么需要全局统一处理异常&#xff1f;其实理由很简单&#xff0c;因为程序在运行的过程中&#xff0c;不可避免会产生各种各样的错误。比如说用户传过来的参数不正确&#xff0c;无法…

【这小文章绝了!】一文看穿,MATLAB | 数组与矩阵超详细入门进阶必须看

目录 介绍 一、数组的创建和操作 通过 : 创建一维数组 通过logspace函数创建一维数组 通过linspace函数创建一维数组 二、数组的运算 数组的关系运算 数组的逻辑运算 三、矩阵 矩阵的构造 矩阵的下标引用 矩阵大小 四、矩阵元素的运算 矩阵的差分 矩阵运算 矩阵…

百度网盘搜索引擎神器哪些网站比较好用

整理了一些2022年还可以使用&#xff0c;个人感觉还不错的八大网盘搜索神器分享给大家&#xff0c;网址的百度搜一下就能找到。 1.轻便搜索 集合了百度网盘、阿里云盘等主流网盘资源非常丰富&#xff0c;2022年新出来的一个本人感觉最好用的网盘搜索神器&#xff0c;不仅有PC…

如何查看电脑是否安装了mysql

可以通过以下几种方式查看电脑是否安装了MySQL: 1. 在系统服务中查找MySQL服务 打开控制面板 → 管理工具 → 服务,在服务列表中查找“MySQL”服务。如果存在MySQL服务并且启动类型为“自动”或“手动”,则表示已安装MySQL。 2. 查找MySQL安装目录 一般MySQL的安装目录为:- Wi…

亲测,2022年私藏的免费好用的磁力网盘资源搜索网站,找资源不用愁

面对现在网上电影、电视、小说、图片、软件等资源纷纷收费之后&#xff0c;目前找资源确实越来越困难&#xff0c;对于我们收入仅够温饱的白Piao党来说&#xff0c;资源肯定就是免费的香。分享下我常用的资源搜索网站&#xff0c;排名不分先后。大家记得收藏保存&#xff0c;免…

又发现个新的全网资源搜索神器

平常用谷歌百度搜资源一个个翻很费劲&#xff0c;这里分享几个最新可用的全网网盘资源搜索神器&#xff0c;在公众号苏生不惑后台回复神器 获取软件下载地址。 混合盘 这个app聚合搜索多个网盘资源&#xff0c;可从数十个网盘搜索网站中检索出你需要的资源&#xff0c;app非常简…