(Java学习)File类与IO流

File类与IO流

文章目录

  • File类与IO流
    • 1. File类
      • 1.1 File类理解
      • 1.2 构造器
      • 1.3 常用方法
      • 1.4 练习
    • 2. IO流概述
      • 2.1 IO流理解
      • 2.2 流的分类
      • 2.3 基础IO流的框架
    • 3. FileReader/FileWriter
      • 3.1 执行步骤
      • 3.2 注意
    • 4. FileInputStream / FileOutputStream
    • 5. 缓冲流
    • 6. 转换流的使用
    • 7. 对象流的使用
    • 8. 其它流

1. File类

1.1 File类理解

  • File类位于java.io包下
  • File类对象,对应操作系统下一个文件或一个文件夹(目录)
  • 文件内容的读写——使用IO流

1.2 构造器

package file.fileTest;import org.junit.Test;
import java.io.File;public class FileTest {@Testpublic void test1(){//1. public File(String pathname)File file1 = new File("E:\\Java\\JavaU\\JavaSE\\src\\file\\file_exer\\hello.txt");File file2 = new File("abc");System.out.println(file2.getAbsolutePath());}@Testpublic void test2(){//2. public File(String parent, String child)//参数一:一定是一个文件目录//参数二:可以是文件目录,可以是文件File file1 = new File("E:\\Java\\JavaU\\JavaSE\\src\\file\\file_exer","abc_txt");File file2 = new File("abc","abc0");//3. public File(File parent, String child)//参数一:一定是一个文件目录//参数二:可以是文件目录,可以是文件File file3 = new File(file2,"abc1");}
}

1.3 常用方法

  • 列出目录的下一级

    	//列出目录的下一级	@Testpublic void test1(){File file = new File("E:\\Java_learning\\JavaSE");//String[] list()返回的是相对路径String[] list = file.list();for(String s : list){System.out.print(s+" ");}System.out.println();//File[] listFiles()返回的是绝对路径File[] files = file.listFiles();for(File f : files){System.out.println(f);}}
    
  • File类重命名

    public boolean renameTo(File dest)
    -- file1.renameTo(file2):file1必须存在,file2必须不存在,且file2所在文件目录需存在
    
  • 判断功能方法

    -- public boolean exists():File表示的文件或目录是否实际存在
    -- public boolean isDirectory():File表示的是否是目录
    -- public boolean isFile():File表示的是否是文件
    -- public boolean canRead()
    -- public boolean canWriter()
    -- public boolean isHidden()
    
  • 创建、删除功能

    -- public boolean createNewFile():创建文件。若文件存在,则不创建,返回false
    -- public boolean mkdir():创建文件目录。如果此文件目录存在,就不创建。如果此文件的上层目录不存在,也不创建
    -- public boolean mkdirs():创建文件目录。如果上层文件目录不存在,一并创建
    -- public boolean delete():删除文件或文件夹
    
    • 删除注意:(1)Java中删除不走回收站 (2)要删除一个文件目录,该文件目录里不能包含文件或文件目录

1.4 练习

  • 判断指定目录下是否有后缀名为.jpg的文件,如果有,输出该文件名称

    import org.junit.Test;
    import java.io.File;public class Pra2 {@Testpublic void test(){File file = new File("C:\\Users\\cmf\\Pictures");String[] list = file.list();for(String s : list){if(s.endsWith(".jpg")){  //endsWith(String s)判断后缀System.out.println(s);}}}
    }
    
  • 遍历指定目录下的所有文件的名称,包括子文件目录中的文件

    //遍历指定目录下的所有文件的名称,包括子文件目录中的文件public void printFileName(File file){if(file.isFile()){ //如果是一个文件System.out.println(file.getName());//打印文件本身的名字}else if(file.isDirectory()){ //如果是目录File[] files = file.listFiles();for(File f : files){ //遍历每个文件或目录printFileName(f); //进行递归,判断接下来的文件或目录}}}
    
  • 删除指定目录及其下所有文件

    // 删除指定目录及其下所有文件public void deleteDirectory(File file){//如果file是文件减,直接delete//如果file是目录,先把它的下一级删除,再删除自己if(file.isDirectory()){File[] files = file.listFiles();//循环删除file的下一级for(File f : files){deleteDirectory(f);}}//删除自己file.delete();}
    

2. IO流概述

2.1 IO流理解

  • 输入input:读取外部数据到程序(内存)中
  • 输出output:将程序(内存)输出到磁盘、光盘等存储设备中

2.2 流的分类

  • 流向不同
    • 输入流:InputStream、Reader
    • 输出流:OutputStream、Writer
  • 数据单位不同
    • 字节流:InputStream、OutputStream
    • 字符流:Reader、Writer
  • 角色不同
    • 节点流:直接连接到数据源或目的地
    • 处理流

2.3 基础IO流的框架

抽象基类4个节点流(文件流)
InputStreamFileInputStream
OutputStreamFileOutputStream
ReaderFileReader
WriterFileWriter

3. FileReader/FileWriter

3.1 执行步骤

  • 1)创建读取或写出的File类对象
  • 2)创建输入流或输出流
  • 3)具体的读入或写出过程
    • 读入:read(char[] cbuffer)
    • 写出:writer(String str) / writer(char[] cbuffer, 0, len)
  • 4)关闭流资源,避免内存泄漏
