文件操作和IO—javaEE

news2024/12/24 14:00:50

文章目录

  • 1.文件
    • 1.1文件系统的结构
    • 1.2java中的文件操作(metadata的操作)
  • 2.io操作
    • 2.1定义
    • 2.2io划分
    • 2.3java的io流之输入流
    • 2.4java的io流之输出流

1.文件

文件包含数据本身和文件的头信息(metadata),文件的头信息包括文件名、修改时间、文件大小等

1.1文件系统的结构

(1)文件路径
①绝对路径:从根结点到叶子结点的整个路径

语法:cd 绝对路径

在这里插入图片描述
②相对路径:从任意一个节点出发到目的节点经过的路径

语法:cd …/到上一级
cd ./到当前目录

注意:文件的上一级指的是以文件所在目录找上一级

在这里插入图片描述

目录:从E:\me\课表及日历到E:\me\实验\2021实验
在这里插入图片描述
文件:从E:\me\课表\大一上.png到E:\python\py.txt

…/…/python/py.txt
(2)文件的划分:文件类型和二进制类型(不同维度可以划分不同的文件类型)
①文本本质上也是基于二进制来保存数据的,是使用了一种编码格式保存的文本,打开文本也要指定和保存时一样的编码格式

注意:保存和打开的编码格式要一致,否则会乱码,其他地方也是一样,例如:涉及网络数据操作,数据库保存数据(创建数据库是指定的编码格式),java操作数据库的数据(URL中指定)要一致;java中的文本是string,可以通过字符串.getBytes(“编码格式”),返回的是byte[]

②二进制类型的文件(图片、视频、音频等):可以使用文本编辑器打开,但是看到的是乱码

注意:java中的二进制数据byte[],也可以转文本(string):new String(byte数组)或者String(byte数组,“编码格式”)

(3)文件权限:读、写、执行
(4)文件分隔符:Windows是\,Linux是/

1.2java中的文件操作(metadata的操作)

(1)属性(Fileds)
文件系统分隔符
在这里插入图片描述
(2)构造方法(constructor)
这里传入的路径可以是绝对路径,也可以是相对路径
在这里插入图片描述

注意:java中,file对象可以是文件,也可以是目录;new一个不存在的路径,这个file对象还是实例化了,只是不存在

(3)方法(methods)
在这里插入图片描述
在这里插入图片描述

package file;
import java.io.File;
import java.io.IOException;

public class createFile {
    public static void main(String[] args) throws IOException {
        //创建一个文件
        File file = new File("E:/TMP/1.txt");
        //不存在就创建这个文件
        if(!file.exists()){
            file.createNewFile();
        }
    }
}

在这里插入图片描述

package file;
import java.io.File;

public class createDirectory {
    public static void main(String[] args) {
        //创建一级目录
        File file = new File("E:/TMP/文件1");
        if(!file.exists()){
            file.mkdir();
        }
        //创建多级目录
        File file1 = new File("E:/TMP/文件2/2/3");
        if (!file1.exists()){
            file1.mkdirs();
        }
    }
}

在这里插入图片描述

package file;
import java.io.File;
import java.util.Date;

public class getInformation {
    public static void main(String[] args) {
        File file = new File("E:/TMP/1.txt");
        System.out.println(file.getName());//1.txt 文件名称
        System.out.println(file.getPath());//E:\TMP\1.txt 文件路径
        System.out.println(file.length());//33 文件大小(字节数)
        System.out.println(file.lastModified());//1681133071149上次修改时间
        System.out.println(new Date(file.lastModified()));//Mon Apr 10 21:24:31 CST 2023 转化为日期型
        System.out.println(file.isFile());//true 是否是文件
        System.out.println(file.isDirectory());//false 是否是目录
    }
}

在这里插入图片描述

package file;
import java.io.File;

public class rename {
    public static void main(String[] args) {
        //重命名
//        File file = new File("E:/TMP/1.txt");
//        file.renameTo(new File("E:/TMP/1_rename.txt"));
        //移动
        File file = new File("E:/TMP/1_rename.txt");
        file.renameTo(new File("E:/TMP/文件1/1_rename.txt"));
    }
}

在这里插入图片描述
返回目录的子文件或目录

package file;
import java.io.File;
import java.util.Arrays;

public class getChildren {
    public static void main(String[] args) {
        File file = new File("E:/TMP/文件1");
        //返回目录的子文件或目录
        File[] files = file.listFiles();
        System.out.println(Arrays.toString(files));
    }
}

