Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从IO到字符流:Java Writer是如何提高文件读写效率的?

从IO到字符流:Java Writer是如何提高文件读写效率的?

原创
作者头像
喵手
发布于 2023-11-12 11:02:24
发布于 2023-11-12 11:02:24
4770
举报
文章被收录于专栏:Java进阶实战Java进阶实战

哈喽,各位小伙伴们,你们好呀,我是喵手。

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

  在Java程序开发中,我们经常需要将数据输出到文件或者网络中,Writer类就是Java的一种输出字符流,它可以将字符按照一定的编码方式(如UTF-8、GBK)输出到文件或者网络中。

摘要

  在本篇文章中,我们将会对Java中的Writer类进行详细的介绍。我们将会从源代码解析、应用场景案例、优缺点分析、类代码方法介绍、测试用例等多个方面进行介绍,帮助读者更好地了解和应用Writer类。

Writer类

简介

  Java中的Writer类是一个抽象类,它是所有字符输出流的基类。它提供了写入字符流的通用的方法,包括写入单个字符、字符数组、字符串、换行符等。Writer类还提供了一些缓冲区的操作,可以减少磁盘I/O的次数,提高写入效率。

Writer类主要包含以下几个常用的方法:

  1. write(char c):写入单个字符。
  2. write(char[] cbuf):写入字符数组。
  3. write(String str):写入字符串。
  4. flush():将缓冲区的内容写入到输出流中。
  5. close():关闭输出流。
  6. append():添加字符或字符串到输出流中。

使用Writer类时,一般需要创建一个子类来实现具体的写操作,例如FileWriter、CharArrayWriter等。具体实现时,我们需要注意设置编码方式,避免出现中文乱码等问题。

源代码解析

  Writer类是Java中用于输出字符流的一个抽象类,它的继承层次结构如下图所示:

  在Java中,Writer类是Writer类层次结构的一部分。这个继承层次结构用于将字符写入各种输出目标,如文件、管道和缓冲区等。

以下是Writer类的继承层次结构:

代码语言:java
AI代码解释
复制
java.lang.Object
    java.io.Writer
        java.io.BufferedWriter
        java.io.CharArrayWriter
        java.io.FilterWriter
            java.io.OutputStreamWriter
            java.io.PrintWriter
            java.io.StringWriter

  除了Writer类本身外,层次结构中的其他类具有各自的特定功能。例如,BufferedWriter类允许您以缓冲方式写入字符,从而提高性能。CharArrayWriter类允许您将字符写入字符数组,而不是写入文件或管道。PrintWriter类允许您将格式化的数据写入输出流。

  Writer类中定义了很多抽象方法,如void write(char[] cbuf, int off, int len),表示将字符数组cbuf从下标off到下标off+len-1的字符输出到输出流中。除了抽象方法外,Writer类中还提供了很多实现方法,如void write(String str),表示将字符串str输出到输出流中,默认采用UTF-8编码方式。

  在Writer类中,还有一个非常重要的方法void flush(),表示将缓冲区中的数据强制输出到输出流中。而void close()方法则表示关闭输出流,释放资源。

应用场景案例

  Writer类经常被用于将数据输出到文件或者网络中,比如我们可以使用FileWriter类将字符串输出到文件中:

代码语言:java
AI代码解释
复制
package com.example.javase.io.fileProject;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

/**
 * @Author 喵手
 * @Date 2023-10-18 20:53
 */
public class WriterTest {

