java基础-IO

news2024/11/19 20:33:32

1、基础概念

1.1、文件(File)

        文件的读写可以说是开发中必不可少的部分,因为系统会存在大量处理设备上的数据,这里的设备指硬盘,内存,键盘录入,网络传输等。当然这里需要考虑的问题不仅仅是实现,还包括同步,读写熟读,文件类型等等都需要考虑在具体的项目中。

       Java 的标准库 java.io 提供了File的实例对象来操作文件

1.2、流(Stream)

        I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等。     

        Java程序中,对于数据的输入/输出操作以“流(stream)” 的方式进行。

         java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。

2、文件(File)

2.1、File类创建

名称说明
public File(String pathname)根据文件路径创建对象
public File(String parent,String child)从父路径名字符串和子路径名字字符串创建文件对象
public File(File parent,String child)根据父路径对应文件对象和子路径名字字符串创建对象

 2.2、常用方法

public String getAbsolutePath()    获取绝对路径
public String getPath()    获取路径
public String getName()    获取名称
public String getParent()    获取上层文件目录路径。若无,返回null
public long length()    获取文件长度(即:字节数)。不能获取目录的长度。
public long lastModified()    获取最后一次的修改时间,毫秒值
public String[] list()    获取指定目录下的所有文件或者文件目录的字符串数组
public File[] listFiles()    获取指定目录下的所有文件或者文件目录的File对象数组

public boolean isDirectory()    判断是否是文件目录
public boolean isFile()    判断是否是文件
public boolean exists()    判断是否存在
public boolean canRead()    判断是否可读
public boolean canWrite()    判断是否可写
public boolean isHidden()    判断是否隐藏

2.3、实例

public class FileTest {
    public static void main(String[] args) throws IOException {
        //1、设置目录名称
        String filePath = "H:\\test";
        //2、设置文件名称
        String fileName = "test.txt";

        //添加文件目录
        File file = new File(filePath);
        //1、判断是否存在目录
        boolean exists = file.exists();
        System.out.println("路径"+filePath+"在磁盘中是否存在:"+exists);
        //2、不存在,创建目录
        if (!exists) {
            boolean b = file.mkdirs();// 在磁盘中指定路径下创建目录
            System.out.println("创建目录是否成功:"+b);
        }else {
            System.out.println("创建目录已经存在");
        }
        //3、再判断是否存在目录
        boolean exists1 = file.exists();
        System.out.println("路径"+filePath+"在磁盘中是否存在:"+exists1);

        //判断传入的抽象路径名是否是一个在磁盘中已存在的文件
        System.out.println("判断传入的抽象路径名是否是一个在磁盘中已存在的文件:"+file.isFile());// false
        //判断传入的抽象路径名是否是一个在磁盘中已存在的目录
        System.out.println("判断传入的抽象路径名是否是一个在磁盘中已存在的目录:"+file.isDirectory());// true

        System.out.println("获取绝对路径"+file.getAbsolutePath());
        System.out.println("获取路径"+file.getPath());
        System.out.println("获取名称"+file.getName());
        System.out.println("获取上层文件目录路径。若无,返回null"+file.getParent());
        System.out.println("获取文件长度(即:字节数)。不能获取目录的长度"+file.length());
        System.out.println("获取最后一次的修改时间,毫秒值"+new Date(file.lastModified()));
        System.out.println("获取指定目录下的所有文件或者文件目录的字符串数组:"+file.list());
        System.out.println("获取指定目录下的所有文件或者文件目录的File对象数组:"+file.listFiles());

        //从磁盘中删除指定文件路径下的文件或者文件目录
//        file.delete();
//        System.out.println("再次判断传入的抽象路径名(目录/普通文件)在磁盘中是否存在:"+file.exists());// false

        System.out.println("=================================================================================");
        //添加文件
        File f = new File(filePath,fileName);
        //1、判断是否存在目录
        boolean e = f.exists();
        System.out.println("路径"+filePath+"在磁盘中是否存在:"+e);
        //2、不存在,创建文件
        if (!e) {
            boolean b = f.createNewFile();
            System.out.println("创建文件是否成功:"+b);
        }else {
            System.out.println("创建文件已经存在");
        }

        //3、再判断是否存在目录
        boolean e1 = f.exists();
        System.out.println("路径"+filePath+"在磁盘中是否存在:"+e1);

        // 判断传入的抽象路径名是否是一个在磁盘中已存在的文件
        System.out.println("判断传入的抽象路径名是否是一个在磁盘中已存在的文件:"+f.isFile());// false
        // 判断传入的抽象路径名是否是一个在磁盘中已存在的目录
        System.out.println("判断传入的抽象路径名是否是一个在磁盘中已存在的目录:"+f.isDirectory());// true

        System.out.println("判断是否可读"+f.canRead());
        System.out.println("判断是否可写"+f.canWrite());
        System.out.println("判断是否隐藏"+f.isHidden());

        System.out.println("获取绝对路径"+f.getAbsolutePath());
        System.out.println("获取路径"+f.getPath());
        System.out.println("获取名称"+f.getName());
        System.out.println("获取上层文件目录路径。若无,返回null"+f.getParent());
        System.out.println("获取文件长度(即:字节数)。不能获取目录的长度"+f.length());
        System.out.println("获取最后一次的修改时间,毫秒值"+new Date(f.lastModified()));
        System.out.println("获取指定目录下的所有文件或者文件目录的字符串数组:"+f.list());
        System.out.println("获取指定目录下的所有文件或者文件目录的File对象数组:"+f.listFiles());

        // 从磁盘中删除指定文件路径下的文件或者文件目录
//        f.delete();
//        System.out.println("再次判断传入的抽象路径名(目录/普通文件)在磁盘中是否存在:"+file.exists());// false

    }
}

