Java 编码系列:日期和时间、文件操作

引言

在 Java 开发中,日期和时间的处理以及文件操作是常见的任务。正确理解和使用这些功能不仅可以提高代码的可读性和性能,还能避免一些常见的错误。本文将深入探讨 Java 中的日期和时间处理、文件操作的底层原理,并结合大厂的最佳实践,帮助读者掌握这些核心概念。

1. 日期和时间处理
1.1 基本概念

在 Java 中,处理日期和时间有多种方式,包括 DateCalendarLocalDateLocalTimeLocalDateTime 等类。从 Java 8 开始,引入了新的日期和时间 API,这些新类更加直观和易于使用。

1.2 旧的日期和时间 API
  • Date:表示特定的瞬间,精确到毫秒。Date 类的许多方法已经被标记为过时,建议使用新的日期和时间 API。

    Date date = new Date();
    System.out.println(date.toString());
  • Calendar:提供了对 Date 类的扩展,可以进行日期和时间的计算。

    Calendar calendar = Calendar.getInstance();
    calendar.set(2023, Calendar.OCTOBER, 1);
    Date date = calendar.getTime();
    System.out.println(date.toString());
1.3 新的日期和时间 API
  • LocalDate:表示没有时间部分的日期,如 2023-10-01。

  • LocalTime:表示没有日期部分的时间,如 12:30。

  • LocalDateTime:表示日期和时间,如 2023-10-01T12:30。

  • ZonedDateTime:表示带时区的日期和时间,如 2023-10-01T12:30+08:00[Asia/Shanghai]。

    LocalDate date = LocalDate.of(2023, 10, 1);
    LocalTime time = LocalTime.of(12, 30);
    LocalDateTime dateTime = LocalDateTime.of(date, time);
    ZonedDateTime zonedDateTime = ZonedDateTime.of(dateTime, ZoneId.systemDefault());System.out.println(date); // 2023-10-01
    System.out.println(time); // 12:30
    System.out.println(dateTime); // 2023-10-01T12:30
    System.out.println(zonedDateTime); // 2023-10-01T12:30+08:00[Asia/Shanghai]
1.4 常见操作
  • 格式化和解析日期

    • 使用 DateTimeFormatter:可以自定义日期和时间的格式。
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    LocalDateTime dateTime = LocalDateTime.parse("2023-10-01 12:30:00", formatter);
    String formatted = dateTime.format(formatter);System.out.println(dateTime); // 2023-10-01T12:30
    System.out.println(formatted); // 2023-10-01 12:30:00
  • 日期和时间的计算

    • 使用 plus 和 minus 方法:可以方便地进行日期和时间的加减操作。
    LocalDate date = LocalDate.of(2023, 10, 1);
    LocalDate nextYear = date.plusYears(1);
    LocalDate previousDay = date.minusDays(1);System.out.println(nextYear); // 2024-10-01
    System.out.println(previousDay); // 2023-09-30
  • 获取当前日期和时间

    • 使用 now 方法:可以获取当前的日期和时间。
    LocalDate today = LocalDate.now();
    LocalTime now = LocalTime.now();
    LocalDateTime currentDateTime = LocalDateTime.now();
    ZonedDateTime currentZonedDateTime = ZonedDateTime.now();System.out.println(today); // 当前日期
    System.out.println(now); // 当前时间
    System.out.println(currentDateTime); // 当前日期和时间
    System.out.println(currentZonedDateTime); // 当前带时区的日期和时间
1.5 最佳实践
  • 使用新的日期和时间 API:从 Java 8 开始,新的日期和时间 API 更加直观和易于使用,建议优先使用。

  • 避免使用 DateCalendar:这些类的许多方法已经被标记为过时,建议使用新的日期和时间 API。

  • 使用 DateTimeFormatter 进行格式化和解析:可以自定义日期和时间的格式,提高代码的可读性和灵活性。

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    LocalDateTime dateTime = LocalDateTime.parse("2023-10-01 12:30:00", formatter);
    String formatted = dateTime.format(formatter);
  • 注意时区问题:在处理带时区的日期和时间时,要特别注意时区的设置,避免出现时区错误。

    ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDateTime.now(), ZoneId.of("Asia/Shanghai"));
2. 文件操作
2.1 基本概念

Java 提供了丰富的文件操作 API,包括 File 类、FileInputStreamFileOutputStreamFileReaderFileWriter 以及 PathFiles 类。这些类和接口可以帮助开发者进行文件的创建、读取、写入、删除等操作。

