Java中操作文件(二)

news2024/11/23 23:02:18

目录

一、什么是数据流

二、InputStream概述

2.1、方法

2.2、说明

三、FileInputStream概述

3.1、构造方法 

3.2、利用Scanner进行字符串读取,简化操作 

四、OutputStream概述  

4.1、方法 

4.2、PrinterWriter简化写操作

五、小程序练习 

示例1 

示例2 


一、什么是数据流

 对照我们的现实生活,可以想象成流水。

流的输入(读)和流的输出(写),针对于内存来说的,从设备包括硬盘,网卡的数据进入内存叫输入(Input),从内存把数据写到硬盘,网卡叫输出(Output) 。

Java中针对input和Output提供了两个抽象类

  1. InputStream输入流,从文件中把数据读取到内存。
  2. OutputStream输出流,把数据从内存输出到文件。 

 

二、InputStream概述

2.1、方法

修饰符以及返回值类型方法签名说明
int read()读取一个字节的数据,返回-1代表已经完全读完了.
intread(byte[] b)最多读取b.length自己的数据到b中,返回实际读到的数量;-1代表已经读完了.
intread(byte[] b,int off,int len)最多读取len-off字节的数据到b中,放在off开始,返回实际读到的数量;-1代表已经读完了.
voidclose()关闭字节流

2.2、说明

InputStream只是一个抽象类,要使用还是需要具体的实现类。关于InputStream的实现类有很多,基本可以认为不同的输入设备都可以对应一个InputStream类,本篇博客只讲从文件中读取,所以使用FileInputStream

三、FileInputStream概述

3.1、构造方法 

签名说明
FileInputStream(File file)利用File对象构造文件输入流
FileInputStream(String name)利用文件路径构造文件输入流

 示例1 


import java.io.FileInputStream;
import java.io.IOException;

/**
 * 创建一个输入流读取文件内容
 */
public class Exe_01 {
    public static void main(String[] args) throws IOException {
        FileInputStream inputStream=new FileInputStream("C:/Temp/Hello.txt");
        //创建一个byte数组,来接收每次读取的内容,扩大缓冲区的容量
        byte[] bytes=new byte[1024];
        //循环读取
        while(true){
            //获取每次读取的长度
            int len=inputStream.read(bytes);
            //如果等于-1,就说明读完了
            if(len==-1){
                break;
            }
            //打印读取的内容
            for (int i = 0; i < len; i++) {
                System.out.print(bytes[i]+",");
            }
        }
        //关闭数据流
        inputStream.close();
    }
}

3.2、利用Scanner进行字符串读取,简化操作 

上述例子中,我们看到了对字符类型直接使用 InputStream 进行读取是非常麻烦且困难的,所以,我们使用一种我们之前比较熟悉的类来完成该工作,就是 Scanner 类 。

示例2 


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

public class Exe_05 {
    public static void main(String[] args) throws IOException {
        //创建一个流
        FileInputStream inputStream=new FileInputStream("C:/Temp/基尼太美.txt");
        //使用Scanner简化操作
        Scanner sc=new Scanner(inputStream,"UTF-8");
        //循环读取
        while(true){
            //判断
            if(!sc.hasNextLine()){
                break;
            }
            String str=sc.nextLine();
            System.out.println(str);
        }
        sc.close();
        inputStream.close();
    }
}

四、OutputStream概述  

4.1、方法 

修饰符及返回值类型方法签名说明
voidwrite(int b)写入要给字节的数据
void write(byte[] b)将b这个字符数组中的数据全部写道os中
int write(byte[] b,int off,int len)将b这个字符数组从off开始的数据写到os中,一共写len个
voidclose()关闭字节流
void flush()重要:I/O的速度是很慢的,所以,大多的OutputStream为了减少设备操作的次数,在写数据的时候都会将数据先暂时的写入到内存的一个指定区域里面,知道该区域满了或者其它指定条件时才真正的将数据写入到设备中,这个区域就叫缓冲区。但这样会造成一个结果,就是我们写的数据很有可能一部分留在缓冲区中。所以需要在最后或者合适的位置,调用flush(刷新)操作,将数据刷到设备中。

说明

OutputStream同样只是一个抽象类,要使用还需要具体的实现类。跟上述一样本篇博客只讲从文件中读取,所以使用FileOutputStream

示例3


import java.io.FileOutputStream;
import java.io.IOException;

public class Exe_02 {
    public static void main(String[] args) throws IOException {
        //创建一个输出流
        FileOutputStream outputStream=new FileOutputStream("C:/Temp/基尼太美.txt");
        //在文件中写入一些内容
        outputStream.write(189);
        outputStream.write(188);
        outputStream.write(187);
        outputStream.write(186);
        //刷新一下缓冲区
        outputStream.flush();
        //关闭流
        outputStream.close();
    }
}

