Java IO流 简介
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java IO流 简介相关的知识,希望对你有一定的参考价值。
1、File类
1.1 概述
File
类用于封装系统的文件和目录的相关信息。在该类中定义了一些与平台无关的方法来操作文件。例如文件的大小、修改时间、文件路径等。
1.2 构造方法
//将给定的路径名转化为字符串
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 获取方法
public String getName();
public String getParent();
public String getPath();
public String getAbsolutePath();
代码演示如下:
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 判断方法
public boolean exists();
public boolean isDirectory();
public boolean isFile();
代码演示如下:
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 创建删除方法
public boolean createNewFile();
public boolean delete();
public boolean mkdir();
代码演示如下:
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()
方法来遍历目录
代码演示如下:
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 实例
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 实例
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 字节流复制文件
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)
操作实例
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)
操作实例
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、字符流
字符输入输出流 与 字节输入输出流有相同的功能,但传送数据的方式不一样,字节流以字节为单位传送数据,可以使任何类型的数据,例如文本、音频、视频、图片等。 字符流以字符为单位传送数据,只能传送文本类型的数据。使用字符输入输出流的好处是,当读取中文时不会出现乱码问题,而使用字节输入输出流时,却不能保证这一点。
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 实例
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 实例
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 字符流复制文件
使用字符流复制文件,有且仅能复制文本文件
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();
}
}
以上是关于Java IO流 简介的主要内容,如果未能解决你的问题,请参考以下文章