3、流的分类

  • 操作数据单位不同分为:字节流(8 bit),字符流(16 bit)
  • 数据流的流向不同分为:输入流,输出流

 补充:

  • 流的角色的不同分为:节点流,处理流
    节点流:直接从数据源或目的地读写数据
    处理流:不直接连接到数据源或目的地,而是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。

 3.1、IO 流体系图

3.2、派生类

        Java的IO流共涉及40多个类,实际上非常规则,都是从以上4个抽象基类派生的,并且子类名称都是以其父类名作为子类名后缀。

 

4、字节流

        字节流分为字节输入流InputStream字节输出流OutputStream,其中输入与输出是相对于内存而言的;输入即从文件中读出数据输入至内存;输出即从内存向文件中输出数据。

从jdk8文档中,InputStream 方法如下:

OutputStream方法如下:

从 Java 9 开始,InputStream 新增加了多个实用的方法:

readAllBytes():读取输入流中的所有字节,返回字节数组。
readNBytes(byte[] b, int off, int len):阻塞直到读取 len 个字节。
transferTo(OutputStream out):将所有字节从一个输入流传递到一个输出流。

4.1、实例

public class FileStreamTest {
    public static void main(String[] args) throws IOException {
        //写入
        FileOutputStream fileOutputStream = new FileOutputStream("H:\\test\\test.txt");
        String s = "test123";
        // 将字符串转换为byte数组
        byte[] outBytes = s.getBytes();
        fileOutputStream.write(outBytes);
        fileOutputStream.flush();
        fileOutputStream.close();

        System.out.println("=================================================================");

        //读取
        FileInputStream fileInputStream = new FileInputStream("H:\\test\\test.txt");
        //1、返回从该输入流中可以读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。
        int available = fileInputStream.available();
        System.out.println("available:" + available);

        //2、跳过并丢弃来自此输入流的 2字节数据。
//        long skip = fileInputStream.skip(2);
//        System.out.println("skip:" + skip);
        //3、读取文件内容,为了减少IO,我们创建一个Byte数组作为接收缓冲区
        byte[] inBytes = new byte[available];
        int read;
        //4、从输入流读取一些字节数,并将它们存储到缓冲区 b 。
        while ((read = fileInputStream.read(inBytes)) != -1) {
            // 把byte数组转换成字符串
            System.out.print(new String(inBytes, 0, read));
        }

        if (fileInputStream != null) {
            fileInputStream.close();
        }
    }
}