2.2 底层原理
  • File:表示文件和目录路径名的对象,提供了文件和目录的基本操作。

    File file = new File("example.txt");
    boolean exists = file.exists();
    boolean isDirectory = file.isDirectory();
    boolean isFile = file.isFile();
    long length = file.length();
  • FileInputStreamFileOutputStream:用于读取和写入二进制文件。

    try (FileInputStream fis = new FileInputStream("input.txt")) {int content;while ((content = fis.read()) != -1) {System.out.print((char) content);}
    } catch (IOException e) {e.printStackTrace();
    }try (FileOutputStream fos = new FileOutputStream("output.txt")) {String content = "Hello, World!";fos.write(content.getBytes());
    } catch (IOException e) {e.printStackTrace();
    }
  • FileReaderFileWriter:用于读取和写入字符文件。

    try (FileReader fr = new FileReader("input.txt")) {int content;while ((content = fr.read()) != -1) {System.out.print((char) content);}
    } catch (IOException e) {e.printStackTrace();
    }try (FileWriter fw = new FileWriter("output.txt")) {String content = "Hello, World!";fw.write(content);
    } catch (IOException e) {e.printStackTrace();
    }
  • PathFiles:从 Java 7 开始,引入了新的文件操作 API,这些类提供了更强大的文件操作功能。

    Path path = Paths.get("example.txt");
    boolean exists = Files.exists(path);
    boolean isDirectory = Files.isDirectory(path);
    boolean isFile = Files.isRegularFile(path);
    long size = Files.size(path);try {List<String> lines = Files.readAllLines(path);for (String line : lines) {System.out.println(line);}
    } catch (IOException e) {e.printStackTrace();
    }try {List<String> lines = Arrays.asList("Hello, World!", "This is a test.");Files.write(path, lines, StandardCharsets.UTF_8);
    } catch (IOException e) {e.printStackTrace();
    }
2.3 常见操作
  • 创建文件和目录

    • 使用 File 类:可以创建文件和目录。
    File file = new File("example.txt");
    file.createNewFile();File directory = new File("exampleDir");
    directory.mkdir();
    • 使用 Files 类:可以创建文件和目录。
    Path path = Paths.get("example.txt");
    Files.createFile(path);Path dirPath = Paths.get("exampleDir");
    Files.createDirectory(dirPath);
  • 读取文件内容

    • 使用 FileReader:逐字符读取文件内容。
    try (FileReader fr = new FileReader("input.txt")) {int content;while ((content = fr.read()) != -1) {System.out.print((char) content);}
    } catch (IOException e) {e.printStackTrace();
    }
    • 使用 Files 类:一次性读取文件的所有行。
    try {List<String> lines = Files.readAllLines(Paths.get("input.txt"));for (String line : lines) {System.out.println(line);}
    } catch (IOException e) {e.printStackTrace();
    }
  • 写入文件内容

    • 使用 FileWriter:逐字符写入文件内容。
    try (FileWriter fw = new FileWriter("output.txt")) {String content = "Hello, World!";fw.write(content);
    } catch (IOException e) {e.printStackTrace();
    }
    • 使用 Files 类:一次性写入文件的所有行。
    try {List<String> lines = Arrays.asList("Hello, World!", "This is a test.");Files.write(Paths.get("output.txt"), lines, StandardCharsets.UTF_8);
    } catch (IOException e) {e.printStackTrace();
    }
  • 删除文件和目录

    • 使用 File 类:可以删除文件和目录。
    File file = new File("example.txt");
    file.delete();File directory = new File("exampleDir");
    if (directory.isDirectory()) {File[] files = directory.listFiles();if (files != null) {for (File f : files) {f.delete();}}directory.delete();
    }
    • 使用 Files 类:可以删除文件和目录。
    Path path = Paths.get("example.txt");
    Files.delete(path);Path dirPath = Paths.get("exampleDir");
    Files.walk(dirPath).sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete);