返回所有子文件和目录

package file;
import java.io.File;
public class getAllChildren {
    public static void main(String[] args) {
        File file = new File("E:/TMP/文件1");
        getChildrenList(file);
    }
    private static void getChildrenList(File file){
        System.out.println(file);
        //如果是目录,就查找子文件或目录
        if (file.isDirectory()){
            //子目录或文件
            File[] files = file.listFiles();
            //递归找下一级的子目录或文件
            for (File child : files){
                getChildrenList(child);
            }
        }
    }
}

在这里插入图片描述

package file;
import java.io.File;

public class delete {
    public static void main(String[] args) {
        //删除文件
//        File file = new File("E:/TMP/文件1/1_rename.txt");
//        file.delete();
        //删除目录:目录下没有东西才可以删除,如果有东西,需要一个一个遍历依次删除
        File file = new File("E:/TMP/文件2");
        file.delete();
    }
}

2.io操作

2.1定义

io操作是将数据从一个设备传输到另一个设备(i是input(输入);o是output(输出)),下图是本地文件io的过程
在这里插入图片描述

2.2io划分

(1)从来源划分:文件io、网络io
(2)从方向划分:输入流(读取数据)、输出流(写数据)

  • System.in:标椎输入流
  • System.out:标椎输出流
  • System.err:错误输出流

操作流的注意事项:对于读取数据来说:已读的部分就不能再次读取了;io的输入流可以再嵌套输入流,io的输出流可以再次嵌套输出流;使用完输入、输出流要关闭流

2.3java的io流之输入流

(1)class InputStream是最定级的输入流,所有真实使用的io流都是他的子类
这三种方法都是返回值是-1就表示输入流结束了
在这里插入图片描述

package ioReader;
import java.io.FileInputStream;
import java.io.IOException;

public class ioRead1 {
    //一个字节一个字节的读
    public static void main(String[] args) throws IOException {
        FileInputStream fileInputStream = new FileInputStream("E:/TMP/文件1/2.txt");
        byte[] bytes = new byte[fileInputStream.available()];
        int len;
        for (int i = 0;(len = fileInputStream.read()) != -1;i++){
            bytes[i] = (byte) len;
        }
        System.out.println(new String(bytes,"UTF-8"));
    }
}

(2)class FileInputStream
文件的输入流,读取文件的内容,可以读取文本文件、二进制数据到字节数组中

package ioReader;
import java.io.FileInputStream;
import java.io.IOException;

public class ioRead {
    public static void main(String[] args) throws IOException {
        FileInputStream fileInputStream = new FileInputStream("E:/TMP/文件1/2.txt");
        byte[] bytes = new byte[1024];//字节数组用来保存读取的数据
        int len;//每次读取的长度
        //读到文件结束,返回值是-1就是文件结束
        while ((len = fileInputStream.read(bytes)) != -1){
            //字节数组中0-len就是读取的数据
            //二进制转换为字符串,要和保存的时候的编码格式保持一致
            //string的构造方法就是把字节数组从offset位置读取到offset+len的位置,读取len的字节
            //UTF-8指定编码类型
            String str = new String(bytes,0,len,"UTF-8");
            System.out.println(str);
        }
    }
}

(3)输入流可以嵌套其他输入流
比较常见的字符输出流是BufferedReader(带缓冲区,读文本文件且效率较高),io包下带reader的都是字符输入流
在这里插入图片描述

package ioReader;
import java.io.*;

public class ioReaderChar {
    //字符输入流读取文件(适用的最多的是BufferedReader)
    public static void main(String[] args) throws IOException {
        //先获取一个字节流
        FileInputStream fileInputStream = new FileInputStream("E:/TMP/文件1/2.txt");
        //再包装为一个字节字符转换流
        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,"UTF-8");
        //再包装为一个字节流
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        String str;
        //每次读取一行,没有结束就一直读
        while ((str = bufferedReader.readLine()) != null){
            System.out.println(str);
        }
    }
}

关于缓冲区:
无缓冲区:一个字节一个字节读取或者字节数组读取效率都比较低;内存速度远高于硬盘,但是这种操作(进程read)都要等硬盘传输完,进程这个过程中是阻塞等待
在这里插入图片描述

有缓冲区:使用了缓冲区,达到一定数量再进行读取,提高了效率
在这里插入图片描述

2.4java的io流之输出流

