Java文件字符流和字节流中的实战

news2024/11/13 11:44:48

文件输入输出流

  • 文件内容操作与实战
    • 字符流
      • Reader
      • Writer
    • 字节流
      • inputStream
      • OutputStream
      • 实战💪

文件内容操作与实战

文件的分类上一篇文章(文件对象处理)已经和大家讲解过了。本章主要文件主要针对于对文件内容的操作展开讲解,文件分为:文本文件二进制文件,不同的文件,操作方法也不尽相同。

针对文本文件,Java提供了一组类——”字符流“,代表类(Reader,Writer)。同样的,Java也为二进制文件提供了一组操作类——”字节流“,代表类(InputStream,OutputStream)。其实这两种的对文件操作原理是相同的,只是针对的文件不同,所以才有了字符流和字节流之分。因为有了字节流与字符流之分,所以相对应的,字节流最低读写字符是”一个字节“,字符流也有对应限制,字符流最低读写”一个字符 “。

这种读写操作一般也统称为IO流。IO操作是在CPU上进行的,以CPU来看待数据的输入和输出。

字符流

输入流:Reader

输出流:Writer

注意:使用完文件资源后应该关闭文件资源

Reader

创建对象及使用:

在这里插入图片描述

在这里插入图片描述

public static void main(String[] args) throws IOException {//创建一个字符流操作对象
    try(Reader reader = new FileReader("d:/hello.txt")){
        while (true) {
            //每次读取一个字符
            int read = reader.read();
            if(read == -1){
                break;
            }
            System.out.print((char)read+" ");
        }
    }
}

在这里插入图片描述

Writer

字符流写入对象的创建及使用:

在这里插入图片描述

在这里插入图片描述

同样的需要使用子类来构造

public static void main(String[] args) throws IOException {
    try(Writer writer = new FileWriter("d:/hello.txt")){
        writer.write("我爱敲代码");
    }
}

在这里插入图片描述

文件使用完,需要进行关闭操作,防止不必要的意外发生。文件的资源泄漏问题不会立即出现,而是一段时间才会出现明显问题。

字节流

输入流:inputStream

输入流:OutputStream

注意:使用完文件资源后应该关闭文件资源

inputStream

构造inputStream对象

在这里插入图片描述

因为这个类是一个抽象方法,在构造时,不能直接使用类名去调用。这里使用子类FileInputStream来构造对象。

public static void main(String[] args) throws IOException {
    //相当于打开一个文件,将这个变量与文件关联
    InputStream inputStream = new FileInputStream("d:/hello.txt");

    inputStream.close();
    //每次使用完文件,必须关闭,防止不必要的资源浪费
}

有时候因为中途return或者结束了进程会不可避免地无法将文件关闭,所以这里使用try/catch/finally语句来进行关闭文件资源操作。

改写代码:

public static void main(String[] args) throws IOException {
    //方案一 
     InputStream inputStream = null;
     try {
         //打开文件
     	inputStream = new FileInputStream("d:/hello.txt");
     }finally {
         //关闭文件
     	inputStream.close();
     }
    
    //方案二,会自动执行close关闭操作
    try(InputStream inputStream = new FileInputStream("d:/hello.txt")){
            
        }
}   

解决了构造函数接下来我们将继续来实现读写操作。

读操作

在这里插入图片描述

可以看见有三个方法可以进行读操作,接下来我们一一测试read()方法的作用。

//read()相当于把字节变成二进制进行表示
public static void main(String[] args) throws IOException {
    try(InputStream inputStream = new FileInputStream("d:/hello.txt")){
        while (true){
            int input = inputStream.read();
            //遇到-1则表示没有数据,退出循环
            if(input == -1){
                break;
            }
            System.out.println(input);
        }
    }
}

在这里插入图片描述

三个方法使用的操作基本一致,都是读到末尾时返回-1,另外两个方法可以指定读取大小。返回的是总字节数,不是二进制数据

OutputStream

构造inputStream对象

在这里插入图片描述

同样的,这个也是一个抽象类,需要调用子类仿佛来创建对象:

在这里插入图片描述

//创建对象及使用方法
//将hello写入文件
public static void main(String[] args) throws IOException {
    try(OutputStream outputStream = new FileOutputStream("d:/hello.txt")){
        byte[] bytes = {'h','e','l','l','o'};
        outputStream.write(bytes);

    }
}

在这里插入图片描述

实战💪

遍历目录,对文件进行查找或者删除

1.将输入目录进行遍历

2.每次找到一个文件就获取目录

3.对比文件名与输入的文件名是否一致

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class FindAndDelete {
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要查找的目录:");
        File fileDir = new File(scanner.next());
        if(!fileDir.isDirectory()){
            System.out.println("您输入的不是目录!");
            return;
        }
        System.out.println("请输入要查找的文件名");
        String file = scanner.next();
        //递归目录/文件的操作
        scanDir(fileDir,file);
    }

    private static void scanDir(File fileDir, String file) throws IOException {
        File[] files = fileDir.listFiles();
        if(files == null){
            //当前目录为空
            return;
        }
        for(File f:files){
//            System.out.println("当前搜索到"+f.getCanonicalPath());
            if(f.isFile()){
                String filename = f.getName();
                if(filename.equals(file)){
                    System.out.println(f.getCanonicalPath()+"存在该文件");
                }
            }else if(f.isDirectory()){
                scanDir(f,file);
            }else {
                continue;
            }
        }
    }
}