import org.junit.Test;
import java.io.*;public class FrfwTest {/* 读取hello.txt文件中内容,并输出* */@Testpublic void test1() {FileReader fr = null;try {//1.创建File类的对象,对应着hello.txt文件File file = new File("hello.txt");//2.创建输入的字符流,用于读取数据fr = new FileReader(file);//3.读取数据,并显示在控制台上char[] cbuffer = new char[5];int len;while((len = fr.read(cbuffer))!= -1){//遍历数组for(int i = 0; i < len; i++){System.out.print(cbuffer[i]);}}} catch (IOException e) {e.printStackTrace();} finally {//4.流资源关闭(必须关闭,否则会内存泄漏)try {if(fr != null)fr.close();} catch (IOException e) {e.printStackTrace();}}}/* 将内存中的数据写到指定文件中* */@Testpublic void test2() {FileWriter fw = null;try {//1.创建File类对象,指明要写出的文件名称File file = new File("info.txt");//2.创建输出流//覆盖文件使用fw = new FileWriter(file);//fw = new FileWriter(file,false);//在现有文件基础上,末尾追加//fw = new FileWriter(file,true);//3.写出具体过程fw.write("I am happy!\n");System.out.println("输出成功!");} catch (IOException e) {e.printStackTrace();} finally {try {//4.关闭输出流fw.close();} catch (IOException e) {e.printStackTrace();}}}
}

3.2 注意

  • 涉及到流资源关闭操作,出现异常要使用thry-catch-finally方式处理

  • 对于输入流,File类对象对应的物理磁盘上文件必须存在

    对于输出流,File类对象对应的物理磁盘上文件可以不存在

    ​ > 不存在时,在输出过程中,会自动创建此文件

    ​ > 存在时,FileWriter(File file) 或 FileWriter(File file, false):会对现有文件进行覆盖

    ​ FileWriter(File file, true):在现有文件基础上,末尾追加

4. FileInputStream / FileOutputStream

  • 复制一份 sky.jpg 到 sky_copy.jpg

    import org.junit.Test;
    import java.io.*;public class FileStreamTest {//复制一份sky.jpg到sky_copy.jpg@Testpublic void test1(){FileInputStream fis = null;FileOutputStream fos = null;try {// 1. 创建File类对象File src = new File("sky.jpg");File dest = new File("sky_copy.jpg");// 2. 创建相关字节流fis = new FileInputStream(src);fos = new FileOutputStream(dest);// 3. 具体读入和写出操作byte[] b = new byte[1024];int len;while((len = fis.read(b)) != -1){for(int i = 0; i < len; i++){fos.write(buffer, 0, len);}}System.out.println("复制成功!");} catch (IOException e) {e.printStackTrace();} finally {// 4. 关闭流资源try {fos.close();fis.close();} catch (IOException e) {e.printStackTrace();}}}
    }
    
  • 注意:

    • 字符流:用于处理文本文件,不能处理非文本文件

    • 字节流:主要用于处理文本文件,如果涉及文本文件复制操作,可以使用字节流

    • 文本文件(末尾不能自动换行,只会一直写下去):.txt .java .c .cpp .py

      非文本文件:.doc .xls .jpg .mp3 .mp4 .avi等

5. 缓冲流

  • 缓冲流是处理流中的一种

  • 作用:提升文件读取效率(通过减少与磁盘的交互

  • 处理非文本文件的字节流:

    使用的字节流使用方法
    BufferedInputStreamread(byte[ ] buffer)
    BufferedOutputStreamwrite(byte[ ] buffer, 0, len)

    处理文本文件的字符流:

    使用的字符流使用方法
    BufferedReaderread(char[ ] cBuffer) / readLine( )
    BufferedWriterwrite(char[ ] cBuffer, 0, len)
  • 实现步骤

    • 1)创建File的对象、流的对象(包括文件流、缓冲流)
    • 2)使用缓冲流实现读取数据 或 写出数据的过程
    • 3)关闭资源
  • 注意

    • readLine( ):每次读取一行文本数据,返回的字符串不包含换行符
    • flush( ):刷新方法,每当调用此方法时,就会主动将内存中数据写到磁盘文件中

