java基础-IO

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 :先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【问题系列】消费者与MQ连接断开问题解决方案(一)

1. 问题描述 当使用RabbitMQ作为中间件,而消费者为服务时,可能会出现以下情况:在长时间没有消息传递后,消费者与RabbitMQ之间出现连接断开,导致无法处理新消息。解决这一问题的方法是重启Python消费者服务,…

redis运维(二十二)redis 的扩展应用 lua(四)

一 最佳实践 ① 铺垫 最佳实践:1、把redis操作所需的key通过KEYS进行参数传递2、其它的lua脚本所需的参数通过ARGV进行传递. redis lua脚本原理 Redis Lua脚本的执行原理 ② 删除指定的脚本缓存 ③ redis集群模式下使用lua脚本注意事项 1、常见报错现象 C…

草图大师sketchup道路怎么快速种树?

草图大师sketchup道路怎么快速种树?草图大师中的道路图纸想要在道路两旁种树,该怎么快速给道路种树呢?下面我们就来看看详细的教程,需要的朋友可以参考下 草图大师sketchup中想要快速种树,该怎么种多棵树呢&#xff1…

别太担心,人类只是把一小部分理性和感性放到了AI里

尽管人工智能(AI)在许多方面已经取得了重大进展,但它仍然无法完全复制人类的理性和感性。AI目前主要侧重于处理逻辑和分析任务,而人类则具有更复杂的思维能力和情感经验。 人类已经成功地将一些可以数据化和程序化的理性和感性特征…

JavaEE进阶学习:Bean 作用域和生命周期

1.Bean 作用域 .通过一个案例来看 Bean 作用域的问题 假设现在有一个公共的 Bean,提供给 A 用户和 B 用户使用,然而在使用的途中 A 用户却“悄悄”地修改了公共 Bean 的数据,导致 B 用户在使用时发生了预期之外的逻辑错误。 我们预期的结果…

leaflet对线设置渐变色

效果展示: 引用leaflet-polycolor组件 npm install leaflet-polycolor .vue文件中使用 import leafletPolycolor from leaflet-polycolor; leafletPolycolor(L); const latLngs [[37.03, 111.92], [37.53444, 111.98555], [36.88, 112.12], [37.53444, 112.24], […

Redis深入理解-主从架构下内核数据结构、主从同步以及主节点选举

Redis 主从挂载后的内核数据结构分析 主节点中,会通过 clusteNode 中的 slaves 来记录该主节点包含了哪些从节点,这个 slaves 是一个指向 *clusterNode[] 数组的数据结构从节点中,会通过 clusterNode 中的 slaveof 来记录该从节点属于哪个主…

04_Flutter自定义Slider滑块

04_Flutter自定义Slider滑块 一.Slider控件基本用法 Column(mainAxisAlignment: MainAxisAlignment.start,children: <Widget>[Text("sliderValue: ${_sliderValue.toInt()}"),Slider(value: _sliderValue,min: 0,max: 100,divisions: 10,thumbColor: Colors.…

《微信小程序开发从入门到实战》学习三十四

4.2 云开发JSON数据库 MySQL、Oracle之类的“关系型数据库”。JSON数据库是“非关系型数据库”&#xff0c;没有行表列的概念。 4.2.1 JSON数据库基本概念 集合:一个数据库有多个集合&#xff0c;一个集合存储通常是同一类数据&#xff0c;可看作为JSON数组&#xff0c;数组…

webpack具体实现--未完

1、前端模块打包工具webpack webpack 是 Webpack 的核心模块&#xff0c;webpack-cli 是 Webpack 的 CLI 程序&#xff0c;用来在命令行中调用 Webpack。webpack-cli 所提供的 CLI 程序就会出现在 node_modules/.bin 目录当中&#xff0c;我们可以通过 npx 快速找到 CLI 并运行…

Chrome 访问不了项目?10080端口 ERR_UNSAFE_PORT:问题原因 / 解决方案

文章目录 被禁用端口列表解决方法方法一、更换端口 / 使用代理 / 使用域名方法二、对浏览器下手WindowsMac 最近有客户反馈&#xff0c;在chrome浏览器中访问不了项目&#xff0c;其他浏览器都是正常的。 &#xff1f;奇了怪了&#xff0c;难道客户对chrome做了什么操作&#x…

Asp.net core WebApi 配置自定义swaggerUI和中文注释

1.创建asp.net core webApi项目 默认会引入swagger的Nuget包 <PackageReference Include"Swashbuckle.AspNetCore" Version"6.2.3" />2.配置基本信息和中文注释&#xff08;默认是没有中文注释的&#xff09; 2.1创建一个新的controller using Micr…

直接插入排序和希尔排序

前言 我们前面几期介绍了线性和非线性的基本数据结构。例如顺序表、链表、栈和队列、二叉树等~&#xff01;本期和接下来的几期我们来详解介绍各个排序的概念、实现以及性能分析&#xff01; 本期内容 排序的概念以及其运用 常见的排序算法 直接插入排序 希尔排序 一、排序的…

Leetcode算法系列| 3. 无重复字符的最长子串

目录 1.题目2.题解C# 解法一&#xff1a;滑动窗口算法C# 解法二&#xff1a;索引寻找Java 解法一&#xff1a;滑动窗口算法Java 解法二&#xff1a;遍历字符串 1.题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例1: 输入: s "ab…

力扣141-环形链表

文章目录 力扣141-环形链表示例代码实现要点剖析 力扣141-环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测…

源码剖析 Spring Security 的实现原理

Spring Security 是一个轻量级的安全框架&#xff0c;可以和 Spring 项目很好地集成&#xff0c;提供了丰富的身份认证和授权相关的功能&#xff0c;而且还能防止一些常见的网络攻击。我在工作中有很多项目都使用了 Spring Security 框架&#xff0c;但基本上都是浅尝辄止&…

C语言——输入两个正整数 m 和 n。求其最大公约数和最小公倍数。

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int m, n;int i;int x 1;int y 0;printf("请输入两个正整数m和n&#xff1a;\n");scanf("%d,%d", &m, &n);for (i 1; i < m && i < n; i) {if (m % i 0 …

【doccano】文本标注工具——安装运行教程

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 【doccano】文本标注工具 doccano简介安装doccano1. 创建并激活虚拟环境2. 安装doccano 运行Doccano访问Doccano doccano简介 doccano是一个开源的文本注释工具。它为文本分类、序列标记和序列到序列任务提供注释…

Axios 并发请求指南 - 3 种简单实用的方法

在实际开发中&#xff0c;我们经常需要同时发送多个请求&#xff0c;并在所有请求完成后进行处理&#xff0c;这就是所谓的并发请求。实现 Axios 并发请求的关键是使用 Axios.all 方法&#xff0c;它接受一个 Promise 的数组作为参数&#xff0c;当这些 Promise 都 resolve 时&…

【C++】杨辉三角详解和C++代码示例

杨辉三角的每行第i个数是由上一行的第i-1个数和第i个数相加得到的&#xff0c;且每行的第一个数和最后一个数都是1&#xff0c;每行的中间个数等于它两肩上的数字相加。 目录 C代码输出结果8行输出15行输出25行输出 C代码 #include <iostream> #include <vector>…