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

news2024/12/24 8:24:30

这里写自定义目录标题

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

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

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()即解决此问题

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

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

相关文章

报表生成器FastReport .Net用户指南:“Line“对象及属性

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案&#xff0c;使用FastReport .NET可以创建独立于应用程序的.NET报表&#xff0c;同时FastReport .Net支持中文、英语等14种语言&#xff0c;可以让你的产品保证真正的国际性。 FastReport.NET官方版…

Maven入门

目录 1.为什么要学习Maven 1. 作为jar包的管理工具 2.作为构建管理工具 3.结论 2.什么是Maven 1. 构建包含的主要环节 2.依赖 3.Maven的工作机制 3.Maven的核心概念&#xff1a; 1.坐标 2.POM 3.约定的目录结构 4.生命周期 5.插件与目标 6.仓库 4.Maven操作 5…

现实版“超级英雄”!外卖小哥从10余米高桥纵身跳下救人

“我心里也很怂啊&#xff0c;但个人害怕跟别人的命比起来&#xff0c;肯定是救人要紧&#xff0c;人命关天的事&#xff0c;还用想吗&#xff1f;” 这是一位勇敢外卖小哥在接受媒体采访时说的。 语言虽朴实无华&#xff0c;却道出了一个重要的价值观&#xff1a;人命关天&…

APP测试面试题快问快答(四)

16.App测试的实时日志如何获取&#xff1f; 考察点&#xff1a;是否有移动app测试的日志获取相关经验 一般可以通过以下方式获取&#xff1a; 1.可以使用adb命令&#xff1a;adb logcat | findstr "com.sankuai.meituan" >d:\test.txt 2.用ddms抓取&#xff0…

Android中的异步处理之RxJava与协程(Coroutines)使用案例PK

RxJava一直是我长久以来的救星。它提供了丰富的功能&#xff0c;让我在Android编程中更加注重响应式思维。我的代码中到处都是Single、Subject和Completable。 而现在&#xff0c;协程成为了备受赞誉和推崇的选择&#xff0c;许多演讲和会议都推荐使用。于是我开始学习它。 为…

使用Vision Transformers实现高效语义分割的内容感知共享Token

文章目录 Content-aware Token Sharing for Efficient Semantic Segmentation with Vision Transformers摘要本文方法Content-aware token sharing frameworkContent-aware token sharing policy 实验结果 Content-aware Token Sharing for Efficient Semantic Segmentation wi…

Vue中如何进行滚动吸顶与侧边栏固定

Vue中如何进行滚动吸顶与侧边栏固定 在Vue应用程序中&#xff0c;当需要实现滚动吸顶和侧边栏固定效果时&#xff0c;我们可以使用一些技术来实现。这些技术包括CSS和JavaScript&#xff0c;可以帮助我们实现各种各样的滚动效果。 如何实现滚动吸顶&#xff1f; 滚动吸顶是指…

Ubuntu 系统如何使用 root 用户登录实例

Ubuntu 系统的默认用户名是 ubuntu&#xff0c;并在安装过程中默认不设置 root 帐户和密码。您如有需要&#xff0c;可在设置中开启允许 root 用户登录。具体操作步骤如下&#xff1a; 1. 使用 ubuntu 帐户登录轻量应用服务器。 2. 执行以下命令&#xff0c;设置 root 密码。…

Java判断一个字符串是否包含某个字符串

开发过程中&#xff0c;有时会判断一个字符串是否包含某个字符串的操作&#xff0c;这里总结判断方法。 方式一&#xff1a;contains()方法 理解&#xff1a;contains() 方法用于判断字符串中是否包含指定的字符或字符串。&#xff08;判断一个字符串是否包含某个字符串&#…

网上书店 Vue+Spring boot+H5+Uniapp

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 基于VueSpring boot的网上书城 目录一、项目模块二、项目模块三 技术选型四、运行环境五 .PC登录页面代码六 .H5登录页面代码 运行效果源码 目录 网上书店 VueSpring bootH5U…

