-
Java IO流 简介
1、File类#
1.1 概述#
File类用于封装系统的文件和目录的相关信息。在该类中定义了一些与平台无关的方法来操作文件。例如文件的大小、修改时间、文件路径等。
1.2 构造方法#
Copy
//将给定的路径名转化为字符串
public File(String pathname);
//从父路径名字符串和子路径名字符串创建新的File实例
public File(String parent, String Child);
//从父抽象路径名和子路径名字符串创建新File的实例
public File(File parent, String Child);
1.3 常用方法#
方法名 返回值 说明
getName String 获取文件名称
getParent String 获取文件的父路径字符串
getPath String 获取文件的相对路径字符串
getAbsolutePath String 获取文件的绝对路径字符串
exists boolean 判断文件或者文件夹是否存在
isFile boolean 判断是不是文件类型
isDirectory boolean 判断是不是文件夹类型
delete boolean 删除文件或文件夹,如果删除成功返回结果为true
mkdir boolean 创建文件夹,创建成功返回true
setReadOnly boolean 设置文件或文件夹的只读属性
length long 获取文件的长度
lastModified long 获取文件的最后修改时间
list String[ ] 获取文件夹中的文件和子文件夹的名称,并存放到字符串数组中
1.3.1 获取方法#
Copy
public String getName();
public String getParent();
public String getPath();
public String getAbsolutePath();
代码演示如下:
Copy
import java.io.File;
public class Test01 {
public static void main(String[] args) {
String filePath = "src/com/kimari/day01/Test01.java";
String path = "src";
//测试文件路径
File file1 = new File(filePath);
System.out.println("文件绝对路径:" + file1.getAbsolutePath());
System.out.println("文件构造路径:" + file1.getPath());
System.out.println("文件名称:" + file1.getName());
System.out.println("文件长度:" + file1.length());
//测试目录路径
File file2 = new File(path);
System.out.println("目录绝对路径:" + file2.getAbsolutePath());
System.out.println("目录构造路径:" + file2.getPath());
System.out.println("目录名称:" + file2.getName());
System.out.println("目录长度:" + file2.length());
}
}
/*输出结果
* 文件绝对路径:D:\Project\java\IO\src\com\kimari\day01\Test01.java
* 文件构造路径:src\com\kimari\day01\Test01.java
* 文件名称:Test01.java
* 文件长度:0
* 目录绝对路径:D:\Project\java\IO\src
* 目录构造路径:src
* 目录名称:src
* 目录长度:0
* */
1.3.2 判断方法#
Copy
public boolean exists();
public boolean isDirectory();
public boolean isFile();
代码演示如下:
Copy
import java.io.File;
public class Test02 {
public static void main(String[] args) {
String path1 = "src/com/kimari/day01/Test02.java";
String path2 = "src/com";
File f1 = new File(path1);
File f2 = new File(path2);
//判断是否存在
System.out.println("path1 是否存在:" + f1.exists());
System.out.println("path2 是否存在:" + f2.exists());
//判断是文件还是目录
System.out.println("path1 是否是文件:" + f1.isFile());
System.out.println("path2 是否是目录:" + f2.isDirectory());
}
}
/*输出结果
* path1 是否存在:true
* path2 是否存在:true
* path1 是否是文件:true
* path2 是否是目录:true
* */
1.3.3 创建删除方法#
Copy
public boolean createNewFile();
public boolean delete();
public boolean mkdir();
代码演示如下:
Copy
import java.io.File;
import java.io.IOException;
public class Test03 {
public static void main(String[] args) throws IOException {
//文件的创建
File f = new File("kimariyb.txt");
System.out.println("是否存在:" + f.exists());
System.out.println("是否创建:" + f.createNewFile());
System.out.println("是否存在:" + f.exists());
//目录的创建
File f2 = new File("new");
System.out.println("是否存在:" + f2.exists());
System.out.println("是否创建:" + f2.mkdir());
System.out.println("是否存在:" + f2.exists());
//删除目录和文件
File f3 = new File("new");
System.out.println("是否存在:" + f3.exists());
System.out.println("是否删除:" + f3.delete());
System.out.println("是否存在:" + f3.exists());
}
}
/*输出结果
* 是否存在:false
* 是否创建:true
* 是否存在:true
* 是否存在:false
* 是否创建:true
* 是否存在:true
* 是否存在:true
* 是否删除:true
* 是否存在:false
* */
在使用delete()方法删除File对象时,如果删除的对象是目录,该目录中的内容必须为空。
1.3.4 遍历目录#
可以使用list()方法来遍历目录
代码演示如下:
Copy
import java.io.File;
public class Test04 {
public static void main(String[] args) {
File file = new File("D:\\Project\\java\\IO\\IO流\\src\\com\\kimari\\day01");
String[] arr = file.list();
if (arr != null) {
for (String s : arr) {
System.out.println(s);
}
}
}
}
/*输出结果
* Test01.java
* Test02.java
* Test03.java
* Test04.java
* */
2、字节流#
字节流用于处理二进制数据的读取和写入,它以字节为单位,InputStream类和OutputStream类是字节流的抽象类,它们定义了数据流读取和写入的基本方法。各个子类会依其特点实现或覆盖这些方法。
2.1 InputStream#
InputStream 类是字节输入流的抽象类,定义了操作输入流的各种方法。
InputStream 类是抽象类,不能通过new关键字来创建该实例对象,需要其子类创建该实例对象。
2.1.1 常用方法#
方法 返回 说明
available() int 返回当前输入流的数据读取方法可以读取的有效字节数量
read() Abstract int 从当前数据流中读取一个字节。若已达到流结尾,则返回-1
read(byte[ ] bytes) int 从当前输入流读取一定的byte数据,并存取在数组中,然后返回读取的byte数据的数量,若已到达流结尾,则返回-1。
reset() void 将当前的输入流重新定位到最后一次调用mark()方法时的位置
mark(int readlimit) void 在当前输入流中做标记位置,当调用reset()方法时将返回到该位置,从标记位置开始,到再读入readlimit个字符为止,这个标记都维持有效。
markSupported() Boolean 测试当前输入流是否支持mark()和reset()方法,只要其中一个不支持,则返回false
skip(long n) long 跳过和丢弃当前输入的n个字节数据
close() void 关闭当前输入流,并释放任何与之相关联的系统资源
2.1.2 FileInputStream 类#
文件字节输入流可以从指定路径的文件中读取字节数据。文件字节输入流类继承InputStream类,并实现了读取输入流的各种方法。
以File对象为参数创建FileInputStream实例
new FileInputStream(File file)
以文件对象的绝对路径为参数创建FIleInputStream实例
new FileInputStream(String filepath)
2.1.3 实例#
Copy
import java.io.FileInputStream;
import java.io.IOException;
public class Test01 {
public static void main(String[] args) throws IOException {
//创建FileInputStream对象
FileInputStream fileInputStream = new FileInputStream("D:\\Project\\java\\IO\\IO流\\src\\kimari.txt");
//使用read方法读取
int len = 0;
byte[] buffer = new byte[1024];
while ((len = fileInputStream.read(buffer)) != -1) {
System.out.println(new String(buffer, 0, len));
}
fileInputStream.close();
}
}
/*输出结果
* 123456
* */
2.2 OutputStream#
和InputStream类一样,OutputStream 类是抽象类,不能通过new关键字来创建该实例对象,需要其子类创建该实例对象。
2.2.1 常用方法#
方法 返回 说明
write(byte[ ] b) void 将byte[ ] 数组中的数据写入当前输出流
write(byte[] b ,int off, int len) void 将byte[ ]数组下标off开始的len长度的数据写入当前输出流
write(int b) Abstract void 写入一个byte数据到当前输出流
flush() void 刷新当前输出流,并强制写入所有缓冲的字节数据
close() void 关闭当前输出流
2.2.2 FileOutputStream类#
文件字节输出流关联指定文件路径的文件,数据通过文件字节输出流以字节为单位输出并保存到文件中。文件字节输出流继承自OutputStream类,并实现OutputStream类的各种方法。
以File对象为参数创建FileOutputStream实例
new FileOutputStream(File file)
以文件对象的绝对路径为参数创建FIleOutputStream实例
new FileOutputStream(String filepath)
2.2.3 实例#
Copy
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class Test02 {
public static void main(String[] args) throws IOException {
//创建FileOutputStream对象
FileOutputStream fos = new FileOutputStream("D:\\Project\\java\\IO\\IO流\\src\\kimari.txt",true);
//写入字节
String string = "hello world";
fos.write(string.getBytes(StandardCharsets.UTF_8));
//关闭流
fos.close();
}
}
/*目标文件
* hello world
* */
FileOutputStream 构造方法中将属性Append设置为true,可以取消覆盖。
2.3 字节流复制文件#
Copy
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class Test03 {
public static void main(String[] args) throws Exception {
//创建输入流
FileInputStream fis = new FileInputStream("D:\\userData\\桌面\\CNblogs-Theme-Sakura\\20200507035632481.jpg");
//创建输出流
FileOutputStream fos = new FileOutputStream("D:\\userData\\桌面\\CNblogs-Theme-Sakura\\2.jpg");
//读数据
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
//关闭流
fos.close();
fis.close();
}
}
2.4 字节缓冲流#
2.4.1 缓冲流#
提高IO效率,减少访问磁盘的次数
数据存储在缓冲区,flush是将缓存区的内容写入文件中,也可以直接close
2.4.2 BufferedInputStream#
new BufferedInputStream(FileInputStream fis)
操作实例
Copy
import java.io.BufferedInputStream;
import java.io.FileInputStream;
public class Test04 {
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream("D:\\Project\\java\\IO\\IO流\\src\\kimari.txt");
BufferedInputStream bfis = new BufferedInputStream(fis);
//读取
byte[] buffer = new byte[1024];
int len = 0;
while ((len = bfis.read(buffer)) != -1) {
System.out.println(new String(buffer, 0, len));
}
//关闭
bfis.close();
fis.close();
}
}
2.4.3 BufferedOutputStream#
new BufferedOutputStream(FileOutputStream fos)
操作实例
Copy
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.nio.charset.StandardCharsets;
public class Test05 {
public static void main(String[] args) throws Exception {
FileOutputStream fos = new FileOutputStream("D:\\Project\\java\\IO\\IO流\\src\\kimari.txt",true);
BufferedOutputStream bfos = new BufferedOutputStream(fos);
//写入文件
for (int i = 0; i < 10; i++) {
bfos.write("Hello World\r\n".getBytes(StandardCharsets.UTF_8));//写入8K缓冲区
bfos.flush();//刷新到硬盘
}
//关闭
bfos.close();
fos.close();
}
}
3、字符流#
Copy
字符输入输出流 与 字节输入输出流有相同的功能,但传送数据的方式不一样,字节流以字节为单位传送数据,可以使任何类型的数据,例如文本、音频、视频、图片等。
字符流以字符为单位传送数据,只能传送文本类型的数据。使用字符输入输出流的好处是,当读取中文时不会出现乱码问题,而使用字节输入输出流时,却不能保证这一点。
3.1 Reader#
3.1.1 常用方法#
方法 返回 说明
ready() boolean 判断此数据流是否准备好
read() int 读入一个字符,若已读到流结尾,则返回值为-1
read(char[ ]) int 读取一些字符到char[ ]数组内,并返回所读入的字符的数量,若已到达流结尾,则返回-1
read(char[ ] chars,int off,int len) Abscract int 读取一些字符到char[ ]数组下标从off开始到off+len的位置,并返回所读入的字符的数量,若已到达流结尾,则返回-1;
reset() void 将当前输入流重新定位到最后一次mark()方法时的位置
mark(int readLimit) void 将当前输入流中做标记,当调用reset方法时将返回到该位置,从标记位置开始,到再读入readLimit个字符为止,这个标记都维持有效
markSupported boolean 测试当前输入流是否支持mark()方法和reset()方法。只要有一个方法不支持,则返回-1
skip(long n) long 跳过参数n指定的字符数量,并返回所跳过字符的数量
close() Abstract void 关闭字符输入流,并释放与之关联的所有资源
3.1.2 FileReader类#
文件字符输入流与文件字节输入流的功能相似,但是传送数据的方式不一样,字节流以字节为单位传送数据,可以使文本、视频、音频、图片等。字符流以字符为单位传送数据,只能传送文本类型的数据。
创建字符输入流常用的构造方法:
new FileReader (File file)
new FileReader (String path)
3.1.3 实例#
Copy
import java.io.FileReader;
public class Test01 {
public static void main(String[] args) throws Exception {
//创建FileReader 文件字符输入流
FileReader reader = new FileReader("D:\\Project\\java\\IO\\IO流\\src\\kimari.txt");
//读取
char[] buffer = new char[1024];
int len = 0;
while ((len = reader.read(buffer)) != -1) {
System.out.println(new String(buffer, 0, len));
}
//关闭
reader.close();
}
}
3.2 Writer#
Writer 类主要是用于解决字符输入流的类,其地位与Reader类在输入流的地位和作用是相同的,也是所有字符输出流的流类。
3.2.1 常用方法#
方法 返回 说明
write(char[ ] cbuf) void 将字符数组的数据写入字符输出流
write(char[ ] cbuf int off ,int len) Abstract void 将字符数组从下标off 开始向输入流写入长度为len的数据
write(int c ) void 向字符输入流中写入一个字符数据
write(String str ) void 向输入流中写入一个字符串数据
write(String str , int off ,int len) void 向输入流中写入一个字符串从off 开始长度为len的数据
flush() Abstract void 刷新当前输出流,并强制写入所有缓冲区的字节数据
close() void 向输出流中写入缓冲区的数据,然后关闭当前输出流,释放所有与当前输出流相关联的系统资源
3.2.2 FileWriter类#
文件字符输出流继承自Writer类,提供了向文件输出的各种方法,数据通过文件字符输出流以字符为单位输出并保存到文件中。
3.2.3 实例#
Copy
import java.io.FileWriter;
public class Test02 {
public static void main(String[] args) throws Exception {
//创建对象
FileWriter writer = new FileWriter("D:\\Project\\java\\IO\\IO流\\src\\kimari.txt", true);
//写入
for (int i = 0; i < 10; i++) {
writer.write("世界");
writer.flush();
}
//关闭
writer.close();
System.out.println("执行完毕");
}
}
3.3 字符流复制文件#
使用字符流复制文件,有且仅能复制文本文件
Copy
import java.io.FileReader;
import java.io.FileWriter;
public class Test03 {
public static void main(String[] args) throws Exception{
//创建流
FileReader reader = new FileReader("D:\\Project\\java\\IO\\IO流\\src\\kimari.txt");
FileWriter writer = new FileWriter("D:\\Project\\java\\IO\\IO流\\src\\kimari2.txt");
//读写
int len = 0;
while ((len = reader.read()) != -1) {
writer.write(len);
writer.flush();
}
//关闭流
reader.close();
writer.close();
}
}
出处:https://www.cnblogs.com/kimariyb/p/15132055.html
最新更新
python爬虫及其可视化
使用python爬取豆瓣电影短评评论内容
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比