2.4 最佳实践
  • 使用 try-with-resources 语句:确保资源在使用后能够正确关闭,避免资源泄露。

    try (FileReader fr = new FileReader("input.txt")) {int content;while ((content = fr.read()) != -1) {System.out.print((char) content);}
    } catch (IOException e) {e.printStackTrace();
    }
  • 使用 Files 类进行文件操作:从 Java 7 开始,Files 类提供了更强大的文件操作功能,建议优先使用。

    try {List<String> lines = Files.readAllLines(Paths.get("input.txt"));for (String line : lines) {System.out.println(line);}
    } catch (IOException e) {e.printStackTrace();
    }
  • 处理文件路径:使用 Path 类来处理文件路径,可以避免路径分隔符的问题。

    Path path = Paths.get("example.txt");
  • 注意文件权限:在进行文件操作时,要特别注意文件的读写权限,避免出现权限错误。

    Path path = Paths.get("example.txt");
    if (Files.isReadable(path) && Files.isWritable(path)) {// 进行文件操作
    }
3. 大厂最佳实践
3.1 日期和时间处理
  • 阿里巴巴《Java开发手册》
    • 使用新的日期和时间 API:从 Java 8 开始,新的日期和时间 API 更加直观和易于使用,建议优先使用。
    • 避免使用 Date 和 Calendar:这些类的许多方法已经被标记为过时,建议使用新的日期和时间 API。
3.2 文件操作
  • Google Java Style Guide
    • 使用 try-with-resources 语句:确保资源在使用后能够正确关闭,避免资源泄露。
    • 使用 Files 类进行文件操作:从 Java 7 开始,Files 类提供了更强大的文件操作功能,建议优先使用。
3.3 性能优化
  • Oracle 官方文档
    • 使用 Path 类处理文件路径:可以避免路径分隔符的问题。
    • 注意文件权限:在进行文件操作时,要特别注意文件的读写权限,避免出现权限错误。
4. 总结

本文深入探讨了 Java 中的日期和时间处理、文件操作的底层原理,并结合大厂的最佳实践,帮助读者掌握这些核心概念。正确理解和使用这些技术不仅可以提高代码的可读性和性能,还能避免一些常见的错误。希望本文对你有所帮助,如果你有任何问题或建议,欢迎留言交流。


希望这篇文章能够满足你的需求,如果有任何进一步的问题或需要更多内容,请随时告诉我!

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

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

相关文章

芝士AI一次过!开题报告通用模板,可直接套用!

在正式写开题报告之前&#xff0c;需要搞清楚以下几个问题。 ①你选择这个论文选题的理由是什么&#xff1f;&#xff08;选题背景&#xff09; ②你打算去研究什么&#xff1f;解决什么问题&#xff1f;&#xff08;研究内容&#xff09; ③该选题目前有哪些研究&#xff0…

新峰商城之订单(二):订单生成

在订单确认页面处理完毕后&#xff0c;此时用户单击“提交订单”按钮&#xff0c;商城系统就对应生成一笔订单数据并保存在数据库中&#xff0c;此即订单生成功能。 在单击“提交订单”按钮后&#xff0c;后端会进行一系列操作&#xff0c;包括数据查询、数据判断、数据整合等&…

构建与优化自定义进程池

1. 什么是进程池&#xff1f; 简单来说&#xff0c;进程池就是预先创建固定数量的工作进程&#xff0c;通过设计任务队列或调度算法来分配任务给空闲的进程 —— 实现“负载均衡”。 2. 进程池框架设计 枚举错误返回值&#xff1a; enum {UsageError 1,ArgError,PipeError };…

人工智能时代的学与教

疫情逐渐散去之后&#xff0c;最最吸引全球目光的应该就是ChatGPT-3了。美国政治家亨利基辛格领衔出版的新书《AI世代与我们人类的未来》(The Age of AI and Our Human Future)中举了一个例子来说明ChatGPT-3的能力。首先让ChatGPT-3阅读关于它自身能力的哲学评论之后&#xff…

【吊打面试官系列-MySQL面试题】MyISAM 表格将在哪里存储,并且还提供其存储格式?

大家好&#xff0c;我是锋哥。今天分享关于【MyISAM 表格将在哪里存储&#xff0c;并且还提供其存储格式&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; MyISAM 表格将在哪里存储&#xff0c;并且还提供其存储格式&#xff1f; 每个 MyISAM 表格以三种格式存储…

240912-设置WSL中的Ollama可在局域网访问

A. 最终效果 B. 设置Ollama&#xff08;前提&#xff09; sudo vim /etc/systemd/system/ollama.service[Unit] DescriptionOllama Service Afternetwork-online.target[Service] ExecStart/usr/bin/ollama serve Userollama Groupollama Restartalways RestartSec3 Environme…

读取t x t文件生成exce