Cos 文件上传下载

目录 方法一&#xff1a; maven依赖&#xff1a; UploadServlet upload.jsp 方法二&#xff1a; maven依赖 UploadServlet upload.jsp success.jsp error.jsp 运行结果&#xff1a; 百度文件上传插件&#xff1a; Web Uploader 本文通过JSPServlet的架构&#xff0c…

华为OD机试真题 JavaScript 实现【字符串变换最小字符串】【2022Q4 100分】

一、题目描述 给定一个字符串s&#xff0c;最多只能进行一次变换&#xff0c;返回变换后能得到的最小字符串&#xff08;按照字典序进行比较&#xff09;。 变换规则&#xff1a;交换字符串中任意两个不同位置的字符。 二、输入描述 一串小写字母组成的字符串s。 三、输出…

文件系统整体流程介绍

一、什么是文件系统 计算机的文件系统是一种存储和组织计算机数据的方法&#xff0c;它使得对其访问和查找变得容易&#xff0c;文件系统使用文件和树形目录的抽象逻辑概念&#xff0c;用户使用文件系统来保存数据不必关心数据实际保存在硬盘的地址为多少的数据块上&#xff0…

拨云见日:Redis和数据库之间的一致性如何保证?

概 述 Redis在使用过程中&#xff0c;有四个异常问题&#xff1a;缓存穿透、缓存击穿、缓存雪崩、以及缓存和数据库&#xff08;MySQL&#xff09;双写一致性问题。 前三个问题可能会因为业务体量的不同而有所不同&#xff0c;但是最后一个问题是无法避免的。就算你的电商业…

OPNET出现错误的解决办法汇总

文章目录 Packet pointer references unowned packet(<pk_id>) 错误Standard function stack imbalance 错误Invalid Memory Access 错误 在使用 OPNET Modeler 软件时&#xff0c;会遇到很多奇奇怪怪的报错&#xff0c;这篇文章收集的是自己在使用该软件时遇到的一些错误…

易基因:组学研究揭示不同牛品种的DNA甲基化、染色质和基因表达互作机制|科研进展

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 在全球范围内&#xff0c;牛为60多亿人提供了重要的营养来源。传染病是养牛生产的主要限制因素&#xff0c;且许多疾病人畜共患&#xff0c;因此与人类健康直接相关。近年来牛的许多复杂…

CBTC信号系统ATP子系统接口

ATP/ATO车载设备与车辆接口要求 ATP/ATO车载设备应实现与车辆制动装置的可靠接口&#xff0c;保证安全和对列车实施连续有效的控制。 ATP/ATO车载设备与车辆的接口分为开关量、模拟量、通信接口三种。 涉及行车安全的电气接口应采用安全输入&#xff0f;输出接口方式。 ATP…

electron 快速创建一个本地应用

参考官方文档流程 快速入门 | Electron 建议先全局安装electron&#xff0c;npm install -g electron 开发过程中可以在本地开发安装 使用electron快速创建一个web页面 &#xff0c;参考官方demo 实例 electron-quick-start 第一步&#xff1a; mkdir my-electron-app &am…

银行信用卡流失预测模型_基于ANN神经网络_金融培训_论文科研_毕业设计

业务背景 根据央行公布的数据显示&#xff0c;全国性银行信用卡和借贷合一卡的发卡量增速从2017年同比增速26.35%的高点逐年下降&#xff0c;截至2020年同比增速降至4.26%。银行信用卡发卡增速明显放缓的背景下&#xff0c;预防老客户流失的问题变得愈发重要。 假设一家消费信…

前端开发中有哪些鲜为人知的技巧?

下面分享一些前端开发鲜为人知的HTML/CSS/JS技巧&#xff0c;希望大家可以有所收获。 一、Datalist元素 不知道为什么&#xff0c;这个元素不太被人所使用。<datalist>标签被用于为<input>元素提供一个“自动补全”的功能。 例如&#xff1a; <input list&qu…