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());// trueSystem.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());// falseSystem.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());// trueSystem.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.mzph.cn/news/178916.shtml

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

相关文章

Linux系统编程 day06 进程间通信

进程间通信 1. 进程间通信的概念2. 匿名管道pipe3. 命名管道FIFO4. 内存映射区 1. 进程间通信的概念 在Linux的环境下,进程地址空间是相互独立的,每个进程有着各自不同的用户地址空间。一个进程不能访问另一个进程中的内容,要进行数据交换必…

STM32F103C8T6第7天:

1. 智能小车:让小车动起来(360.64) 硬件接线 B-2A – PB0B-1A – PB1A-1B – PB2A-1A – PB10其余接线参考上官一号小车项目。 cubemx配置 代码(28.smartCar_project1/MDK-ARM) 2. 智能小车:串口控制小…

简要介绍Spring原生框架与Spring是轻量级框架的原因

😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783…

别再让假的fiddler教程毒害你了,来看这套最全最新的fiddler全工具讲解

fiddler界面工具栏介绍 添加图片注释,不超过 140 字(可选) (1)WinConfig:windows 使用了一种叫做“AppContainer”的隔离技术,使得一些流量无法正常捕获,在 fiddler中点击 WinConfig…

Vue指令之v-html

在Vue中有很多特殊的标签属性,这些属性一般以’v’开头,用于在标签中实现特殊的功能。 例如,当Vue实例的data是一个inner html,我们想在网页上渲染这部分html,如果依然使用之前的{{ variable }},则只会将i…

单片机复位电路

有时候我们的代码会跑飞,这个时候基本上是一切推到重来.”推倒重来”在计算机术语上称为复位.复位需要硬件的支持,复位电路就是在单片机的复位管脚上产生一个信号,俗称复位信号.这个信号需要持续一定的时间,单片机收到该信号之后就会复位,从头执行。 复位原理: 那么…

【视觉SLAM十四讲学习笔记】第三讲——四元数

专栏系列文章如下: 【视觉SLAM十四讲学习笔记】第一讲——SLAM介绍 【视觉SLAM十四讲学习笔记】第二讲——初识SLAM 【视觉SLAM十四讲学习笔记】第三讲——旋转矩阵 【视觉SLAM十四讲学习笔记】第三讲——Eigen库 【视觉SLAM十四讲学习笔记】第三讲——旋转向量和欧…

anaconda换源安装pytorch(附带bug解决办法)

1.安装anaconda 如何安装anaconda可以看这篇文章:如何安装anaconda 2.换源安装pytorch: 首先进入到pytorch官网,选对好参数之后复制命令进入到anaconda prompt即可: 然后进入自己的环境之后输入该命令(即conda install …),则可以进行下载。下载完成…

【DevOps】SonarQube 指标解读

SonarQube 指标解读 1.BUG 评级计算方法(可靠性)2.漏洞评级计算方法(安全性)3.债务和坏味道4.覆盖率4.1 代码覆盖率4.2 分支覆盖率4.3 单元测试覆盖率 5.重复 1.BUG 评级计算方法(可靠性) ✅ A&#xff1a…

1128. 等价多米诺骨牌对的数量

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/number-of-equivalent-domino-pa…

Day12 qt QMianWindow,资源文件,对话框,布局方式,常用ui控件

QMianWindow 概述 QMainWindow 是一个为用户提供主窗口程序的类,包含一个菜单栏( menu bar )、多 个工具栏 (tool bars) 、多个铆接部件 (dock widgets) 、一个状态栏 (status bar) 及 一个中心部件 (central widget) 许多应用程序的基础…

postgresql-shared_buffers参数详解

shared_buffers 是 PostgreSQL 中一个非常关键的参数,用于配置服务器使用的共享内存缓冲区的大小。这些缓冲区用于存储数据页,以便数据库可以更快地访问磁盘上的数据。 这个参数在 PostgreSQL 的性能方面有着重要的影响。增加 shared_buffers 可以提高数…

【并发编程】ConcurrentHashMap底层结构和原理

📫作者简介:小明Java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于…

wmvcore.dll丢失怎么办?解决电脑出现wmvcore.dll丢失问题5个方法

wmvcore.dll缺失5个解决方法与wmvcore.dll丢失原因及文件介绍 引言: 在日常使用电脑的过程中,我们可能会遇到一些错误提示,其中之一就是wmvcore.dll缺失。wmvcore.dll是Windows Media Video编码解码相关动态链接库文件之一,它对…

Linux 项目自动化构建工具:make/makefile

什么是 make make 是一个命令,他会在源文件的当前目录下寻找 makefile 或者 Makefile 文件执行这个文件中的代码。 makefile 文件的编写 我们先来见见猪跑,看看 make 怎么用的: 下面是 makefile 文件的内容: 这是 test.c 中的…

WPF创建进度条

使用wpf做一个原生的进度条,进度条上面有值,先看效果。 功能就是点击按钮,后台处理数据,前台显示处理数据的变化,当然还可以对进度条进行美化和关闭的操作,等待后台处理完毕数据,然后自动关闭。…

Python入职某新员工大量使用Lambda表达式,却被老员工喷是屎山

Python中Lambda表达式是一种简洁而强大的特性,其在开发中的使用优缺点明显,需要根据具体场景权衡取舍。 Lambda表达式的优点之一是它的紧凑语法,适用于一些短小而简单的函数。这种形式使得代码更为精炼,特别在一些函数式编程场景中,Lambda表达式可以提高代码的表达力。此外…

DMX512协议及对接口电路的分析

1、DMX512协议简介 DMX 是Digital MultipleX 的缩写,意为多路数字传输(具有512条信息的数字多路复用”)。DMX512控制协议是美国舞台灯光协会(usITT)于1990年发布的灯光控制器与灯具设备进行数据传输的工业标准,全称是USITTDMX512(1990); DMX512 在其物理…

福州大学《嵌入式系统综合设计》 实验八:FFMPEG视频编码

一、实验目的 掌握使用算能平台进行视频编码的流程,包括开发主机环境与云平台的配置,视频编码程序的编写与理解,代码的编译、运行以及学习使用码流分析工具分析视频压缩码流等。 二、实验内容 搭建实验开发环境,编译并运行编码…

Spring Boot 3.2.0 虚拟线程初体验 (部分装配解析)

写在前面 spring boot 3 已经提供了对虚拟线程的支持。 虚拟线程和平台线程主要区别在于,虚拟线程在运行周期内不依赖操作系统线程:它们与硬件脱钩,因此被称为 “虚拟”。这种解耦是由 JVM 提供的抽象层赋予的。 虚拟线程的运行成本远低于平…