(1)class outputStream是输出流的顶级抽象类,所有使用的输出流都是它的子类
在这里插入图片描述
(2)class FileOutputStream是文件字节输出流
通过继承outputStream的三个write方法就能写字节数据,也可以写二进制数据或文本
在这里插入图片描述

注意:输出流写了数据,如果这个输出对象有flush方法记得调用,表示刷新缓冲区,因为写数据可能不是直接往硬盘上写,而是先写到缓冲区,flush方法就是刷新缓冲区,写入硬盘

package ioWriter;

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

public class ioCopyFile {
    //字节流复制文件
    public static void main(String[] args) throws IOException {
        FileInputStream fileInputStream = new FileInputStream("E:/TMP/文件1/2.txt");
        FileOutputStream fileOutputStream = new FileOutputStream("E:/TMP/2_copy.txt");
        byte[] bytes = new byte[1024 * 8];
        int len;
        for (int i = 0;(len = fileInputStream.read(bytes))!=-1 ; i++) {
            //字节数组中0-len范围是读取的数据,同时往输出流写数据
            fileOutputStream.write(bytes,0,len);
            fileOutputStream.flush();
        }
        fileOutputStream.close();
        fileInputStream.close();
    }
}

(3)BufferedWrite:io包下带write的都是字符输出流,注意要输出到字节流中,需要先使用字节字符转换流outputStreamWrite

new BufferedWriter(new OutputStreamWriter(new FileOutputStream(),“编码格式”))

package ioWriter;
import java.io.*;

public class ioWriterFile {
    //字节流写文件
    public static void main(String[] args) throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream("E:/TMP/文件1/2.txt");
        String str = "大家好";
        fileOutputStream.write(str.getBytes("UTF-8"));
        fileOutputStream.close();
    }
}

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

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

相关文章

VSCode的C/C++编译调试环境搭建(亲测有效)

文章目录前言1.安装VSCode和mingw642.配置环境变量3.配置VSCode的运行环境3.1设置CodeRunner3.2设置C/C4.调试环境配置前言 这片博客挺早前就写好了,一直忘记发了,写这篇博客之前自己配的时候也试过很多博客,但无一例外,都各种js…

SpringBoot(4)整合数据源

SpringBoot整合数据源数据层解决方案数据源技术持久化技术数据库技术NoSQL整合Redis整合MongDB整合ES数据层解决方案 MySQL数据库与MyBatisPlus框架,后面又用了Druid数据源的配置,所以现在数据层解决方案可以说是MysqlDruidMyBatisPlus。而三个技术分别…

一文彻底了解派克Parker无铁芯/有铁芯直线电机及其应用

一、什么是直线电机? 直线电机是一种将电能直接转换成直线运动机械能,而不需要任何中间转换机构的传动装置。它可以看成是一台旋转电机按径向剖开,并展成平面而成。 二、直线电机的特点 直线电机类似于一台旋转电机解剖摊开来进行运转。在一…

9、DRF实战总结:过滤(filter)与排序,以及第三方库django-filter的使用(附源码)

在前面的DRF系列教程中,以博客为例介绍了序列化器(Serializer), 并使用基于类的视图APIView和ModelViewSet开发了针对文章资源进行增删查改的完整API接口,并详细对权限、认证(含jwt认证)和分页进行了总结与演示。在本篇文章中将向演示如何在Django REST …

Boost库在windows上的使用

今天要配置一个C环境,被Boost库困扰了一段时间,在这里记录一下解决的方法。 主要是打不开 libboost_iostreams-vc143-mt-gd-x64-1_82.lib这样的问题。 操作的步骤如下: 下载binary包: 链接: https://boostorg.jfrog.io/artifac…

ChatGPT有用到知识图谱吗?它自己是这样回答...

从搜索引擎到个人助手,我们每天都在使用问答系统。问答系统必须能够访问相关的知识并进行推理。通常,知识可以隐式地编码在大型语言模型(LLMs)中,例如ChatGPT、T5 和LaMDA 等大型语言模型,这些模型在未结构…

如何面对人生困境至暗时刻

北方春天伊始刚好想发表下另一种境遇就是当人生面临困境或者至暗怎么样走出来,如果有正面临这样的情况来分享下如何走出阴霾,拥有更多可能性的人生,现在回望过去一年的自己太过牵强失去自我。 对世界的应该思维:为什么我总看不清现…

PHP快速入门10-图像处理,附图像大小调整、旋转、获取颜色等15个常见示例

