首页 > 编程语言 >【从零开始重学Java】第11天

【从零开始重学Java】第11天

时间:2024-01-10 16:33:33浏览次数:65  
标签:11 重学 Java allLinesSet System 88 从零开始

前情提示

从零开始重学Java 第0天
从零开始重学Java 第1天
从零开始重学Java 第2天
从零开始重学Java 第3天
从零开始重学Java 第4天
从零开始重学Java 第5天
从零开始重学Java 第6天
从零开始重学Java 第7天
从零开始重学Java 第8_9_10天

Java数据流

关于文件的操作建议使用新的API Java NIO.2
JDK9以后 输入输出流的抽象类新增了一些方便的方法,NIO.2的工具类也新增很多方便的方法
可以说常见的流写入读取操作都有了自带封装

数据流的基本概念

输入数据流

输出数据流

基本字节数据流类

早期的write和read只能读写ASCII 字符集中的一部分字符
字节流更适用于二进制文件的读写,字符流适用于处理文本类文件的读写

文件数据流

过滤流

管道数据流

好像实际开发里完全没用过......
看源码是PipedOutputStream引用了connect链接的PipedInputStream,然后共同使用PipedInputStream的buffer内容

对象流

和Serializable序列化相关的一种流

可持久化

序列化有一个很大的问题,当类发生修改时,已经序列化的文件,不一定还能正常反序列化回去
通过手动指定死serialVersionUID可以反序列化,但可能因为类结构不兼容而抛出异常
所以现在大家更习惯使用JSON或者数据库来保存自己的对象数据

基本字符流

读者和写者

缓冲区读者和缓冲区写者

文件的处理

文件的读写建议用NIO.2的API,简单易懂

read
write
newStream
copy
delete
move
create
exists
is

File类

建议用Paths来替代,可以省去File.separator拼接

Paths

随机访问文件

可以用于做断点续传,记录文件指针指向的位置

第十一章习题

  • 设计一个通讯录,保存联系人信息,持久化到文件
public class ContactsTxtDemo {

    private static final Path txtPath = Paths.get("contacts.txt");

    public static void main(String[] args) {
        checkTxtFile();
        LinkedHashSet<String> allLinesSet = readTxtFile();
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextLine()){
            String line = scanner.nextLine();
            if ("stop".equals(line)){
                break;
            }
            if (allLinesSet.contains(line)){
                System.out.println("已存在 " + line);
            }else {
                allLinesSet.add(line);
                System.out.println("已添加 " + line);
            }
        }
        writeTxtFile(allLinesSet);

    }

    private static void checkTxtFile() {
        if (Files.notExists(txtPath)){
            try {
                Files.createFile(txtPath);
            }catch (Exception e){
                throw new RuntimeException("创建文件失败",e);
            }
        }
    }
    private static LinkedHashSet<String> readTxtFile(){
        LinkedHashSet<String> linkedHashSet;
        try {
            linkedHashSet = Files.readAllLines(txtPath).stream()
                    .filter(e -> !e.isBlank())
                    .collect(Collectors.toCollection(LinkedHashSet::new));
        }catch (Exception e){
            throw new RuntimeException("读取文件失败",e);
        }
        System.out.println("读取了" + linkedHashSet.size()+"条记录");
        linkedHashSet.forEach(System.out::println);
        return linkedHashSet;
    }
    private static void writeTxtFile(LinkedHashSet<String> allLinesSet){
        System.out.println("即将写入" + allLinesSet.size()+"条记录");
        allLinesSet.forEach(System.out::println);
        try {
            Files.write(txtPath,allLinesSet);
        }catch (Exception e){
            throw new RuntimeException("写入文件失败",e);
        }
    }
}

// 读取了3条记录
// 小明 88
// 小兰 99
// 小张 99
// xiaoming 88
// 已添加 xiaoming 88
// 小明 88
// 已存在 小明 88
// 小兰 99
// 已存在 小兰 99
// xiaoming 88
// 已存在 xiaoming 88
// stop
// 即将写入4条记录
// 小明 88
// 小兰 99
// 小张 99
// xiaoming 88

标签:11,重学,Java,allLinesSet,System,88,从零开始
From: https://www.cnblogs.com/lazykingloveu/p/17956793