遍历目录,查找文件中的内容与指定内容一致并输出文件目录,类似于文件检索

1.先去简单递归遍历目录

2.每次找到一个文件并获取目录

3.在判定的查询的词中,是否存在上述内容

public class FindTargetDoc {
    public static void main(String[] args) throws IOException {
        //1.先让用户输入需要搜索文件的根目录
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入一个目录:");
        File fileDir = new File(scanner.next());
        //判断输入的是否为目录
        if(!fileDir.isDirectory()){
            System.out.println("输入错误,你输入的目录不存在");
        }
        //2.获取用户需要查询的词
        System.out.println("请输入要查询的词");
        String word = scanner.next();
        
        //3.递归进行目录/文件的操作
        scanDir(fileDir,word);
        
    }

    private static void scanDir(File fileDir, String word) throws IOException {
        //列出当前FileDir的内容
        File[] files = fileDir.listFiles();
        if(files == null){
            //当前目录是空
            return;
        }
        for (File f:files) {
            if(f.isFile()){
                //判断是否为文件
                String content = readFile(f);
                if(content.contains(word)){
                    System.out.println(f.getCanonicalPath()+"包含查找的文件");
                }
            }else if(f.isDirectory()) {
                //判断是否为目录
                scanDir(f,word);
            }else {
                //不是普通文件也不是目录文件
                continue;
            }
        }
    }

    private static String readFile(File f) throws IOException{
        //读取整个内容,返回
        //处理是字符流,所以使用字符流进行处理
        StringBuilder stringBuilder = new StringBuilder();
        try(Reader reader = new FileReader(f)){
            //将读取的字符拼接到StringBuilder上
            while (true){
                int ch = reader.read();
                if(ch == -1){
                    break;
                }
                stringBuilder.append((char)ch);
            }
        }
        return stringBuilder.toString();
    }
}

进行普通文件的复制操作

1.需要准备两个文件

2.一个有内容,一个无内容

3.一个读一个写,将其读完存储在另一个文档中即可

public class CopyFile {
    public static void main(String[] args) throws IOException {
        //这里可以输入,读者可以自行更改
        File source = new File("d:/aaa/hello.txt");
        File dest = new File("d:/aaa/world.txt");

        if(!source.exists() || !dest.exists()){
            System.out.println("文件不存在");
        }
        Reader reader = new FileReader(source);
        Writer writer = new FileWriter(dest);
        StringBuilder stringBuilder = new StringBuilder();
        while (true){
            int ch = reader.read();
            if(ch == -1){
                break;
            }
            stringBuilder.append((char)ch);
        }
        writer.write(stringBuilder.toString());
        reader.close();//记得关闭资源
        writer.close();
    }
}

以上就是关于我们文件内容的操作及实战,感谢阅读(〃 ̄︶ ̄)人( ̄︶ ̄〃)

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

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

相关文章

【golang学习笔记】——(一)安装golang

当前为了方便后续的编译和使用,在windows下进行go的安装。 一、msi安装 官网下载地址:https://golang.google.cn/ 进入Download选择Windows的msi文件下载即可 下载后进行默认或者自定义安装即可,golang无特殊配置,可按照默认安装…

算法篇——二叉树大集合上篇(js版)

222.完全二叉树的节点个数 给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在…

AutoGPT的出现,会让程序员失业吗?

最近,一个叫AutoGPT的模型火了,在GitHub上线数周Star数就直线飙升。截至目前,AutoGPT的Star数已经达到87k,马上接近90k,超过了PyTorch的65k。 根据AutoGPT的命名,就可以发现其神奇之处在于“auto”&#x…

从申请到调用:全国快递物流查询 API 使用教程

引言 面对越来越多的快递需求和快递公司的日益增多,手动查询快递状态的工作变得愈发繁琐。此时,一个全国快递物流查询 API 的出现能够极大地提高查询的效率和准确性,解决人工查询的问题,为用户提供更加便捷的服务体验。全国快递物…

ASEMI代理ADG1408YRUZ-REEL7原装ADI车规级ADG1408YRUZ-REEL7

编辑:ll ASEMI代理ADG1408YRUZ-REEL7原装ADI车规级ADG1408YRUZ-REEL7 型号:ADG1408YRUZ-REEL7 品牌:ADI /亚德诺 封装:TSSOP-16 批号:2023 安装类型:表面贴装型 引脚数量:16 类型&#…

tftp+Filezilla文件双向传输(1)-centos(VMware)-win10(host)

目录 1.下载安装vsftpdtftptftp-server 2.配置服务 2.1 配置服务 修改文件 /etc/vsftpd.conf 2.2 配置服务 守护进程 /etc/xinetd.d/tftp 2.3 配置服务 tftp服务器 2.4 配置登录用户 2.4.1 修改selinux 2.4.2 匿名用户登录 2.4.3 新建账户,不能登陆系…