5、字符流

        已经有字节流了,可以读取任意文件,为什么还要有字符流呢?

  1. 对于字符文件,先作为字节传输,再转成字符,耗时耗力。
  2. 对于字符文件,转成字节之后,再转回来,如果是中文,很容易乱码。

5.1、Reader

5.2、Writer

5.3、实例

public class FileStreamTest {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("H:\\test\\test.txt");
        String s = "少年";
        fw.write(s); // 将字符串写入文件
        // 关闭资源
        fw.close();

        FileReader fr = new FileReader("H:\\test\\test.txt");
        String str = new String();
        int b;
        // 循环读取
        while ((b = fr.read())!=-1) {
            str = str + (char)b;
        }
        System.out.println("str:"+str);
        // 关闭资源
        fr.close();
    }
}
  • flush :刷新缓冲区,流对象可以继续使用。
  • close :先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。

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

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

相关文章

人工智能|机器学习——机器学习如何判断模型训练是否充分

一、查看训练日志 训练日志是机器学习中广泛使用的训练诊断工具,每个 epoch 或 iterator 结束后,在训练集和验证集上评估模型,并以折线图的形式显示模型性能和收敛状况。训练期间查看模型的训练日志可用于判断模型训练时的问题,例…

IOC DI入门

1.加上Component,控制翻转,将service和dao都交给IOC容器管理,成为IOC容器中的bean。用哪个类就在哪个类上面加component。 2.加上autowired。依赖注入。controller依赖于service,service依赖于dao。加上时,IOC容器会提…

Taro3+Vue3重构Mpvue小程序项目踩坑记

1、Taro小程序编译时报错; 原因:页面中存在小程序识别不了的标签;如div解决方法: 将div标签替换成小程序可识别的标签; 安装Taro中提供的插件:tarojs/plugin-html, 使其可被识别; 插件安装教程参考Taro官网&#xff1…

Matlab 点云曲率计算(之二)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 之前已经讨论过许多关于计算曲率的问题,这里使用一个通过拟合三次曲面方程的方式来计算曲率,计算过程如下图所示: 二、实现代码 %********

springboot+bootstarp+jsp房屋租赁系统ssm_t65a9

小型房屋租赁系统主要有管理员、房东和租户三个功能模块。以下将对这三个功能的作用进行详情的剖析。 管理员模块:管理员是系统中的核心用户,管理员登录后,可以对后台系统进行管理。主要功能有个人中心、房东管理、租户管理、房源城市管理、房…

数据库应用:MongoDB 库与集合管理

目录 一、理论 1.MongoDB用户管理 2.MogoDB库管理 3.MogoDB集合管理 二、实验 1.MongoDB用户管理 2.MogoDB库管理 3.MogoDB集合管理 三、问题 1.不显示新创建的数据库 2.插入数据报错 3.删除指定数据库报错 一、理论 1.MongoDB用户管理 (1) 内置角色 数据库用户…

什么是高级语言、机器语言、汇编语言?什么是编译和解释?

1、高级语言 计算机程序是一种让计算机执行特定任务的方法。程序是由程序员用一种称为编程语言的特殊语言编写的。编程语言有很多种,例如 C、C、Java、Python 等。这些语言被称为高级语言,因为它们更接近人类的自然语言,而不是计算机能够直接…

【LeetCode刷题】--38.外观数列

