Java 文件 I/O流详解
文件
文件操作是Java开发中一个重要的组成部分,它允许开发者对文件进行读取,写入,创建,删除和修改等操作,文件操作的主要通过
java.io
包中的类来实现的,其中的File
类更是文件操作的核心类
File类的常用方法
创建文件或目录
文件创建
使用
createNewFile();
可以创建一个新的空文件,如果文件已存在则不建立,并放回false
,反正创建文件并返回true
public class Test1 {
public static void main(String[] args) {
File file = new File("D:\\java_develop\\demo.txt");
//创建一个文件对象其路径为"D:\\java_develop\\demo.txt"
//这一步还没有创建文件
try { //此处的try-catch主要用于捕获未找到文件路径的异常
boolean isFileCreate=file.createNewFile();
//使用createNewFile()方法尝试再指定文件创建文件
//并将其放回值赋值给isFileCreate
if (isFileCreate)
{ //根据isFileCreate的值确定十分已创建了文件
System.out.println("File created successfully");
}
else
{
System.out.println("File already exists");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
该代码执行过后会再D盘下的
java_develop
文件下创建一个demo.txt
的文件目录创建
创建目录实际是在文件系统下生成一个新的目录(也可以称为文件夹),目录可以用于存储文件或者其他的目录,以便将文件分类分组管理
mkdir()
:用于创建File
对象表示的单级目录,若创建的目录没有夫级目录,则不会创建这些夫目录,并返回false
,例如你要在"D:\\java_develop\\demo\\folder”
路径创建目录,若dome目录不存在,则会创建失败
File dir = new File("D:\\java_develop\\demo");
//创建File对象传入其路径 try {
boolean isCreateDir=dir.mkdir();
//使用mkdir()方法创建目录
if (isCreateDir) //通过mkdir()返回值,判断目录是否创建
{
System.out.println("dir creates successfully");
}
else
{
System.out.println("fail to create dir");
}
} catch (Exception e) {
e.printStackTrace();
}
上述代码执行之后会在D盘
java_develop
文件夹下创建一个demo
文件夹mkdirs()
:创建多级目录,于mkdir()
相比之下,mkdirs()
在父目录不存在时,会优先创建父目录,再创建其下的子目录,即使一下目录层次不存在时,也可以创建整个目录路径,从而实现多级目录创建,创建成功返回true
File dir = new File("D:\\java_develop\\demo\\inside");
//创建带有路径的File对象
try {
boolean isDirCreate=dir.mkdirs();//使用mkdirs()创建多级目录
if (isDirCreate)
{
System.out.println("Dir creates successfully");
}
else
{
System.out.println("Failed to create Dir");
}
} catch (Exception e) {
e.printStackTrace();
}
执行后会在D盘
java_develop
下创建demo
文件夹,在demo
文件夹会创建inside
文件夹
获取文件信息
exists()
:判断文件或目录是否存在,存在返回true
,反之返回false
getName()
:返回File
对象的文件或目录的名称字符串getParent()
:获取文件或目录的父级路径,若文件或目录没有父级路径时,则返回null
isFile()
:判断此File
对象是否为文件(而不是目录)isDirectory()
:判断此File对象是否为目录(而不是文件)listFiles()
:回一个File
数组,这些File
对象表示由此File
对象表示的目录中的文件和目录。如果此File
对象不表示一个目录,则此方法返回null
,可以用于获取某个目录下的所有文件夹/名length():
获取文件大小值
File file = new File("D:\\java_develop");
File fileArray[]=file.listFiles();
for (File f : fileArray) {
System.out.println(f.getName());
}
}
删除文件或目录
delete()
:删除文件或空目录。如果删除的是目录,则该目录必须为空,否则删除失败并返回false
File file = new File("D:\\java_develop\\demo.txt");
if (file.exists())
{
file.delete();
}
}
重命名文件
renameTo(File dest)
: 将文件重命名为此File
对象表示的路径名。如果目标文件已存在,则该文件将被删除,然后重命名操作将尝试进行
File file = new File("D:\\java_develop\\demo.txt");
File file1 = new File("D:\\java_develop\\demo1.txt");
if (file.exists())//检查file对象是否存在
{//存在则将其重命名为file1的路径
file.renameTo(file1);
}
}
上述代码运行之后,原本的demo.txt
会更改为demo1.txt
IO流
Java中的
IO(input/output)
是实现输入输出的基础,可以方便的实现数据的输入输出操作,Java把不同的输入/输出源抽象成”流(stream)”,它通过了逐个/块数据的读写方式,流是一种有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两个设备间的传输成为流,流的本质是数据传输。
IO流的类别
- IO流分为字符流和字节流,其中有分为输入流和输出流,如果是音频文件、图片、歌曲、就用字节流好点,如果关系到中文的,用字符流好点。字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串,字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流可以。
以下是IO流的基本分类类别:
字符流
字符流是以字符(char)为最下单位进行读写的数据流.主要用于处理文本数据,如字符,字符串等等.字符流的读写操作是通过
Reader
和Writer
类及其子类实现的
Reader
- 是所有字符输入流的超类,它定义了一些基本方法,如
read(),ready(),skip()
,和close()
int read()
:返回的数据类型为int
类型,读取单个字符时,返回的是其的Unicode
值,读取到流的末尾时,返回-1int read( char []ch)
:将字符写入数组,并返回读取的字符数,读取到流的末尾时,返回-1void close()
:关闭流,释放与之关联的资源
Writer
- 是所有字符输出流的超类
void write(int c)
:写入单个字符void write(char []ch)
:写入字符数组void write(char[] cbuf)
或void write(char[] cbuf, int off, int len)
:写入字符数组或字符数组的一部分。同样,这些方法也没有返回值void flush()
:刷新writer的缓冲区,会强制所有缓冲字符被写出void close()
: 关闭该writer,并释放其所有与系统相关的资源,每次输出完都要进行close()
操作,因为可能缓冲区的字符还没写入,用close()
进行强制写出
Buffered
Buffered
机制具体来说是在内存中创建一个缓冲区,来减少实际I/O流的操作次数- 底层原理:数据首先会被写入或被读入内存中的缓冲区,而不是直接进行I/O操作.一旦缓冲区满了或到达某个条件(如显性的调用
flush()
方法),缓冲区的内容会被一次性的写入或被次磁盘读取 - Buffered与File的区别:
File | Buffered(以BufferedReader为例) | |
---|---|---|
定义与功能 | 封装了文件系统的操作功能,关注文件在磁盘上的存储。 | 提供带有缓冲区的输入/输出方式,关注数据的高效读取/写入。 |
主要方法 | getName(), getPath(), exists(), createNewFile(), delete()等。 | read(), readLine(), mark(), reset()等(BufferedReader特有)。 |
用途 | 用于表示文件和目录的路径名,进行文件或目录的创建、删除、重命名等操作。 | 用于高效地读取文本数据,特别是大文件。 |
处理数据的方式 | 直接操作文件系统的文件或目录,不涉及数据的缓冲处理。缓冲区为8192字节 | 通过内部缓冲区来减少I/O操作的次数,提高数据处理的效率。缓冲区为8192字符 |
try {
FileReader reader = new FileReader("D:\\java_develop\\demo1.txt");
FileWriter writer = new FileWriter("D:\\java_develop\\output.txt");
int ch;
while((ch=reader.read())!=-1)
{// 若read返回-1说明读取到文件末尾则直接跳出循环
writer.write(ch);
}
reader.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
字节流
是用于处理原始字节数据,字节流非常适合用于处理二进制文件,如照片,音频,视频或任何非文本格式的数据.Java中的字节流的基本类是
InputStream
和OutputStream
InputStream和OutStream
InputStream
:用于从数据源读取字节数据.数据源可以是文件,网络连接,内存中的字节数组等等OutputStream
:用于向目的地写入字节数据,与InputStream
一样的数据源可以是文件,网络连接,内存中的字节数组等等
基本操作方法
int InputStream.read()
: 读取单个字节或字节数组,返回值为int
类型int InputStream.read(byte b[])
:将读取的数据存在在byte b[]
数组中void OutputStream.write(int b)
: 写入单个字节void OutputStream.write(byte b[])
:将byte b[]数组中的数据写入void OutputStream.write(byte[] b, int off, int len)
: 写入字节数组的指定部分。close()
: 关闭流,释放系统资源。getBytes()
:获取字节数组- 节点流
FileInputStream
和FileOutputStream
:用于读写文件中的字节数据。ByteArrayInputStream
和ByteArrayOutputStream
:用于在内存中读写字节数组。Socket.getInputStream()
和Socket.getOutputStream()
:用于处理网络连接中的字节数据传输。
- 过滤流
BufferedInputStream
和BufferedOutputStream
:为字节流添加缓冲机制,以提高读写效率。DataInputStream
和DataOutputStream
:提供读写基本数据类型(如int
,double
等)的能力。ObjectInputStream
和ObjectOutputStream
:用于对象的序列化和反序列化,即对象的读写。
try {
FileInputStream inputStream = new FileInputStream("D:\\java_develop\\input.txt");
FileOutputStream outputStream = new FileOutputStream("D:\\java_develop\\output.txt");
byte[] bytes = new byte[1024]; //设置缓冲区1024B
int len;
while ((len=inputStream.read(bytes))!=-1)//将读取的数据存入缓冲区
{
outputStream.write(bytes,0,len);//将缓冲区的数据写入
}
inputStream.close();
outputStream.close();//关闭流
} catch (IOException e) {
e.printStackTrace();
}
以上实例是从把input.txt
的内容复制至output.txt
中
Java 文件 I/O流详解的更多相关文章
- 一个 java 文件的执行过程详解
平时我们都使用 idea.eclipse 等软件来编写代码,在编写完之后直接点击运行就可以启动程序了,那么这个过程是怎么样的? 总体过程 我们编写的 java 文件在由编译器编译后会生成对应的 cla ...
- Java中的缓冲流详解
缓冲流增强了读写文件的能力,比如Student.txt是一个学生的名单,每个姓名占一行.如果我们想要读取名字,那么每次必须读取一行,使用FileReader流很难完成这样的任务,因为我们不清楚一行有多 ...
- java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET
java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET 亲,“社区之星”已经一周岁了! 社区福利快来领取免费参加MDCC大会机会哦 Tag功能介绍—我们 ...
- 使用Java操作文本文件的方法详解
使用Java操作文本文件的方法详解 摘要: 最初java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了Reader和Writer两个类 最初java是不支持对文本文件的处理的,为了弥补这个缺憾而 ...
- Java网络编程和NIO详解开篇:Java网络编程基础
Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为 ...
- Java基础-面向接口编程-JDBC详解
Java基础-面向接口编程-JDBC详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.JDBC概念和数据库驱动程序 JDBC(Java Data Base Connectiv ...
- Java网络编程和NIO详解4:浅析NIO包中的Buffer、Channel 和 Selector
Java网络编程与NIO详解4:浅析NIO包中的Buffer.Channel 和 Selector 转自https://www.javadoop.com/post/nio-and-aio 本系列文章首 ...
- Java网络编程和NIO详解3:IO模型与Java网络编程模型
Java网络编程和NIO详解3:IO模型与Java网络编程模型 基本概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32 ...
- Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制
Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制 JAVA 中原生的 socket 通信机制 摘要:本文属于原创,欢迎转载,转载请保留出处:https://github.co ...
- 基于JavaSE阶段的IO流详解
1.IO流基本概述 在Java语言中定义了许多针对不同的传输方式,最基本的就是输入输出流(俗称IO流),IO流是属于java.io包下的内容,在JavaSE阶段主要学下图所示的: 其中从图中可知,所有 ...
随机推荐
- kettle从入门到精通 第三十九课 kettle 增量同步(日级)
1.上一课我们学习了在数据量大的情况下的分页全量同步示例,本次我们一起学习下kettle 增量全量同步.有些业务场景不需要实时数据,比如统计t-1日的销售业绩情况等. 2.kettle增量全量同步 ...
- OpenSpeedTest-Server局域网速度测试服务程序
OpenSpeedTest-Server局域网速度测试服务程序,局域网测速.
- SonarQube代码质量扫描工具
1.什么是SonarQube 既然是学习devops 运维流水线构建 开发 ↓ 测试 ↓ 运维 华为devops软件开发流水线文档 https://support.huaweicloud.com/re ...
- apollo配置中心从数据库中查询所有的配置及项目
apollo配置中心从数据库中查询所有的配置及项目 需求背景:如果需要从Apollo查询某个配置项做批量的更新替换,如果一个一个找不合适且容易遗漏,需要从底层数据库表中模糊查询来实现. 1.查看apo ...
- java rabbitmq模拟生产者,消费者demo
1.exchange类型,rabbitmq交换机类型 exchange类型fanout 扇形交换机,它会把所有发送到该交换机的消息路由到所有与该交换机绑定的队列中.direct 直连交换机,它会把消息 ...
- Docker安装mysql配置my.cnf并挂载到外部机器
1.环境准备,创建外部挂载文件夹conf,data,log mkdir -p /data/dockerdata/mysql3306/{conf,data,log} 2.在/data/dockerdat ...
- 认真学习CSS3-问题收集-101号-莫名其妙的row行高
其他人都有事情,有些事情只好自己上阵,自己做,最踏实! 做了两个基本一样的页面,都是采用bootsrap+jquey+js的技术,业务内容就是简单的查询,加上一些简单的效果,没有啥特别的内容. 由于历 ...
- Linux OpenGrok搭建
目录 一.目的 二.环境 三.相关概念 3.1 OpenGrok 3.2 CTags 3.3 Tomcat 四.OpenGrok搭建 4.1 安装jdk 4.2 安装ctags依赖 4.3 安装uni ...
- SpringBoot动态数据源配置
SpringBoot动态数据源配置 序:数据源动态切换流程图如下: 1:pom.xml文件依赖声明 <dependency> <groupId>org.springfram ...
- python重拾第十三天-那就做个堡垒机吧
本节内容 项目实战:运维堡垒机开发 前景介绍 到目前为止,很多公司对堡垒机依然不太感冒,其实是没有充分认识到堡垒机在IT管理中的重要作用的,很多人觉得,堡垒机就是跳板机,其实这个认识是不全面的,跳板功 ...