运行结果 

 

import java.io.FileInputStream;
import java.io.IOException;

public class Exe_03 {
    public static void main(String[] args) throws IOException {
        FileInputStream inputStream=new FileInputStream("C:/Temp/基尼太美.txt");
        while(true){
            int data=inputStream.read();
            if(data==-1){
                //返回-1,读取结束
                break;
            }
            System.out.println(data);
        }
        //关闭流
        inputStream.close();
    }
}

示例4


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

/**
 * 基于字符的输出流
 */
public class Exe_04 {
    public static void main(String[] args) throws IOException {
        FileWriter fileWriter=new FileWriter("C:/Temp/基尼太美.txt");
        fileWriter.write("Cause I got a crush on you who you");
        //换行符需要手动添加
        fileWriter.write("\n");
        fileWriter.write("你是我的我是你的谁");
        fileWriter.write("\n");
        fileWriter.write("再多一眼看一眼就会爆炸");
        fileWriter.write("\n");
        fileWriter.write("再近一点靠近点快被融化");
        //清空缓冲区
        fileWriter.flush();
        //关闭流
        fileWriter.close();
    }
}

4.2、PrinterWriter简化写操作

示例5 


import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;

/**
 *PrinterWriter简化写操作
 */
public class Exe_06 {
    public static void main(String[] args) throws IOException {
        //创建一个输出流
        FileOutputStream outputStream=new FileOutputStream("C:/Temp/基尼太美.txt");
        //根据输出流,创建一个PrinterWriter
        PrintWriter printWriter=new PrintWriter(outputStream);
        //写数据,自带换行符
        printWriter.println("Cause I got a crush on you who you");
        printWriter.println("再近一点靠近点快被融化");
        printWriter.println("再多一眼看一眼就会爆炸");
        printWriter.println("你是我的我是你的谁");
        //关闭流
        printWriter.close();
        outputStream.close();
    }
}

 

五、小程序练习 

示例1 

扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件 。


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

public class Exe_07 {
    public static void main(String[] args) throws IOException {
        //让用户输入一个路径
        System.out.println("请输入一个文件路径");
        Scanner sc=new Scanner(System.in);
        //获取路径字符串
        String rootPath=sc.nextLine();
        //根据字符串创建一个File对象
        File rootFile=new File(rootPath);
        //判断路径是否有效
        if(!rootFile.exists()){
            System.out.println("对不起,您输入的路径是无效路径!!!");
            return;
        }
        //判断是不是一个有效目录
        if(!rootFile.isDirectory()){
            System.out.println("对不起,你输入的路径不是一个有效目录");
            return;
        }
        //让用户输入一个要找的关键字
        System.out.println("请输入你要删除的关键字");
        String keyWords=sc.nextLine();
        //判断输入是否为空
        if(keyWords==null){
            System.out.println("关键字不能为空");
            return;
        }
        //扫描文件
        scan(rootFile,keyWords);
    }

    private static void scan(File rootFile, String keyWords) throws IOException {
        //先获取root目录下的所有子文件以及目录
        File[] files=rootFile.listFiles();
        //判断数据是否为空
        if(files==null||files.length==0){
            //不做任何操作
            return;
        }
        //遍历数组检查操作
        for (File item:files) {
            //检查file对象是否是文件还是目录
            if(item.isFile()){
                //检查文件名是否包含关键字
                String fileName=item.getName();
                if(fileName.contains(keyWords)){
                    //找到了,询问用户是否需要删除文件
                    System.out.println("找到了"+item.getCanonicalFile()+",包含关键字"+keyWords+",是否删除文件(Y/N)?");
                    //接收用户请求
                    Scanner scanner=new Scanner(System.in);
                    String result=scanner.nextLine();
                    //处理操作
                    if(result.toLowerCase().equals("y")){
                        //删除文件
                        item.delete();
                        System.out.println("删除文件"+item.getCanonicalFile()+"成功!!!");
                    }else{
                        return;
                    }
                }
            }else{
                //如果目标文件是一个目录,递归区扫描目录文件
                scan(rootFile,keyWords);
            }
        }
    }
}

示例2 

普通文件的复制


import java.io.*;
import java.util.Scanner;

