IO流之字符流实战

IO流(一)字符流

  • 一、IO流是什么?
  • 二、File类
  • 三、引入IO流
  • 四、代码演示
    • 例题:通过java程序完成文件的复制操作
      • 从文件中读取数据(一个一个读)
      • 向文件中写入数据(一个一个写)
      • 利用缓冲数组读取
      • 利用缓冲数组输出
      • 利用FileReader,FileWriter进行文件复制
        • 正片开始!!!
    • 五、使用IO流建议
  • 总结


一、IO流是什么?

我们在初学Java的时候通常都使用控制台达成需求,但是我们写入的数据的作用域只存在于控制台,数据随着程序执行完毕就消失了,等下一次再运行程序的时候需要重新写入数据,IO流的作用可以将程序中的数据永久的保存到一个数据源中。

二、File类

File类:封装文件/目录的各种信息,对目录/文件进行操作,但是我们 不可以获取到文件/目录中的内容。
File类就是上文提到的数据源,因为我们刚开始使用IO流通常都会将数据写到一个记事本文件里,
File就是将这个文件封装到File中再用IO流进行操作,一下是File的实例化以及一些方法,不过多演示,有兴趣的话可以将代码复制到IDEA中去感受一下。

public static void main(String[] args) {
        //将目录封装为File类的对象:
        File f = new File("D:\\IDEA_workspace");
        System.out.println("文件是否可读:"+f.canRead());
        System.out.println("文件是否可写:"+f.canWrite());
        System.out.println("文件的名字:"+f.getName());
        System.out.println("上级目录:"+f.getParent());
        System.out.println("是否是一个目录:"+f.isDirectory());
        System.out.println("是否是一个文件:"+f.isFile());
        System.out.println("是否隐藏:"+f.isHidden());
        System.out.println("文件的大小:"+f.length());
        System.out.println("是否存在:"+f.exists());
        System.out.println("绝对路径:"+f.getAbsolutePath());
        System.out.println("相对路径:"+f.getPath());
        System.out.println("toString:"+f.toString());

三、引入IO流

I/O : Input/Output的缩写,用于处理设备之间的数据的传输。

形象理解:IO流 当做一根 “管”
在这里插入图片描述

四、代码演示

例题:通过java程序完成文件的复制操作

从文件中读取数据(一个一个读)

public static void main(String[] args) throws IOException {
        //文件--》程序:
        //1.创建一个File类的对象
        File f = new File("d:\\Test.txt");
        //2.创建一个FileReader的流的对象,利用FileReader这个流,这个“管”连接到数据源上去
        FileReader fr = new FileReader(f);
        //3.进行操作“吸”的动作  ---》读取动作
        int n = fr.read();					//读取程序中的数据
        while(n!=-1){
            System.out.println(n);			//循环读取,打印到控制台
            n = fr.read();
        }
        //4.关闭流
        //流靠虚拟机本身没有办法帮我们关闭,此时必须程序员手动关闭:
        fr.close();
    }

向文件中写入数据(一个一个写)

public static void main(String[] args) throws IOException {
        //1.有个目标文件:
        File f = new File("d:\\demo.txt");
        //2.创建一个FileWriter的流的对象,利用这个对象,将这个“管”连接到数据源上去
        FileWriter fw = new FileWriter(f);
        //3.开始动作:输出动作:
        //一个字符一个字符的往外输出:
        String str = "hello你好";
        //因为字符串的底层逻辑是char类型数组,所以字符串可以获得到长度
        for (int i = 0 ;i < str.length();i++){			
            fw.write(str.charAt(i));
        }
        //4.关闭流:
        fw.close();
    }

利用缓冲数组读取

public static void main(String[] args) throws IOException {
        //1.创建一个File类的对象
        File f = new File("d:\\Test.txt");
        //2.创建一个FileReader的流的对象
        FileReader fr = new FileReader(f);
        //3.读取动作
        char[] ch = new char[50];//缓冲数组
        int len = fr.read(ch);//一次读取50个:返回值是这个数组的有效长度
        while(len!=-1){//如果读取动作结束后数组里有东西,也就是有效长度不是-1
        	//方式1:
           /*for (int i = 0 ;i < len;i++){
                System.out.println(ch[i]);
            }*/
            //正确方式2:将数组转为String:(建议使用)
            String str = new String(ch,0,len);
            System.out.print(str);
            len = fr.read(ch);//重新读取下一次
        }
        //4.关闭流
        fr.close();
    }

利用缓冲数组输出

public static void main(String[] args) throws IOException {
        //1.有个目标文件:
        File f = new File("d:\\demo.txt");
        //2.创建一个FileWriter的流的对象,利用这个对象,将这个“管”连接到数据源上去
        FileWriter fw = new FileWriter(f,true);
        //3.开始动作:输出动作:
        char[] ch = new char[50];
        int len = fr.read(ch);
        while(len!=-1){
            String s = new String(ch,0,len);
            fw.write(s);
            len = fr.read(ch);//继续写下一批
        }
        //4.关闭流:
        fw.close();
    }

利用FileReader,FileWriter进行文件复制

正片开始!!!

思路:边读边写

public class Test04 {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) throws IOException {
        //1.有一个源文件
        File f1 = new File("d:\\Test.txt");
        //2.有一个目标文件:
        File f2 = new File("d:\\Demo.txt");
        //3.新建一个读取的管连接到源文件上:
        FileReader fr = new FileReader(f1);
        //4.新建一个输出的管连接到目标文件上:
        FileWriter fw = new FileWriter(f2);
        //方式3:利用缓冲字符数组,将数组转为String写出。
        char[] ch = new char[50];
        int len = fr.read(ch);
        while(len!=-1){
            String s = new String(ch,0,len);
            fw.write(s);
            len = fr.read(ch);
        }
        //6.关闭流:(关闭流的时候,先开的后关!!!)
        fw.close();
        fr.close();
    }

五、使用IO流建议

文本文件:.txt、 .java、 .c、 .cpp --------------------------------------建议使用字符流操作
非文本文件:.jpg、 .mp3、 .mp4、 .doc 、 .ppt---------------------建议使用字节流操作

总结

以上就是IO流的字符流的使用,以及文本文件复制的全过程,本文重点有File类,大家如果不了解可以自行查阅资料,读取和写入的几种方法,其中使用缓冲数组提升效率,还有就是利用字符流完成文本文件的复制,主要思路是一边读取一边写入,初学者慢慢体会,欢迎各位大神指正。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

景泓达智能科技邀您参观2024第七届燕窝及天然滋补品博览会

2024第七届世界燕窝及天然滋补品博览会 2024年8月7-9日| 上海新国际博览中心 同期举办&#xff1a;第三届世界滋补产业生态大会暨交流晚宴/颁奖典礼 2024第九届酵素、益生产品博览会 2024上海国际月子健康博览会 2024上海燕博会经历了7年的发展与资源积累&#xff0c;已成为…

初始Redis关联和非关联

基础篇Redis 3.初始Redis 3.1.2.关联和非关联 传统数据库的表与表之间往往存在关联&#xff0c;例如外键&#xff1a; 而非关系型数据库不存在关联关系&#xff0c;要维护关系要么靠代码中的业务逻辑&#xff0c;要么靠数据之间的耦合&#xff1a; {id: 1,name: "张三…

UE5C++学习(四)--- SaveGame类存储和加载数据

上一篇说到使用数据表读取数据&#xff0c;如果我开始玩游戏之后&#xff0c;被怪物打了失去了一部分血量&#xff0c;这个时候我想退出游戏&#xff0c;当我再次进入的时候&#xff0c;希望仍然保持被怪物打之后的血量&#xff0c;而不是重新读取了数据表&#xff0c;这个时候…

锁的7大分类

锁 首先会了解锁的整体概念&#xff0c;了解锁究竟有哪些分类的标准。在后面的文章中会对重要的锁进行详细的介绍。 锁的7大分类 需要首先指出的是&#xff0c;这些多种多样的分类&#xff0c;是评价一个事物的多种标准&#xff0c;比如评价一个城市&#xff0c;标准有人口多…

centos 虚拟机 增加硬盘 虚拟机centos磁盘扩容

2 在centos 7 系统中挂载磁盘 2.1 查看磁盘信息 进入centos 7系统中&#xff0c;输入“# df -h”命令&#xff0c;查看磁盘信息。 这里没有写显示新增的磁盘信息。 2.2 对新加的磁盘进行分区操作 2.2.1 查看磁盘容量和分区 2.2.2 创建分区 a. 选择新增的磁盘&#xff08;这…

Spring Boot + MyBatis

一、配置依赖 <!-- MyBatis --> <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.5.3</version> </dependency> <!-- junit测试依赖 --&g…

Unity连接MySQL踩坑,问题处理记录

用的unity2021版本&#xff0c;MySQL是官方下载的最新版8.0.36. 安装MySQL时&#xff0c;过去如果安装过&#xff0c;一定要删干净&#xff0c;单纯的卸载不行&#xff0c;网上有很多教程。 MySQL安装完成后&#xff0c;将安装目录的MySql.Data.dll文件放入unity项目的Plugin…

隐语技术架构

隐语架构 产品定位 算法层 计算层 密码原语 互联互通–资源层 总结

ElasticSearch8 - 基本操作

前言 本文记录 ES 的一些基本操作&#xff0c;就是对官方文档的一些整理&#xff0c;按自己的习惯重新排版&#xff0c;凑合着看。官方的更详细&#xff0c;建议看官方的。 下文以 books 为索引名举例。 新增 添加单个文档 (没有索引会自动创建) POST books/_doc {"n…

Saltstack 最大打开文件数问题之奇怪的 8192

哈喽大家好&#xff0c;我是咸鱼。 今天分享一个在压测过程中遇到的问题&#xff0c;当时排查这个问题费了我们好大的劲&#xff0c;所以我觉得有必要写一篇文章来记录一下。 问题出现 周末在进行压测的时候&#xff0c;测试和开发的同事反映压测有问题&#xff0c;请求打到…

Acwing528. 奶酪(并查集)

题目 现有一块大奶酪&#xff0c;它的高度为 h&#xff0c;它的长度和宽度我们可以认为是无限大的&#xff0c;奶酪中间有许多半径相同的球形空洞。 我们可以在这块奶酪中建立空间坐标系&#xff0c;在坐标系中&#xff0c;奶酪的下表面为 z0&#xff0c;奶酪的上表面为 zh 。…

成为创作者的第 730 天——创作纪念日

​​ 文章目录 &#x1f4e8; 官方致信&#x1f3af;我的第一篇文章&#x1f9e9; 机缘与成长 &#x1f3af; 成就&#x1f3af; 目标 &#x1f4e8; 官方致信 今天早上打开 CSDN 私信一看&#xff0c;看到了这一条消息&#xff0c;然后看了下日期。突然感慨到&#xff0c;是…

C语言笔记:预处理命令与结构体

ACM金牌带你零基础直达C语言精通-课程资料 本笔记属于船说系列课程之一&#xff0c;课程链接&#xff1a;ACM金牌带你零基础直达C语言精通https://www.bilibili.com/cheese/play/ep159068?csourceprivate_space_class_null&spm_id_from333.999.0.0 你也可以选择购买『船说…

字符驱动程序-LCD驱动开发

一、驱动程序的框架 总共分为五步&#xff1a; 1、自己设定或者系统分配一个主设备号 2、创建一个file_operations结构体 这个结构体中有操作硬件的函数&#xff0c;比如drv_open、drv_read 3、写一个注册设备驱动函数 需要register_chrdev(major,name,结构体)&#xff0…

文件一键加水印的软件叫什么

答&#xff1a;文件一键加水印的软件叫“域智盾软件”。 域智盾作为一款专为企业内网信息安全保驾护航的领先软件&#xff0c;以其卓越的文件加密技术和自动添加水印功能为核心亮点&#xff0c;为企业提供了强大的数据安全保障和严谨的内部信息追踪机制。 【文件加密功能】 高…

C语言数据结构易错知识点(4)(二叉树、分治思想)

1.二叉树的特点&#xff1a;和顺序表、链表有所差异的是&#xff0c;二叉树并不主要用于存储数据&#xff0c;它多用于数据的筛选、处理等操作。二叉树内核是分治思想&#xff0c;对递归运用的要求很高&#xff0c;这在二叉树的各种接口的实现上我们都能有所体会。 2.最小子问…

Linux系统 安装docker

安装&#xff1a; 1、Docker要求CentOS系统的内核版本高于 3.10 &#xff0c;通过 uname -r 命令查看你当前的内核版本是否支持安账docker 2、更新yum包&#xff1a; sudo yum -y update 3、安装需要的软件包&#xff0c;yum-util 提供yum-config-manager功能&#xff0c;另外…

Excel双击单元格后弹窗输入日期

Step1. 在VBE界面新建一个窗体(Userform1),在窗体的工具箱的空白处右键,选中添加附件,勾选Calendar control 8.0,即可完成日历的添加。 PS:遗憾的是, Office 64 位没有官方的日期选择器控件。唯一的解决方案是使用Excel 的第三方日历。 参考链接:How to insert calen…

多图回顾|MoonBit 首场线下 MeetUp 回顾

3 月 23 日&#xff0c;MoonBit 首场线下 MeetUp 活动在深圳顺利举办。 在首场 MoonBit 线下 MeetUp 活动中&#xff0c;五位行业内的知名专家带来了四个以探索国产基础软件新发展为主题的精彩内容分享&#xff01; 一起来看看嘉宾们带来了哪些行业内的最新思考吧&#xff01; …

推荐一种Bean注入方式——开发经验

我们都知道三种Bean注入的方式分别是属性注入&#xff0c;setter方法注入&#xff0c;构造器注入。这三种Bean注入的方式各有优缺点&#xff0c;但是相对来说更推荐使用构造器注入的方式。 1、构造器注入的优缺点 优点&#xff1a; 1、可以注入不可变对象 因为构造方法注入是…