6. 转换流的使用

  • 要想读取时不出现乱码:解码时使用的字符集与编码时使用的字符集相同

  • 作用:实现字节与字符之间的转换

  • API

    InputStreamReader: 将一个输入型的字节流转换为输入型的字符流
    OutputStreamWriter: 将一个输出型的字符流转换为输出型的字节流
    

    解码:字节 ——》字符 编码:字符 ——》字节

  • 1)存储在文件中的字符

    ascii:主要用来存储a、b、c等英文字符和1、2、3、常用标点符号。每个字符占1个字节
    iso-8859-1:每个字符占1个字节。向下兼容ascii
    gbk:用来存储中文简体繁体、a、b、c等英文字符和1、2、3、常用标点符号等字符中文字符使用2个字节存储。向下兼容ascii,意味着英文字符、1、2、3、常用标点符号仍使用1个字节
    utf-8:可以用来存储世界范围内主要语言的所有字符。使用1-4个不等的字节表示一个字符。中文字符使用3个字节存储。向下兼容ascii.
    

    2)在内存中的字符:

    一个字符(char)占用2个字节。在内存中使用的字符集称为Unicode字符集
    

7. 对象流的使用

  • 数据流

    DataOutputStream:可以将内存中的基本数据类型的变量、String类型的变量写到具体的文件中
    DataInputStream:将文件中保存的数据还原为内存中的基本数据类型的变量、String类型的变量对象流
    
  • 对象流

    • API

      ObjectOutputStream
      ObjectInputStream
      
    • 作用:可读写基本数据类型应用数据类型

    • 对象的序列化机制

      指允许把内存中的Java对象转换成与平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上或通过网络将这种二进制流传输到另一个网络节点。

      ​ —> 当其他程序获取了这种二进制流,就可以恢复成原来的 Java 对象。

    • 序列化过程(写出):ObjectOutputStream —— 把内存中的Java对象保存在文件或通过网络传播出去

      反序列化过程(读):ObjectInputStream ——将文件中的数据或网络传输来的数据还原为内存中的Java 对象

    import java.io.*;public class ObjectStreamTest {/* **序列化过程**(写出):ObjectOutputStream—— 把内存中的Java对象保存在文件或通过网络传播出去* */@Testpublic void test1() throws IOException {//1. 创建对象File file = new File("object.txt");//把内存中的Java对象保存在的文件名ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));//2. 写出数据oos.writeUTF("我爱中国!");oos.flush();//3. 关闭资源oos.close();}/* **反序列化过程**(读):ObjectInputStream——将文件中的数据或网络传输来的数据==还原==为内存中的==Java 对象==** */@Testpublic void test2() throws IOException {File file = new File("object.txt");ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));System.out.println(ois.readUTF());ois.close();}
    }
    
  • 自定义类要想实现序列化机制,需要满足:

    • 自定义类需要实现接口:Serializable(表示接口)

    • 要求自定义声明一个全局常量:static final long serialVersionUID = 42L;

      —> 如果不声明全局常量serialVersionUID,系统会自动生成一个针对当前类的serialVersionUID。如果修改当前的自定义类,会导致serialVersionUID发生改变,进而导致反序列化时,出现InvailedClassException异常

    • 要求自定义类的各个属性都是可序列化

      • 基本数据类型:本身就是可序列化的
      • 引用数据类型:也需要实现序列化机制
    • 注意:

      • 类中的属性如果声明为transientstatic,则不会实现序列化

8. 其它流

  • 标准输入流、输出流

    • System.in:标准输入流
    • System.out:标准输出流
  • 打印流

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

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

相关文章

1、Cocos Creator 基础入门

目录 Cocos Creator 是什么&#xff1f; 语言支持 功能特性 工作流程 功能模块 相关游戏 参考 Cocos Creator 是什么&#xff1f; Cocos Creator 既是一款高效、轻量、免费开源的跨平台 2D&3D 图形引擎&#xff0c;也是一个实时 2D&3D 数字内容创作平台。拥有…

本地GDB 在geoserver发布地图服务

文章目录 简要说明maven依赖样例代码 简要说明 geoserver本身是不支持GDB的发布&#xff0c;不过可以利用gdal&#xff0c;将GDB的图层转为shpfile&#xff0c;就可以进行发布。maven依赖 <!--geoserver需要的jar--><dependency><groupId>com.github.dov-vl…

Java开发过程中如何进行进制换换

最近由于工作上的需要&#xff0c;遇到进制转换的问题。涉及到的进制主要是十进制、十六进制、二进制转换。 1、十进制转十六进制、二进制 调用java自带的api,测试十进制转16进制、2进制 package com.kangning.common.utils.reflect;/*** 十进制 转 十六进制* 十进制 转 二进…

AcWing第147场周赛(5556.牛的语言学)

牛语单词通过以下规则构造&#xff1a; 牛语单词仅由小写字母构成。牛语单词的具体结构为&#xff1a;词根若干个&#xff08;0 个或更多&#xff09;后缀&#xff0c;其中&#xff1a; 词根为长度大于 4 的字符串。后缀为长度 2 或 3 的字符串。在构成单词时&#xff0c;不允…

机器学习算法的另一个分支-贝叶斯算法原理(贝叶斯要解决什么问题)

目录 一、贝叶斯简介 二、贝叶斯要解决的问题 三、例子&#xff08;公式推导&#xff09; 四、实例 1. 拼写纠正实例 2. 垃圾邮件过滤实例 一、贝叶斯简介 1. 贝叶斯&#xff1a;英国数学家。1702年出生于伦敦&#xff0c;做过神甫。贝叶斯在数学方面主要研究概率论.对于…

Golang基础-3

Go语言基础 介绍 基础 1. 条件语句 2. 选择语句 3. 循环语句 4. goto关键字 介绍 本文介绍Go语言中条件语句、选择语句、循环语句、break、continue、goto关键字等相关知识。 基础 1. 条件语句 实现程序逻辑时&#xff0c;需要通过不同的判断条件去执行相应的语句。…

初识C++ · 入门(1)

目录 前言&#xff1a; 1 命名空间 2 输入和输出 3 缺省参数 5 函数重载 前言&#xff1a; C与C语言是有一定交集的&#xff0c;可以理解为本贾尼在使用C语言的时候认为有缺陷&#xff0c;于是加了一些小语法进行改良&#xff0c;后来经过委员会的修改&#xff0c;C98问世…

深度学习故障诊断实战 | 数据预处理之基于滑动窗的数据样本增强

前言 本期给大家分享介绍如何基于滑动窗方法进行数据样本增强 背景 深度学习模型训练需要大量的样本。在故障诊断领域&#xff0c;每个类别大都会达到300个样本。但是在实际公开数据集中&#xff0c;以CWRU数据集为例&#xff0c;每个类别只有24组数据&#xff0c;这明显是不…

CSGO赛事管理系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文&#xff08;设计&#xff09;学生选题参考合集推荐收藏&#xff08;包含Springboot、jsp、ssmvue等技术项目合集&#xff09; 目录 1. 系…

ExpandableNotificationRow的父类layout

ExpandableNotificationRow的父类layout NotificationsQuickSettingsContainer NotificationPanelView NotificationShadeWindowView ExpandableNotificationRow 就是下图的一个 Notification&#xff1a; USB连接 。 何时创建一个ExpandableNotificationRow 并且被添加到Not…

Spring Boot 工程开发常见问题解决方案,日常开发全覆盖

本文是 SpringBoot 开发的干货集中营&#xff0c;涵盖了日常开发中遇到的诸多问题&#xff0c;通篇着重讲解如何快速解决问题&#xff0c;部分重点问题会讲解原理&#xff0c;以及为什么要这样做。便于大家快速处理实践中经常遇到的小问题&#xff0c;既方便自己也方便他人&…

护眼台灯对眼睛有危害吗?多款预防近视的台灯推荐

在日常生活中&#xff0c;灯光对于我们而言&#xff0c;是非常重要的&#xff0c;尤其是在夜晚&#xff0c;不管是学习还是办公都需要合适的光线环境。很多家长为了保护孩子的视力会选择从台灯下手&#xff0c;但又不知道护眼台灯对眼睛有危害吗&#xff1f;今天就来好好的告诉…

【MySQL】数据库--表操作

目录 一、创建表 二、查看表 三、修改表 1. 添加字段--add 2.修改表名--rename to 3.修改列名--change 4.修改字段的数据类型--modify 5.删除字段&#xff08;列&#xff09;--drop 四、删除表 一、创建表 create [temporary]table[if not exists]table_name [([colu…

vscode插件

一、codeGeex 自动解析代码添加注释 二、Prettier - Code formatter 代码格式化插件 // “prettier.useEditorConfig”: false, // 是否使用editorConfig配置文件中的设置 “prettier.semi”: true, // 句尾是否填加分号 “prettier.singleQuote”: false, //是否使用单引号 “…

python如何获取word文档的总页数

最近在搞AI. 遇到了一个问题&#xff0c;就是要进行doc文档的解析。并且需要展示每个文档的总页数。 利用AI. 分别尝试了chatGPT, 文心一言&#xff0c; github copilot&#xff0c;Kimi 等工具&#xff0c;给出来的答案都不尽如人意。 给的最多的查询方式就是下面这种。 这个…

【Canvas与艺术】硬朗风格十二棱表表盘

【效果图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>硬朗风格十二棱表表盘</title><style type"text/css…

Qt+OpenGL入门教程(三)——绘制三角形

通过前两篇文章的学习&#xff0c;我想大家应该有了基本的理解&#xff0c;我们接下来实操一下。 创建Qt OpenGL窗口 QOpenGLWidget QGLWidget是传统QtOpenGL模块的一部分&#xff0c;与其他QGL类一样&#xff0c;应该在新的应用程序中避免使用。相反&#xff0c;从Qt5.4开始…

新手如何用Postman做接口自动化测试?

1、什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试&#xff0c;模拟人去操作软件界面&#xff0c;把人从简单重复的劳动中解放出来&#xff0c;本质是用代码去测试另一段代码&#xff0c;属于一种软件开发工作&#xff0c;已…

【检索增强】Retrieval-Augmented Generation for Large Language Models:A Survey

本文简介 1、对最先进水平RAG进行了全面和系统的回顾&#xff0c;通过包括朴素RAG、高级RAG和模块化RAG在内的范式描述了它的演变。这篇综述的背景下&#xff0c;更广泛的范围内的法学硕士研究RAG的景观。 2、确定并讨论了RAG过程中不可或缺的核心技术&#xff0c;特别关注“…

深入Facebook的世界:探索数字化社交的无限可能性

引言 随着数字化时代的到来&#xff0c;社交媒体平台已经成为了人们日常生活中不可或缺的一部分&#xff0c;而其中最为突出的代表之一便是Facebook。作为全球最大的社交媒体平台之一&#xff0c;Facebook不仅仅是一个社交网络&#xff0c;更是一个数字化社交的生态系统&#…