读取t x t文件生成excel package com.moka.api.custom.core.controller; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermode…

LangChain基础知识大全

LangChain基础知识大全 一、部署ChatGLM-6B1.拉取源码2.安装环境3.下载模型4.修改api.py配置5.运行api.py 二、Models组件1.LLM&#xff08;大语言模型&#xff09;2.Chat Model&#xff08;聊天模型&#xff09;3.Embedding Model&#xff08;嵌入模型&#xff09;3.1 下载中文…

基于Python的自然语言处理系列(16):TorchText + CNN + Teacher Forcing

在本篇文章中&#xff0c;我们将实现 卷积序列到序列学习模型&#xff08;Convolutional Sequence to Sequence Learning&#xff09;。与之前介绍的基于循环神经网络&#xff08;RNN&#xff09;的模型不同&#xff0c;卷积模型不依赖递归成分&#xff0c;而是通过卷积层&…

增强现实系列—Map-Relative Pose Regression for Visual Re-Localization

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

基于JAVA+SpringBoot+Vue的社区智慧养老监护管理平台

基于JAVASpringBootVue的社区智慧养老监护管理平台 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1…

科研绘图系列:R语言多个AUC曲线图(multiple AUC curves)

文章目录 介绍加载R包导入数据数据预处理画图输出结果组图系统信息介绍 多个ROC曲线在同一张图上可以直观地展示和比较不同模型或方法的性能。这种图通常被称为ROC曲线图,它通过比较不同模型的ROC曲线下的面积(AUC)大小来比较模型的优劣。AUC值越大,模型的诊断或预测效果越…

前后端跨域问题及其在ThinkPHP中的解决方案

在现代Web开发中&#xff0c;前后端分离的架构越来越普遍&#xff0c;但这也带来了跨域问题。跨域指的是在一个域下的网页试图请求另一个域的资源&#xff0c;浏览器出于安全考虑会限制这种行为。本文将探讨如何在ThinkPHP中解决跨域问题。 #### 1. 什么是跨域&#xff1f; 跨…

一个皮肤科医生长痘的的自救

内服 复方锌铁钙口服液 丹参瞳胶囊 盐酸米诺环素胶囊 (每天一次) 内服 外用: 克林霉素甲硝搽剂 (泛红的痘痘) 人表皮生长因子(痘印)氢醌软膏 (点阵激光留下的色沉 早晚一次) 至少用两个月【痤疮|痘痘用药 一个皮肤科医生的自救】https://www.bilibili.com/video/BV1zu41…

算法题之每日温度

每日温度 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 示例 1: 输入…

java计算机毕设课设—企业车辆管理系统(附源码、文章、相关截图、部署视频)

这是什么系统&#xff1f; 资源获取方式在最下方 java计算机毕设课设—企业车辆管理系统(附源码、文章、相关截图、部署视频) 企业车辆管理系统通过计算机&#xff0c;能够直接“透视”车辆使用情况&#xff0c;数据计算自动完成&#xff0c;尽量减少人工干预&#xff0c;可…

Java项目实战II基于Java+Spring Boot+MySQL的植物健康系统(开发文档+源码+数据库)

目录 目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着…

实战指南:深度剖析Servlet+JSP+JDBC技术栈下的用户CRUD操作

本博客总结基于MVC(JSPServletJDBC)操作用户信息的CRUD&#xff08;增删改查功能&#xff09;的完整小项目。包括图片上传和回显&#xff0c;模糊查询&#xff0c;过滤器的登录校验和设置全局字符集以及监听器统计在线用户人数等额外功能&#xff0c;因为代码较多&#xff0c;我…

UnLua实现继承

一、在蓝图中实现继承 1、创建父类&#xff0c;并绑定Lua脚本 2、创建子类蓝图&#xff0c;如果先创建的子类&#xff0c;可以修改父类继承 注意&#xff0c;提示选择继承父类的接口&#xff01; 二、在Lua中实现继承 1、在父类Lua脚本中实现函数 BP_CharacterBase.lua func…

构建数字化生态系统:打造数字化转型中开放协作平台的最佳实践和关键实施技巧

在数字化转型浪潮中&#xff0c;企业如何确保成功实施至关重要。除了技术上的革新&#xff0c;企业还必须在战略执行、架构优化以及合规性管理等方面掌握最佳实践。随着云计算、大数据、人工智能等新兴技术的迅速发展&#xff0c;企业通过正确的实施技巧不仅能提升业务效率&…