使用API Monitor巧妙探测C++程序中监听2620端口的模块

目录 1、问题说明 2、API Monitor工具介绍 2.1、API Monitor主要用途 2.2、如何使用API Monitor工具 3、使用API Monitor监测程序对bind函数的调用,定位启用2620端口的模块 3.1、为啥要监控socket API函数bind 3.2、编写演示代码进行说明 3.3、使用API Moni…

[SpringBoot框架]如何使用SpringBoot框架

SpringBoot框架的好处 如果不使用SpringBoot框架创建工程,而是创建一个Maven空工程,,在工程里面引入其它框架的时候,比如SSM,需要在pom.xml配置文件中添加框架相关的依赖,并且个别的框架还需要配置文件,在配…

nodejs+vue+elementui钢琴乐器培训课程报名管理系统

1绪论 5 1.1项目研究的背景 5 1.2开发意义 5 1.3项目研究内容 5 2开发技术介绍 6 2.1 B/S架构 6 前端技术:nodejsvueelementui,视图层其实质就是vue页面,通过编写vue页面从而展示在浏览器中,编写完成的vue页面要能够和控制器类进行交互&…

TCP协议在IM场景中涉及核心问题以及解决方案梳理

1. TCP协议是一种可靠的协议,但是在实际应用中,仍然需要应用程序来处理一些细节,以确保数据能够按照预期的方式传输。一些业务可能需要在TCP层面之上实现自己的可靠性机制,例如在应用层实现消息确认机制,以确保每个消息…

Seata强一致性事务模式XA的设计理念

承接上文分布式事务Seata-AT模式 XA规范是什么? 是分布式事务处理DTP(Distributed Transaction Processing)的标准。是描述全局的事务管理器和局部的资源管理器之间的接口规范。允许多个资源(如数据库、应用服务、消息队列)在同…

WPF教程(七)--依赖属性(3)--附加属性

一、 只读依赖属性 以前在对于非WPF的功能来说,对于类的属性的封装中,经常会对那些希望暴露给外界只读操作的字段封装成只读属性,同样在WPF中也提供了只读属性的概念,如一些 WPF控件的依赖属性是只读的,它们经常用于报…

jsp+springboot基于ssm的人才招聘求职网站推荐模拟考试系统java idea

登录需要随机数字验证码 管理员: 招聘管理 求职信息管理 , 招聘信息管理 人员管理 管理注册的用户进行审核操作 公告管理 发布公告新闻 (公告我想不到啥意思,可修改或增加别的) 个人信息 修改个人信息 招聘者&am…

【沐风老师】3dMax填充地形网格插件使用方法详解

3dMax填充地形网格插件使用方法 3dMax填充地形网格插件,它从等高线或现有网格创建和优化地形曲面。基于四边形的输出允许更容易的后期重构,例如使用推/拉绘制。常规的面大小可以减少渲染问题(GI、置换),并且可以在其上…

如何实现Windows RDP 远程桌面异地跨网连接

Windows RDP远程桌面的应用非常广泛。远程桌面协议(RDP)是一个多通道(multi-channel)的协议,让使用者(所在计算机称为用户端或本地计算机)连上提供微软终端机服务的计算机(称为服务端或远程计算机)。大部分的Windows版本都有用户端所需软件,有些其他操作…

【LeetCode】剑指 Offer 65. 不用加减乘除做加法 p310 -- Java Version

题目链接:https://leetcode.cn/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof/ 1. 题目介绍(65. 不用加减乘除做加法) 写一个函数,求两个整数之和,要求在函数体内不得使用 “”、“-”、“*”、“/” 四则运算…

C语言入门篇——输入输出篇

目录 1、printf()函数 1.1、printf()函数中的标记 1.2、输出最小宽度(width) 1.3、精度(.precision) 2、scanf()函数 2.1、scanf(“输入控制符”, 输入参数) 2.2、scanf(“输入控制符非输入控制符”, 输入参数); 2.3、字符…

docker简单教程(二)启动服务,实现简单的网站

docker简单教程(二)启动服务 文章目录 docker简单教程(二)启动服务1:创建index.html2:创建Dockerfile3:构建4:启动5:访问6:下一篇将介绍一些常用的操作 这篇我…

Ae 脚本:TypeMonkey 动态文本动画

使用 TypeMonkey 脚本可以快速生成带有摄像机动画的动态文本 Kinetic text效果,简单快捷,无需繁琐的关键帧控制。 经典网络案例:倒鸭子 ◆ ◆ ◆ 使用方法 一般操作流程 新建合成,并确定好合成的持续时间。或者,设置…

句子改写神器-文案自动改写的免费软件

AI改写软件:让你的写作更加轻松高效 现代社会中,写作已经成为了我们各行各业必不可少的一部分。无论是文章、报道、论文还是其他各类文本,都需要花费大量的时间和精力来撰写。而且,在写作过程当中,我们还需要进行反复…