    public static void main(String[] args) {
        String str = "Hello, world!";
        File file = new File("testDoc.txt");
        try (FileWriter writer = new FileWriter(file)) {
            writer.write(str);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

如下是上述案例执行结果:

在这里插入图片描述
在这里插入图片描述

  在这个例子中,我们使用了try-with-resources语句,自动关闭了输出流。

  另外,我们也可以使用BufferedWriter类来进行输出,其实现方式如下:

代码语言:java
AI代码解释
复制
    public static void testWriter_2() {
        String str = "Hello, world!!!!";
        File file = new File("testDoc.txt");
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
            writer.write(str);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        testWriter_2();
    }

  在这个例子中,我们使用了BufferedWriter类来进行输出,它会自动进行缓存,提高输出效率。

如下是上述案例执行结果:

在这里插入图片描述
在这里插入图片描述

优缺点分析

Writer类的使用有以下优点:

  • 提供了丰富的方法,可以输出不同格式的数据;
  • 支持多种编码方式;
  • 可以使用不同的子类来实现不同的输出。

但是Writer类也有一些缺点:

  • 由于是抽象类,无法直接使用,需要通过其子类来实现;
  • 如果使用不当,可能会导致文件数据丢失或者损坏。

类代码方法介绍

Writer类中比较常用的方法有:

  • void write(char[] cbuf, int off, int len): 将字符数组cbuf从下标off到下标off+len-1的字符输出到输出流中;
  • void write(int c): 将字符c输出到输出流中;
  • void write(String str): 将字符串str输出到输出流中;
  • void flush(): 将缓冲区中的数据强制输出到输出流中;
  • void close(): 关闭输出流,释放资源。

测试用例

我们可以编写以下测试用例来测试Writer类:

代码语言:java
AI代码解释
复制
    public static void testWriter_3() {
        String str = "Hello, world!!!!!!!";
        File file = new File("testDoc.txt");
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
            writer.write(str);
            writer.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
            String content = reader.readLine();
            System.out.println("content:"+content);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static void main(String[] args) {
        testWriter_3();
    }

如下是上述案例执行结果:

在这里插入图片描述
在这里插入图片描述

  在这个测试用例中,我们通过Writer类将字符串输出到文件中,然后进行读取验证,从而测试Writer类的输出功能。

全文小结

  本篇文章详细介绍了Java中的Writer类,从源代码解析、应用场景案例、优缺点分析、类代码方法介绍、测试用例等多个方面进行了介绍。希望读者通过本文的介绍,能够更好地了解和应用Writer类。

总结

  Writer类是Java中用于输出字符流的一个抽象类,它提供了丰富的方法,支持多种编码方式,可以使用不同的子类来实现不同的输出。但是在使用时需要注意,避免数据丢失或者损坏。

... ...

最后

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

... ...

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ROS入门篇
ROS是一个松耦合的分布式软件框架。上图中有很多的Node(节点),每个节点是在机器人系统中完成一个具体功能的进程,比方说有的Node是完成图像识别,有的Node是完成一个图像的驱动,它们之间会有一系列图像的传输。节点与节点之间位置也不是固定的,比如上图中有两台电脑,一个A,一个B,有些节点可以在A当中,有些节点可以在B当中,它们之间可以通过一系列的传输方式来完成通讯。每个节点的编程语言也不是固定的,可以使用Python,也可以使用C++。
算法之名
2023/10/16
2.4K0
ROS入门篇
人机智能交互技术(ROS-HRI-人与机器人的智能交互)课程介绍与资料
这是机器人系统设计与控制技术的后续课程,全部的课程内容包括四门课程(本科),如下:
zhangrelay
2019/01/23
1.6K0
蓝桥ROS机器人之turtlesim导航
需要预备如下基础: 使用功能包为:  后续会补充stdr案例(ROS小课堂出品)。 ~  www.corvin.cn/561.html  ~ 使用plotjuggler 专业出图工具,路径一目了然。 移动到红色位置! 再回到中心: 曲线图如下: 部分命令如下: shiyanlou:~/ $ history [17:45:05] 1 unzip turtlesim_examp
zhangrelay
2022/05/01
4070
蓝桥ROS机器人之turtlesim导航
ROS机器人仿真运动学和动力学位置曲线差异
roslaunch robot1_gazebo gazebo_empty.launch
zhangrelay
2022/05/01
3280
ROS机器人仿真运动学和动力学位置曲线差异
云课五分钟-03第一个开源游戏复现-贪吃蛇
一个终端的动态字符显然很难调动编程的积极性,那么更有趣的开源的游戏也许是一种更好的启发。 
zhangrelay
2023/11/16
5560
云课五分钟-03第一个开源游戏复现-贪吃蛇
测评活动分享
在点云PCL公众号相机测评活动的支持下,首先拿到了小觅相机,所以这篇文章将对小觅MYNTEYE-S1030-IR在ORB-SLAM2和RTAB-Map两种SLAM方案下的效果进行测评,为了增强对比效果会和我自制双目摄像头进行对比。同时这还是一篇干货满满的技术文章,我会写下详细的实验环境搭建步骤,相信你会学到很多东西!下面开始快乐的学习旅程吧!
点云PCL博主
2019/08/28
2.3K0
测评活动分享
蓝桥ROS机器人之绚丽贪吃蛇
前面一个贪吃蛇🐍,效果很普通: 有了GitHub,结合蓝桥云课,几乎无敌! 参考:github.com/rapiz1/DungeonRush 下载代码: git clone https://github.com/rapiz1/DungeonRush.git # apt install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-net-dev libsdl2-ttf-dev 编译可能报错: cmake .. make 修改CM
zhangrelay
2022/05/01
5270
蓝桥ROS机器人之绚丽贪吃蛇
蓝桥ROS机器人之古月居ROS入门21讲
ROS1入门经典课程,在其官网和B站等都有详细介绍和视频讲解。 古月居校园行 直接在蓝桥云课下载就可以学习和使用啦。 文档部分: 源码等: 将源码复制到demo_ws/src下,并编译后使
zhangrelay
2022/05/01
7700
蓝桥ROS机器人之古月居ROS入门21讲
Cpp ROS(一)发布器Publisher和订阅器Subscriber简单例子
创建完成以后,在目录my_node_demo下多出两个文件(package.xml ,CMakeLists.txt)和两个文件夹(src, include)。
Autooooooo
2020/11/09
1.1K0
Cpp ROS(一)发布器Publisher和订阅器Subscriber简单例子
蓝桥ROS机器人之第一个功能包helloros
helloros cmake_minimum_required(VERSION 2.8.3) project(helloros) ## Compile as C++11, supported in ROS Kinetic and newer # add_compile_options(-std=c++11) ## Find catkin macros and libraries ## if COMPONENTS list like find_package(catkin REQUIRED COM
zhangrelay
2022/05/01
5510
蓝桥ROS机器人之第一个功能包helloros
ROS机器人从起点到终点(四)蓝桥云实践复现
可否在蓝桥ROS中复现呢?试一试吧: 首先需要下载已经打包的案例: 需要修改源码使用wget下载到code文件夹: 使用其中的turtlesim包: 需要修改CMakelist和添加move.cpp 1☞move #include "ros/ros.h" #include "turtlesim/Pose.h" #include "geometry_msgs/Twist.h" #include "math.h" #include <sstream> ros::Subscriber sub
zhangrelay
2022/04/29
3150
ROS机器人从起点到终点(四)蓝桥云实践复现
蓝桥ROS之f1tenth案例学习与调试(成功)
失败案例: 蓝桥ROS之f1tenth案例学习与调试(失败) ---- 其实这个版本是适用于kinetic/melodic/noetic 为何失败呢? 需要将kinetic功能包全部更新到20210503版本!!! 然后编译就一切ok! shiyanlou:f1tenth/ (master*) $ catkin_make [15:07:45] Base path: /home/shiyanlou/Code/f1tenth Source space: /
zhangrelay
2022/05/10
2070
蓝桥ROS之f1tenth案例学习与调试(成功)
ROS Beginner(长文预警!
参考网站:http://wiki.ros.org/cn/ROS/Tutorials
From Zero
2021/12/07
1K0
【C++】ROS:ROS1环境配置与基础示例
官网:https://www.ros.org/ 中文wiki:http://wiki.ros.org/cn ubuntu安装ros:http://wiki.ros.org/cn/melodic/Installation/Ubuntu
DevFrank
2024/07/24
1.3K0
【C++】ROS:ROS1环境配置与基础示例
ROS学习记录②:Topic通讯和代码练习
Node间进行通讯,其中发送消息的一方,ROS将其定义为 Publisher(发布者) ,将接收消息的一方定义为 Subscriber(订阅者) 。
小黑鸭
2020/11/24
2K0
(二)ROS系统架构及概念 ROS Architecture and Concepts 以Kinetic为主更新 附课件PPT
第2章 ROS系统架构及概念 ROS Architecture and Concepts
zhangrelay
2019/01/23
1.4K0
FFmpeg开发环境构建
本文主要讲述linux平台x86(及x86-64)架构下的ffmpeg编译安装过程。 其他嵌入式平台需要交叉编译,过程类似,不详述。 本实验在opensuse和ubuntu两个平台作了验证。使用lsb_release -a命令查看系统发行版版本: opensuse平台版本:openSUSE Leap 42.3。 ubuntu平台版本:Ubuntu 16.04.5 LTS。
叶余
2019/04/02
4.7K1
机器人程序设计课程配套系统镜像使用说明( Ubuntu 14.04.5 + ROS indigo )
本镜像主要针对机器人程序设计本科课程,供学生课程学习与实践操作使用,基于ROS爱好者和学生使用的反馈意见对之前发布的版本进行修正和补充,在此致谢。更新日期为:2017.03.17,ROS学习推荐网址如下:
zhangrelay
2019/01/23
9930
【机器人】ROS1程序运行指北:启动、重命名、launch
本系列用时7天,博主也是从零开始,尽力去写的,如果发现了错误一定要私信告诉我呀。这么努力的博主,关注一下吧。
杨丝儿
2022/02/28
1.3K0
【机器人】ROS1程序运行指北:启动、重命名、launch
ROS机器人编程:原理与应用(A Systematic Approach to Learning Robot Programming with ROS 中文译版)
(A Systematic Approach to Learning Robot Programming with ROS)
zhangrelay
2022/04/29
1.3K0
ROS机器人编程:原理与应用(A Systematic Approach to Learning Robot Programming with ROS 中文译版)
推荐阅读
相关推荐
ROS入门篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档