38.外观数列 方法:遍历生成 该题本质上是依次统计字符串中连续相同字符的个数 例如字符串 1112234445666我们依次统计连续相同字符的个数为: 3 个连续的字符 1, 222 个连续的 2,1 个连续的字符 3,3个连续的字符 4,1个连续的字符…

创建一个带有背景图层和前景图层的渲染窗口

开发环境: Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example demo解决问题: 创建一个带有背景图层和前景图层的渲染窗口,知识点:1. 画布转image;2. 渲染图层设置;3.…

如何高效批量生成条形码?

条形码作为商品、库存和信息管理的基础工具,扮演着至关重要的角色。为了满足用户对于高效、专业、多样化的条形码生成需求,我们推出了一款专业高效的在线条形码生成工具。 网址:https://www.1txm.com/ 多样化条形码支持 易条形支持多种常见…

Django请求生命周期流程

浏览器发起请求。 先经过网关接口,Django自带的是wsgiref,请求来的时候解析封装,响应走的时候打包处理,这个wsgiref模块本身能够支持的并发量很少,最多1000左右,上线之后会换成uwsgi,并且还会加…

Redis 主库挂了,如何不间断服务?

目录 1、哨兵机制的基本流程 2、主观下线和客观下线 3、如何选定新的主库? 总结 // 你只管前行,剩下的交给时间 在 reids 主从库集群模式下,如果从库发生故障了,客户端可以继续向主库或其他从库发送请求,进行相关的…

宠物网站的技术 SEO:完整指南

您是宠物行业网站的从业者吗?那么您一定知道,当人们寻找与宠物相关的资源时,在搜索引擎结果中排名靠前有多么重要。 这就是技术SEO的用武之地!它正在调整您网站的后端代码和服务器配置,以在 SERP 中排名更高。 在此&…

PCF8591多通道数据读取异常问题

问题描述 PCF8591在循环读取两个通道时,两个通道数据出现交错问题。 例如我们想实现:第一次读取通道一、第二次读取通道二、第三次读取通道一、第四次读取通道二……依次循环 但实际数据:第一次读取的值为0x80、第二次读取的值为通道一的值、…

西南科技大学C++程序设计实验二(类与对象一)

C++最大的特点就是面向对象,掌握它的几种基本性质还是好理解的,可以看我C++专栏的期末速成,希望对你们学习C++有帮助。 一、实验目的 1.理解简单类的定义、说明与使用 2.理解类中不同属性数据成员的访问特点 3.理解构造函数、析构函数的作用 重点:掌握类的定义与实现,…

java多线程-扩展知识一:进程线程、并发并行、同步异步

1、进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程…

前端入门(三)Vue组件化编程、脚手架、插槽插件、存储、vuex、组件事件、动画、代理

文章目录 Vue 组件化编程 - .vue文件非单文件组件组件的注意点组件嵌套Vue实例对象和VueComponent实例对象Js对象原型与原型链Vue与VueComponent的重要内置关系 应用单文件组件构建 Vue脚手架 - vue.cli项目文件结构组件相关高级属性引用名 - ref数据接入 - props混入 - mixin …

轻巧高效的剃须好工具,DOCO黑刃电动剃须刀上手

剃须刀大家都用过,我比较喜欢电动剃须刀,尤其是多刀头的悬浮剃须刀,感觉用起来很方便,剃须效率也很高。最近我在用一款DOCO小蔻的黑刃电动剃须刀,这款剃须刀轻巧易用,而且性价比超高。 相比于同类产品&…

进程和线程的关系

⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:JavaEE 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 进程&线程 1. 什么是进程PCB 2. 什么是…

ABAP算法 模拟退火

模拟退火算法 算法原理及概念本文仅结合实现过程做简述 模拟退火算法是一种解决优化问题的算法。通过模拟固体退火过程中的原子热运动来寻找全局最优解。在求解复杂问题时,模拟退火算法可以跳出局部最优解获取全局最优解。 模拟退火算法包含退火过程和Metropolis算法…