(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.rhkb.cn/news/289543.html

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

相关文章

简单谈谈什么是块存储?

块存储是最简单的数据存储形式&#xff0c;通常用于存储区域网络(SAN) 或 云存储 设置。文件存储在固定大小的块中&#xff0c;可以更轻松地访问文件以进行快速或频繁的编辑。虽然更复杂且成本更高&#xff0c;但存储在此类系统中的数据可以轻松访问&#xff0c;而不会影响操作…

如何在Win10使用IIS服务搭建WebDAV网站并实现无公网IP访问内网文件内容

文章目录 前言1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网3.1 安装cpolar内网穿透3.2 配置WebDav公网访问地址 4. 映射本地盘符访问 前言 在Windows上如何搭建WebDav&#xff0c;并且结合cpolar的内网穿透工具实现在公网访…

docker 的八大技术架构(图解)

docker 的八大技术架构 单机架构 概念&#xff1a; 应用服务和数据库服务公用一台服务器 出现背景&#xff1a; 出现在互联网早期&#xff0c;访问量比较小&#xff0c;单机足以满足需求 架构优缺点&#xff1a; 优点&#xff1a;部署简单&#xff0c;成本低 缺点&#xff1…

80个Python数据分析必备实战案例.pdf(附代码),完全开放下载

大家好&#xff0c;我是彭涛。 随着数据时代的来临&#xff0c;Python数据分析技能现在愈加重要&#xff0c;无论是从事数据科学、商业分析还是决策支持&#xff0c;掌握 Python 数据分析的技能都将成为你事半功倍的利器。 之前为大家陆续梳理了基础资料&#xff0c;爬虫资料…

C# WPF编程-事件

C# WPF编程-路由事件 路由事件概要路由事件的三种方式 WPF事件WPF最重要的5类事件&#xff1a;生命周期事件 鼠标事件键盘事件多点触控输入原始触控 路由事件概要 路由事件是具有更强传播能力的事件&#xff0c;它们可在元素树中向上冒泡和向下隧道传播&#xff0c;并沿着传播…

网易web安全工程师进阶版课程

课程介绍 《Web安全工程师&#xff08;进阶&#xff09;》是由“ i春秋学院联合网易安全部”出品&#xff0c;资深讲师团队通过精炼的教学内容、丰富的实际场景及综合项目实战&#xff0c;帮助学员纵向提升技能&#xff0c;横向拓宽视野&#xff0c;牢靠掌握Web安全工程师核心…

【任职资格】某大型制造型企业任职资格体系项目纪实

该企业以业绩、责任、能力为导向&#xff0c;确定了分层分类的整体薪酬模式&#xff0c;但是每一名员工到底应该拿多少工资&#xff0c;同一个岗位的人员是否应该拿同样的工资是管理人员比较头疼的事情。华恒智信顾问认为&#xff0c;通过任职资格评价能实现真正的人岗匹配&…

DVB-S系统仿真学习

DVB-S系统用于卫星电视信号传输&#xff0c;发送端框图如下所示 扰码 实际数字通信中&#xff0c;载荷数据的码元会出现长连0或长连1的情况&#xff0c;不利于接收端提取时钟信号&#xff0c;同时会使得数据流中含有大量的低频分量&#xff0c;使得QPSK调制器的相位长时间不变…

中国国际通信大会2024|中国通信展览会|通信展览会

中国国际通信大会2024|中国通信展览会|通信展览会 中国国际信息通信展览会&#xff08;ICT展&#xff09;是亚太地区最具影响力的信息通信技术盛会之一。每年一度的ICT展汇聚了来自全球各行各业的专业人士&#xff0c;为各领域的科技公司、创新企业以及技术爱好者们提供一个难得…

数据结构学习——无头+单向+非循环链表增删查改实现

链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表 中的指针链接次序实现的 注意&#xff1a; 链式结构在逻辑上是连续的&#xff0c;但是在物理上不一定连续在链表实现过程中&#xff0c;结点一…

轻松赚钱,精彩生活:上班族副业赚钱新攻略大揭秘!

薪水总是捉襟见肘&#xff0c;每月账单总让人倍感压力。你是否曾在静谧的夜晚&#xff0c;躺在床上&#xff0c;思索如何为家庭多赚一分钱&#xff1f;其实&#xff0c;你并不孤单。在这个充满机遇与挑战的时代&#xff0c;越来越多的人开始寻找副业&#xff0c;以期望让生活更…

使用easyYapi生成文档

easyYapi生成文档 背景1.安装配置1.1 介绍1.2 安装1.3 配置1.3.1 Export Postman1.3.2 Export Yapi1.3.3 Export Markdown1.3.4 Export Api1.3.6 常见问题补充 2. java注释规范2.1 接口注释规范2.2 出入参注释规范 3. 特定化支持3.1 必填校验3.2 忽略导出3.3 返回不一致3.4 设置…

PL/SQL的词法单元

目录 字符集 标识符 分隔符 注释 oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 PL/SQL块中的每一条语句都必须以分号结束。 一个SQL语句可以跨多行&#xff0c;但分号表示该语句的结束:一行中也可以有多条 SQL语句&…

spring boot3自定义注解+拦截器+Redis实现高并发接口限流

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途 目录 写在前面 内容简介 实现思路 实现步骤 1.自定义限流注解 2.编写限流拦截器 3.注册拦截器 4.接口限流测试 写在前…

2024最新Win系统下VSCode下载安装与配置C/C++教程

2024最新Win系统下VSCode下载安装与配置C/C教程 文章目录 2024最新Win系统下VSCode下载安装与配置C/C教程1、下载安装VSCode2、安装运行时环境GCGC的环境配置 3、安装VSCode插件4、配置程序调试环境4.1确定文件存储路径4.2新建文件夹【.vscode】4.3在.vscode文件夹里新建四个配…

yarn按包的时候报错 ../../../package.json: No license field

运行 yarn config list 然后运行 yarn config set strict-ssl false 之后yarn就成功了

Canal配置

注&#xff1a;开发环境服务器&#xff1a;172.16.8.35 用develop用户登录。 进入canal安装目录&#xff1a;cd /home/devops/canal/deployer/conf 复制dst_vehicle目录&#xff0c;重命名为自己服务的数据库名 cp -r dst_vehicle/ dst_bill 进入dst_bill目录&#xff0c;删…

docker网段冲突导致主机连接不上

前提&#xff1a;windows电脑链接liunx服务器&#xff0c;liunx服务器里面起了docker。 场景&#xff1a;在liunx服务器里面&#xff0c;用docker-compose up -d启动容器过程中&#xff0c;终止了windows服务器连接liunx服务器 可能原因&#xff1a;1.docker自身的网卡网段与连…

Ubuntu20.04更换镜像源------最简单的教程

本教程适用于&#xff1a;Ubuntu22.04 操作流程 打开终端&#xff0c;运行以下命令&#xff1a; sudo sed -i "shttp://.*archive.ubuntu.comhttps://mirrors.tuna.tsinghua.edu.cng" /etc/apt/sources.list 运行后即完成更改。 如果找不到22.04的镜像&#xff…

机器学习——元学习

元学习&#xff08;Meta Learning&#xff09;是一种机器学习方法&#xff0c;旨在使模型能够学习如何学习。它涉及到在学习过程中自动化地学习和优化学习算法或模型的能力。元学习的目标是使模型能够从有限的训练样本中快速适应新任务或新环境。 在传统的机器学习中&#xff…