public class Exe_08 {
    public static void main(String[] args) {
        //让用户输入一个路径
        System.out.println("请输入源文件路径");
        Scanner sc=new Scanner(System.in);
        //获取路径字符串
        String sourcePath=sc.nextLine();
        //根据字符串创建一个File对象
        File sourceFile=new File(sourcePath);
        //判断文件是否有效
        if(!sourceFile.exists()){
            System.out.println("源文件无效,请重新输入!!");
            return;
        }
        //获取目标输入的目标文件路径
        System.out.println("请输入要复制到的目标文件路径");
        String targetPath=sc.nextLine();
        // 根据目标路径创建File对象
        File targetFile=new File(targetPath);
        // 判断目标路径是否有效
        if (targetFile.exists()) {
            System.out.println("目标文件已存在,请重新输入.");
            return;
        }
        // 判断目标文件的父目录必须存在
        if(!targetFile.getParentFile().exists()){
            System.out.println("目标文件的目录不正确");
            return;
        }
        //创建输入输出流
        try {
            InputStream inputStream=new FileInputStream(sourceFile);
            OutputStream outputStream=new FileOutputStream(targetFile);
            //读取源文件内容
            byte[] bytes=new byte[1024];
            while(true){
                //获取读取的长度和内容
                int len = inputStream.read(bytes);
                if(len==-1){
                    break;
                }
                //把读取的文件写入目标文件中,从0~len
                outputStream.write(bytes, 0, len);
            }
            //刷新缓冲区
            outputStream.flush();
            //打印日志
            System.out.println("复制成功"+sourceFile.getCanonicalFile()+"--->"+targetFile.getCanonicalFile());
            //关闭流
            inputStream.close();
            outputStream.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

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

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

相关文章

3D渲染的最佳CPU推荐, 目前流行的 3D 渲染 CPU

在 3D 渲染领域&#xff0c;选择合适的 CPU 对于确保最佳性能和生产力至关重要。CPU 充当渲染工作站的动力源&#xff0c;处理复杂的计算并高效执行渲染任务。市场上有众多选择&#xff0c;了解 2023 年最流行的 3D 渲染 CPU 非常重要。 AMD 锐龙 9 5950X AMD Ryzen 9 5950X …

r‘./csv‘和f‘./csv‘有啥区别

r./csv 和 f./csv 在文件路径中具有不同的含义和用途。 r./csv&#xff1a;这是使用原始字符串&#xff08;raw string&#xff09;表示法来表示文件路径。在原始字符串中&#xff0c;反斜杠字符&#xff08;\&#xff09;不会被视为转义字符&#xff0c;而是作为普通字符。因…

Linux之CentOS_7.9部署MySQL_5.7静默安装实测验证安装以及测试连接全过程实操手册

前言&#xff1a;前面记录了Windows环境的MySQL的安装卸载及相关测试评估&#xff0c;这里记录下在Linux下MySQL的静默部署方式。当然还有更多的其他部署&#xff0c;大家可根据自身环境及学习来了解。 环境&#xff1a; 1、CentOS-7.9-x86_64-DVD-2009.iso 2、MySQL-5.7.42-…

7.4 【Linux】设置开机挂载

7.4.1 开机挂载 /etc/fstab 及 /etc/mtab 根目录 / 是必须挂载的﹐而且一定要先于其它 mount point 被挂载进来。 其它 mount point 必须为已创建的目录﹐可任意指定﹐但一定要遵守必须的系统目录架构原则 &#xff08;FHS&#xff09; 所有 mount point 在同一时间之内﹐只…

Go Mutex 错过后悔的重要知识点

Go Mutex 的基本用法 Mutex 我们一般只会用到它的两个方法&#xff1a; Lock&#xff1a;获取互斥锁。(只会有一个协程可以获取到锁&#xff0c;通常用在临界区开始的地方。)Unlock: 释放互斥锁。(释放获取到的锁&#xff0c;通常用在临界区结束的地方。) Mutex 的模型可以用…

基于STM32麦克风阵列音频信号处理系统设计

v hezkz17进数字音频系统研究开发交流答疑 附录: ADAU1452音频处理系统

飞行动力学 - 第3节-滑翔性能、喷气式飞机最大最小速度 之 基础点摘要

飞行动力学 - 第3节-滑翔性能、喷气式飞机最大最小速度 之 基础点摘要 1. 滑翔机1.1 滑翔动力学方程1.2 滑翔机升阻比1.3 滑翔机性能 2. 喷气式飞机2.1 最小推力2.2 最大、最小速度 3. 参考资料 1. 滑翔机 1.1 滑翔动力学方程 注&#xff1a;这里的航迹角 γ \gamma γ按照右…

基于Python图像的作物种子数统计算法设计与应用(源码+文档+演示视频)

基于图像的作物种子数统计算法设计运用Qt作为开发工具&#xff0c;PyTorch库的使用&#xff0c;算法实现等。具体分为以下三部分&#xff1a;第一部分&#xff0c;采用数码影像技术对黄豆粒进行影像辨识技术。第二部分&#xff0c;前端页面功能包括图像识别技术模块、光源技术模…

音频转文字怎么弄?这几个音频转文字方法可以轻松实现

想象一下&#xff0c;你正在开车或忙着做家务&#xff0c;突然接到一通重要电话&#xff0c;却又没有纸和笔可以记录下来。这是应该怎么办呢&#xff0c;其实我们可以使用录音转文字的软件帮助我们把语音在线转换成文字就能轻松解决这个问题啦&#xff0c;但是又有小伙伴可能会…

考完PMP/NPDP认证,项目经理们最后都找到了什么样的工作?

早上好&#xff0c;我是老原。 有很多粉丝朋友都好奇&#xff0c;考完PMP/NPDP认证&#xff0c;到底能找到一份什么工作&#xff1f; 首先&#xff0c;你要知道一个问题&#xff1a;有工作的人选择考证的几率更大。 有的人是因为职场发展遇到了瓶颈期&#xff0c;想要利用考…

类与对象 (一)

引子 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间的交互完成。 什么是对象&#xff1f;…

MYSQL进阶-索引的组合索引

回城传送–》《100天精通MYSQL从入门到就业》 文章目录 一、练习题目二、SQL思路SQL进阶-索引的组合索引初始化数据解法什么是组合索引为什么要使用组合索引如何使用组合索引 答案参考&#xff1a; 一、练习题目 题目链接难度SQL进阶-索引的组合索引★★★☆☆ 二、SQL思路 …

C++初阶之类和对象(中)

类和对象&#xff08;中&#xff09; 1.类的6个默认成员函数2. 构造函数2.1 概念2.2 特性 3.析构函数3.1 概念3.2 特性 4. 拷贝构造函数4.1 概念4.2 特征 5 运算符重载5.1 运算符重载5.2 赋值运算符重载5.3 前置和后置重载 6.日期类的实现7.const成员8.取地址及const取地址操作…

Markdown 进阶语法:Mermaid 绘图 (一) - 流程图 (Flowchart)

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

【Linux】手写一个简易命令行解释器

文章目录 1. 了解命令行解释器1.1 命令行解释器是什么&#xff1f;1.2 我们为什么要尝试手写一个命令行解释器&#xff1f; 2. 命令行解释器的实现2.1 打印提示符2.2 获取用户输入2.3 创建子进程并进行进程程序替换2.4 内建命令 1. 了解命令行解释器 1.1 命令行解释器是什么&a…

TiDB-亿级订单数据亚秒响应查询方案

TiDB-亿级订单数据亚秒响应查询方案 TiDB宣传片 1. 什么是TiDB TiDB 是一个分布式 NewSQL 数据库&#xff0c;它支持水平弹性扩展、ACID 事务、标准 SQL、MySQL 语法和 MySQL 协议&#xff0c;具有数据强一致的高可用特性&#xff0c;是一个不仅适合 OLTP 场景还适合 OLAP 场景…

完全背包问题(二维数组 / 一维数组实现)

完全背包 完全背包的一维和二维dp数组 有 N 件物品和容量为 W 的背包&#xff0c;第 i 件物品的重量是 weight[i]&#xff0c;价值是 value[i] 每件物品都有无限个&#xff0c;即同一物品能够放入背包多次&#xff0c;求背包所能装入物品的最大价值总和 完全背包和 0-1 背包不…

小白到运维工程师自学之路 第四十六集 (mongodb复制集)

一、概述 1、 MongoDB复制集&#xff08;MongoDB Replica Set&#xff09;是MongoDB提供的一种高可用性和数据冗余的解决方案。它由多个MongoDB实例组成&#xff0c;其中一个作为主节点&#xff08;Primary&#xff09;&#xff0c;其他节点则扮演从节点&#xff08;Secondary&…

使用finalshell连接Linux服务器出现的问题

第一次使用finalshell远程连接Linux服务器的过程、遇到的问题及解决方案 首先建立连接 ![在这里插入图片描述](https://img-blog.csdnimg.cn/d8836dcd8a224bf093ebdac031f763d5.png 然后问题来了 出现以下问题&#xff1a; java.net.ConnectException: Connection refused:…

地下污水厂配电能效管理平台设计

安科瑞电气股份有限公司 上海嘉定 201800 摘要&#xff1a;结合某地下污水厂项目&#xff0c;从结构、系统组成、系统功能、控制要求、场景模 式等方面介绍了地下污水厂智能照明控制系统&#xff0c;探索了一套适用于地下污水厂的智能照明控制策略&#xff0c;以确保地下污水…