文章目录前言一、PHP的图像处理1.1 图像处理函数二、 图像处理示例2.1 创建一个空白的图像2.2 从文件创建一个新的图像2.3 从URL创建一个新的图像2.4 调整图像大小2.5 对比度和亮度调整2.6 度数旋转2.7 模糊滤镜2.8 获取图像的颜色信息2.9. 图像合并2.10 图像旋转和裁剪2.11 图…

css补充内容

1.最好给body设置min-width,防止缩小页面时出现空白 2.让图片随着网页缩小而缩小 3.html5语义化元素 4.video与audio video是行内替换元素 默认是第一帧静态画面,需要手动调整画面大小和添加播放条,是否自动播放 大多数浏览器不支持自动播放,除非设置为muted,这是为了用户的…

小巧“抠门”的FTHR-F0140开发板

小巧“抠门”的FTHR-F0140开发板 文章目录小巧“抠门”的FTHR-F0140开发板缘起硬件电路主控芯片供电系统调试器插座LED灯按键CAN接口电路软件资源资源链接缘起 工欲善其事,必先利其器。调试和开发MM32F0140这种小巧的芯片,还是需要小巧的板子去适配&…

本科也可入行的IC模拟版图,需要学习哪些知识?

IC模拟版图是一个入门非常简单,但同时又是一份涉及知识面非常广阔,资深较难的工作。 在众多IC岗位中,模拟版图确实属于容易入门,吸引来很多想要转行IC行业的朋友,但需要掌握的知识点和技巧并不比设计少,属…

Python+Selenium+Unittest 之selenium5--元素定位4-XPath定位1(基本概念)

目录 一、简介 二、节点关系 三、绝对路径与相对路径 一、简介 Xpath定位在selenium中属于常用的定位方式,首先来说下Xpath的一些概念,Xpath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置…

Vision Transformers for Dense Prediction论文笔记

文章目录Vision Transformers for Dense Prediction, ICCV, 2021一、背景介绍二、网络结构三、实验结果1.语义分割实验2.消融实验Vision Transformers for Dense Prediction, ICCV, 2021 一、背景介绍 本篇论文主要提出一种网络…

SpringBoot 集成webSocket

pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …

IT软件行业用契约锁实现“代理-销售-投标-项目-合作”电子签

IT软件行业产品销售渠道多、销售订单体量大&#xff0c;从产品研发、销售到项目实施&#xff0c;伴随着大量的协议、合同、单据需要与员工、客户或者经销商签署。引入电子签章&#xff0c;化解纸质合同签署带来的效率、成本、安全等问题&#xff0c;成为软件行业产品代理、销售…

Vector - CAPL - Panel面板_01

前面有过简单的介绍panel面板的功能&#xff0c;不过终究感觉有点简陋&#xff0c;最近也在搞PyQT5&#xff0c;发现如果对于这块了解不多的情况下&#xff0c;想要做一些东西的话&#xff0c;简直无从下手&#xff0c;因此专门翻阅了之前的文章&#xff0c;查看了下确实缺少了…

ChatGPT自动化提高工作效率: 2分钟快速生成思维导图

一、简要说明 ChatGPT不止是一个聊天机器人&#xff0c;更是一个自然语言处理、文本内容生成模型&#xff0c;它可以理解语言规则&#xff0c;不仅仅是给你输出已有的知识内容&#xff0c;还会给到你一些创意点子&#xff1b;所以我们应该学会如何使用它&#xff0c;让它更好的…

集合例题,

package com.hspedu.homework;import java.util.*;/*** author 韩顺平* version 1.0*/ SuppressWarnings({"all"}) public class Homework03 {public static void main(String[] args) {Map m new HashMap();m.put("jack", 650);//int->Integerm.put(&…

STL源码剖析-六大部件, 部件的关系,复杂度, 区间表示

C标准库-体系结构与内核分析 根据源代码来分析 介绍 自学C侯捷老师的STL源码剖析的个人笔记&#xff0c;方便以后进行学习&#xff0c;查询。 为什么要学STL&#xff1f;按侯捷老师的话来说就是&#xff1a;使用一个东西&#xff0c;却不明白它的道理&#xff0c;不高明&…

分享一个Vue输入框获取焦点自动选中指令

需求背景&#xff1a;最近项目中遇到很多输入类控件&#xff0c;且有频繁改动需求&#xff0c;如果数值过长&#xff0c;则需要一直按着删除键&#xff0c;于是想能不能获取焦点的时候&#xff0c;就直接选中&#xff0c;这样就可以直接删除了 1、思路分析 记得很早的时候做小…