相关文章

  • re | win11 + windbg接收不到内核调试DbgPrint解决
    re|win11+windbg接收不到内核调试DbgPrint解决网上都是改注册表或者用工具,这不是纯脱裤子放屁吗?怎么可能不让你接收到呢?还有个CSDN的修改注册表还抄的别人的,真可笑。人微软都说了怎么弄了:https://learn.microsoft.com/zh-cn/windows-hardware/drivers/debugger/reading-and......
  • Java学习积累
    Java学习积累对象判空在判断获取的信息是否为空时需要注意字段类型的区别如果是String类型变量需要采用string==nullStrUtil.isEmpty(string)StringUtils.isEmpty一种是JDKString包中的内容一种是Springboot中的内容(可能5.3版本之后这个方法就没有用了)在判断......
  • 2024年1月Java项目开发指南1:环境与工具准备
    准备工作基础能力开发能力的事咱先不谈,有两个基础技能要学一下。1.学习使用Markdown编写文档2.学会使用git拉取代码和提交代码软件准备电脑需要安装以下软件:IDEA2023.2及其以上(Java开发统一使用IDEA)Webstorm2023.2及其以上(也可以使用VScode或者Hbuilder或者Dreamweav......
  • 2024年1月Java项目开发指南2:项目设计
    确定软件架构1.前端用什么技术,什么框架,什么版本2.后端用什么技术,什么框架,什么版本3.用些什么软件,软件版本?比如:前端:vue3+Element-Plus+Axios后端:Java17SpringbootMyBatis-plusMaven3数据库:MySQL5.5后端开发工具:IDEA2023.2.2前端开发工具:Webstorm2023.2.2接口管理......
  • win11安装mysql(解压版)
    一、官网下载https://dev.mysql.com/downloads/mysql/二、配置环境变量设置>系统>系统信息>高级系统设置三、配置my.inimysql根目录下创建my.ini1[mysqld]2;设置3306端口3port=33064;设置mysql的安装目录5basedir=D:\\XX\\mysql-8.0.18-winx646;设置my......
  • 【JavaScript】JavaScript定义、引入方式、基础语法、函数、对象、继承
    定义JavaScript是一门跨平台、面向对象的脚本语言用来控制网页行为的,可以使网页交互引入方式内部脚本外部脚本JS基础语法书写语法输出语句变量变量作用域数据类型运算符=====??.?...展开运算符(1)打散数组传递给多个参数(2)复制数组或......
  • 网工们,这11种协议报文格式一定要烂熟于心!
    01、TCP1、源端口号和目的端口号:用16bit表示所以端口号范围为0~65535,用来标识源主机和目的主机上的进程,用于运输层的多路复用和多路分解。2、序号:用于TCP重发时区分是第一次发送还是重发的TCP段,还可以在一次连接的范围防止重放攻击,不重数可以在很久时间防止重放攻击。3、重放攻击......
  • Java SMTP发送邮件有什么好处?实现方式?
    在当今数字化时代,电子邮件成为人们日常生活和工作中不可或缺的沟通工具。为了在Java应用程序中实现邮件发送功能,使用SMTP(SimpleMailTransferProtocol)是一种常见的选择。本文将探讨在Java中使用SMTP发送邮件的好处,并介绍其实现方式。1.简介:JavaSMTP发送邮件的背景在开始深入讨......
  • Java Spring Boot Controller、Service、DAO实践
    如果你用过SpringMVC,那就对Controller、Service、DAO三者的概念一定不陌生,我们通过Controller来接收请求和返回响应,具体的业务处理则放在Service层处理,而DAO则实现具体与数据库等持久层的操作。今天从分层的角度来学习下在SpringBoot中的简单应用,业务场景也很简单,就......
  • 迅为RK3568开发板Android11/12/Linux编译驱动到内核
    在平时的驱动开发中,经常需要在内核中配置某种功能,为了方便大家开发和学习,本小节讲解如何在内核中添加驱动。具体的讲解原理讲解请参考本手册的驱动教程。Android11源码如果想要修改内核,可以运行以下命令进行修改:cdkernel/makeARCH=arm64rockchip_defconfigmakeARCH=arm64men......