Java IO
►▻什么是流? 在 Java 中所有数据都是使用流读写的。流是一组有序的数据序列,将数据从一个地方带到另一个地方。根据数据流向的不同,可以分为输入(Input)流和输出(Output)流两种。按处理数据单位的不同,可以分为字节流(InputStream/OutputStream-8 位)和字符流(Reader/Writer-16 位)。 ►▻java.io包 java.io包中最重要的就是5个类和1个接口,5个类指的是File、OutputStream、InputStream、Reader和Writer;1个接口指的是Serializable。
1. 操作文件的类——File
1.1 File类的基本介绍
在java.io包里,唯一与文件本身有关的类就是File类。通过该类可以实现文件创建、删除文件等操作。【什么是文件?文件可认为是相关记录或放在一起的数据的集合。】
1.2 File类中常用的方法和常量
序号 | 方法或常量 | 类型 | 描述 |
---|---|---|---|
1 | public boolean exists() | 普通 | 测试此抽象路径名表示的文件或目录是否存在。 |
2 | public boolean delete() | 普通 | 删除此抽象路径名表示的文件或目录。 |
3 | public long length() | 普通 | 返回此抽象路径名表示的文件的长度。 |
4 | public boolean mkdir() | 普通 | 创建单级目录 |
5 | public boolean canExecute() | 普通 | 测试应用程序是否可以执行此抽象路径名表示的文件。 |
6 | public boolean canRead() | 普通 | 测试应用程序是否可以读取此抽象路径名表示的文件。 |
7 | public boolean canWrite() | 普通 | 测试应用程序是否可以修改此抽象路径名表示的文件。 |
8 | public boolean mkdirs() | 普通 | 创建多级目录 |
9 | public boolean isDirectory() | 普通 | 测试此抽象路径名表示的文件是否为目录。 |
10 | public File(String pathname) | 构造 | 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 |
11 | public static String pathSeparator | 常量 | 通与系统相关的路径分隔符,为方便起见,表示为字符串。 |
更多常用的方法和常量可以去看一下File类文档:https://www.runoob.com/manual/jdk11api/java.base/java/io/File.html | |||
### 1.3 使用File类操作文件 | |||
操作一:创建一个新文件 | |||
操作二:判断是文件还是目录,以及判断文件的可读性 | |||
操作三:判断路径是否存在,如果不存在就创建 | |||
操作四:删除一个指定文件 | |||
操作五:判断是否是目录,如果是则列出全部内容 | |||
``` | |||
package person.xsc.practice; |
import java.io.File; import java.io.IOException;
public class FileDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
//一:创建一个新文件
File file=new File("C:\\Users\\你是小朱老师呀\\Desktop\\test.txt");
try {
file.createNewFile();
}catch(IOException e) {
e.printStackTrace();
}
//二:判断是文件还是目录,以及判断文件的可读性
if(file.isDirectory()) {
System.out.println("文件/目录:"+file.getPath()+"这是一个目录");
}else {
System.out.println("文件/目录:"+file.getPath()+"这是一个文件");
}
if(file.canRead()&&file.canWrite()) {
System.out.println("读写性:这个文件既可以读还可以写");
}else if(file.canRead()) {
System.out.println("读写性:这个文件只可以读");
}else if(file.canWrite()) {
System.out.println("读写性:这个文件只可以写");
}
//三+四、判断路径是否存在,如果不存在就创建
File file2=new File("C:\\Users\\你是小朱老师呀\\Desktop\\XSC");
if(file2.exists()) {
file2.delete();
}else {
file2.mkdirs();
try {
new File(file2,"test2.txt").createNewFile();
new File(file2,"test3.txt").createNewFile();
new File(file2,"XSC1").mkdir();
new File(file2,"XSC2").mkdir();
new File(file2,"XSC3").mkdir();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//五、判断是否是目录,如果是则列出全部内容
if(file2!=null) {
if(file2.isDirectory()) {
File[] f=file2.listFiles();
for(int i=0;i<f.length;++i) {
System.out.println("目录"+(i+1)+":"+f[i]);
}
}else {
System.out.println(file2);
}
}
}
}
## 2. 字节流基本操作
字节流主要操作byte类型数据,以byte数组为准,主要操作类是OutputStream类和InputStream类。具体分类如下:
![image](https://img-hello-world.oss-cn-beijing.aliyuncs.com/imgs/0e2ff468628edbbf6738d23441009943.png)
![image](https://img-hello-world.oss-cn-beijing.aliyuncs.com/imgs/3185106a16de1da6e9bf1e5b8483d1b0.png)
### 2.1 字节输出流:OutputStream
OutputStream是整个IO包中字节输出流的最大父类,此类的定义如下:
public abstract class OutputStream extends Object implements Closeable, Flushable 此抽象类是表示输出字节流的所有类的超类。 输出流接受输出字节并将它们发送到某个接收器。 需要定义OutputStream的子类的应用程序必须始终至少提供一个写入一个输出字节的方法。
#### 2.1.1 OutputStream类常用的方法
|序号|方法|类型|描述|
|-|-|-|-|
|1|public void close()|普通|关闭此输出流并释放与此流关联的所有系统资源。|
|2|public void flush()|普通|刷新此输出流并强制写出任何缓冲的输出字节。|
|3|public void write(byte[] b)|普通|将 b.length字节从指定的字节数组写入此输出流。|
|4|public void write(byte[] b, int off, int len)|普通|将从偏移量 off开始的指定字节数组中的 len字节写入此输出流。|
|5|public abstract void write(int b)|普通|将指定的字节写入此输出流。|
#### 2.1.2 实现FileOutputStream类从向文件中写入内容
##### 2.1.2.1 FileOutputStream类中的方法
|序号|方法|说明|
|-|-|-|
|1|public void write(byte[] b)|将指定字节数组中的 b.length字节写入此文件输出流。|
|2|public void close()|关闭此文件输入流并释放与此流有关的所有系统资源|
|3|public void write(byte[] b, int off, int len)|将从偏移量 off开始的指定字节数组中的 len字节写入此文件输出流。|
|4|public void write(int b)|将指定的字节写入此文件输出流。|
##### 2.1.2.2 向文件中写入内容
package person.xsc.practice;
import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream;
public class OutputStreamDemo {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//找到一个文件
File file=new File("C:\\Users\\你是小朱老师呀\\Desktop\\test.txt");
//通过子类实例化父类对象
OutputStream outputStream=new FileOutputStream(file,true);
//进行写入操作
byte[]b=new String("世界,你好").getBytes();
outputStream.write(b);
//关闭输入流
outputStream.close();
}
}
这里注意如果在实例化父类对象时,知识这样FileOutputStream(File file)去构造,在写入的时候回覆盖文件中原先内容,如果想要接在原先内容后面,应该通过FileOutputStream(File file, boolean append)去构造。
### 2.2 字节输入流:InputStream
同OutputStream一样,InputStream本身也是一个抽象类,必须依靠其子类,如果从文件中读取就需要依靠子类FileInputStream。
#### 2.2.1 InputStream类常用的方法
|序号|方法|类型|描述|
|-|-|-|-|
|1|public int available()|普通|返回可以从此输入流中无阻塞地读取(或跳过)的字节数的估计值,可以是0,或者在检测到流结束时为0。|
|2|public void close()|普通|关闭此输入流并释放与该流关联的所有系统资源。|
|3|public abstract int read()|普通|从输入流中读取下一个数据字节。|
|4|public int read(byte[] b)|普通|从输入流中读取一些字节数并将它们存储到缓冲区数组 b 。|
#### 2.2.2 实现FileInputStream类从文件中读取内容
##### 2.2.2.1 FileInputStream类中的方法
|序号|方法|说明|
|-|-|-|
|1|public int read()|从输入流中读取一个数据字节|
|2|public int read(byte[] b)|从输入流中将最多b.length个字节的数据读入一个byte数组中|
|3|public int read(byte[] b, int off, int len) |从输入流中将最多len个字节的数据读入byte数组中,off表示偏移量|
|4|public void close()|关闭此文件输入流并释放与此流有关的所有系统资源|
##### 2.2.2.2 从文件中读取内容
package person.xsc.practice;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class InputStreamDemo {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//找到一个文件
File file=new File("C:\Users\你是小朱老师呀\Desktop\test.txt");
//通过子类实例化父类对象
InputStream inputStream=new FileInputStream(file);
byte[] b=new byte[(int)file.length()];
int length=inputStream.read(b);
//关闭输入流
inputStream.close();
System.out.println("读入数据的长度:"+length+'\n'+"内容:"+new String(b));
}
}