
❤️ 个人主页:水滴技术
🚀 支持水滴:点赞👍 + 收藏⭐ + 留言💬
🌸 订阅专栏:Java 教程:从入门到精通
大家好,我是水滴~~
本篇文章主要讲述“文件字节输入流”和“文件字节输出流”两个类的使用,并列举了一些案例,帮助学习。
- 文件字节输入流(FileInputStream)用于读取文件内容。将磁盘中文件的数据,读取到内存中使用。
- 文件字节输出流(FileOutputStream)用于向文件写入内容。将内存中的数据,写入到磁盘文件中。

FileInputStream(文件字节输入流)
java.io.FileInputStream 是抽象类 java.io.InputStream 的一个具体实现类,用于读取文件的原始字节流。
构造函数
FileInputStream 类有三个构造方法,构造方法需要指定要读取的文件。如果指定的文件不存在,会抛出 java.io.FileNotFoundException 异常。
FileInputStream(FileDescriptor fdObj)
通过文件描述符
FileDescriptor创建一个FileInputStream实例,表示与一个实际文件的连接。
FileInputStream(File file)
通过文件
File创建一个FileInputStream实例(最终会创建一个新的文件描述符),表示与一个实际文件的连接。
FileInputStream(String name)
通过文件的路径名创建一个
FileInputStream实例。最终会创建一个File对象,然后调用FileInputStream(File file)构造方法。
常用方法
int read()
该方法从输入流读取数据的下一个字节。将读取的字节以
int型返回,如果读取至末尾,则返回值 -1 。
int read(byte b[])
从输入流中读取多个字节,并将它们存储至缓冲区
b中。读取的字节数最多等于b的长度,也可以读取比b长度小的字节数。返回值为实际读取的字节数,如果没有可读取的字节,则返回值 -1。
int read(byte b[], int off, int len)
从输入流中读取
len个字节,并从缓存区b的off下标处开始存储(即读取的第一个字节存入缓b[off]中,下一个字节存入b[off + 1]中…)。同样返回值为实际读取的字节数,如果没有可读取的字节,则返回值 -1。
int available()
返回该输入流中可读取的有效字节数。
void close()
关闭该输入流,并释放与之相关的所有系统资源。
读取文件的案例
通过一些案例来演示 FileInputStream 的使用,加深记忆。
案例一:一次读取一个字节
创建一个文件:
C:\io\01.txt,文件内容为:abc
代码示例:
public static void read1() throws IOException {
// 通过文件路径创建 FileInputStream 实例
FileInputStream fis = new FileInputStream("c:/io/01.txt");
// 可读取的字节数
System.out.println("可读取的字节数: " + fis.available());
// 读取一个字节
int read = fis.read();
System.out.println("可读取的字节数: " + fis.available() + "\t读取内容: " + read);
// 读取一个字节
read = fis.read();
System.out.println("可读取的字节数: " + fis.available() + "\t读取内容: " + read);
// 读取一个字节
read = fis.read();
System.out.println("可读取的字节数: " + fis.available() + "\t读取内容: " + read);
// 读取一个字节
read = fis.read();
System.out.println("可读取的字节数: " + fis.available() + "\t读取内容: " + read);
// 关闭输入流
fis.close();
}
输出内容:
可读取的字节数: 3
可读取的字节数: 2 读取内容: 97
可读取的字节数: 1 读取内容: 98
可读取的字节数: 0 读取内容: 99
可读取的字节数: 0 读取内容: -1
通过该案例可以发现:
read()方法读取的字节以int型返回。如上例,a的 ASCII 码值为97,b的 ASCII 码值为98,c的 ASCII 码值为99。- 读取完最后一个字节,
available()可读取的字节数为0。 - 读取完最后一个字节,再次
read()读取,返回值为-1。 - 最后不要完了关闭流。
案例二:通过循环判断可读取字节数,一次读取一个字节
使用案例一中的文件:
C:\io\01.txt,文件内容为:abc
代码示例:
public static void read2() throws IOException {
// 通过文件路径创建 FileInputStream 实例
FileInputStream fis = new FileInputStream("c:/io/01.txt");
// 循环判断可读取字节数
while (fis.available() > 0) {
// 读取一个字节
int read = fis.read();
System.out.println("可读取的字节数: " + fis.available() + "\t读取内容: " + read);
}
// 关闭输入流
fis.close();
}
输出内容:
可读取的字节数: 2 读取内容: 97
可读取的字节数: 1 读取内容: 98
可读取的字节数: 0 读取内容: 99
案例三:通过循环判断是否读到末尾,一次读取一个字节
使用案例一中的文件:
C:\io\01.txt,文件内容为:abc
代码示例:
public static void read3() throws IOException {
// 通过文件路径创建 FileInputStream 实例
FileInputStream fis = new FileInputStream("c:/io/01.txt");
int read;
// 循环读取一个字节,每次判断是否到达末尾
while ((read = fis.read()) != -1) {
System.out.println("可读取的字节数: " + fis.available() + "\t读取内容: " + (char)read);
}
// 关闭输入流
fis.close();
}
输出内容:
可读取的字节数: 2 读取内容: a
可读取的字节数: 1 读取内容: b
可读取的字节数: 0 读取内容: c
案例四:一次读取多个字节
使用案例一中的文件:
C:\io\01.txt,文件内容为:abc
代码示例:通过 new String(bytes) 方法将读取的字节数组转为字符串
public static void read4() throws IOException {
// 通过文件路径创建 FileInputStream 实例
FileInputStream fis = new FileInputStream("c:/io/01.txt");
// 可读取的字节数
System.out.println("可读取的字节数: " + fis.available());
// 字节数组,缓存读取的内容
byte[] bytes = new byte[2];
// 一次读取多个字节
int len = fis.read(bytes);
System.out.println("可读取的字节数: " + fis.available() + "\t读取的字节数: " + len + "\t读取内容: " + new String(bytes));
// 一次读取多个字节
len = fis.read(bytes);
System.out.println("可读取的字节数: " + fis.available() + "\t读取的字节数: " + len + "\t读取内容: " + new String(bytes));
// 一次读取多个字节
len = fis.read(bytes);
System.out.println("可读取的字节数: " + fis.available() + "\t读取的字节数: " + len + "\t读取内容: " + new String(bytes));
// 关闭输入流
fis.close();
}
输出内容:
可读取的字节数: 3
可读取的字节数: 1 读取的字节数: 2 读取内容: ab
可读取的字节数: 0 读取的字节数: 1 读取内容: cb
可读取的字节数: 0 读取的字节数: -1 读取内容: cb
通过该案例可以发现:
read()方法返回值为读取的内容;而read(bytes)方法返回值为读取的字节数。- 字节数组未被填满时,剩余位置会保留原来的值。
- 通过
new String(bytes)方法可以将字节数组转为字符串。
案例五:通过循环判断可读取字节数,一次读取多个字节
使用案例一中的文件:
C:\io\01.txt,文件内容为:abc
代码示例:
public static void read5() throws IOException {
// 通过文件路径创建 FileInputStream 实例
FileInputStream fis = new FileInputStream("c:/io/01.txt");
// 字节数组,缓存读取的内容
byte[] bytes = new byte[2];
while (fis.available() > 0) {
// 一次读取多个字节
int len = fis.read(bytes);
System.out.println("可读取的字节数: " + fis.available() + "\t读取的字节数: " + len + "\t读取内容: " + new String(bytes, 0, len));
}
// 关闭输入流
fis.close();
}
输出内容:
可读取的字节数: 1 读取的字节数: 2 读取内容: ab
可读取的字节数: 0 读取的字节数: 1 读取内容: c
通过该案例可以发现:
- 使用
new String(bytes, 0, len)方法可以将有效的字节转为字符串,解决了数组未填满的情况。
案例六:通过循环判断是否读到末尾,一次读取多个字节
使用案例一中的文件:
C:\io\01.txt,文件内容为:abc
代码示例:
public static void read6() throws IOException {
// 通过文件路径创建 FileInputStream 实例
FileInputStream fis = new FileInputStream("c:/io/01.txt");
// 字节数组,缓存读取的内容
byte[] bytes = new byte[2];
int len;
// 循环读取一个字节,每次判断是否到达末尾
while ((len = fis.read(bytes)) != -1) {
System.out.println("可读取的字节数: " + fis.available() + "\t读取的字节数: " + len + "\t读取内容: " + new String(bytes, 0, len));
}
// 关闭输入流
fis.close();
}
输出内容:
可读取的字节数: 1 读取的字节数: 2 读取内容: ab
可读取的字节数: 0 读取的字节数: 1 读取内容: c
FileOutputStream(文件字节输出流)
java.io.FileOutputStream 是抽象类 java.io.OutputStream 的一个具体实现类,用于将数据写入到文件的输出流中。某些平台允许一次只能打开一个文件输出流。
构造函数
FileOutputStream 类有五个构造函数,构造函数需要指定要写入的目标文件。如果目标文件所属目录不存在,会抛出 java.io.FileNotFoundException 异常;如果仅是目标文件不存在,会创建一个文件。
FileOutputStream(FileDescriptor fdObj)
通过指定的文件描述符
FileDescriptor创建一个FileOutputStream实例,表示与一个实际文件的连接。
FileOutputStream(File file, boolean append)
通过指定的文件
File创建一个FileOutputStream实例。如果append为true,表示从末尾追加,否则会将原数据覆盖。
FileOutputStream(File file)
通过指定的文件
File创建一个FileOutputStream实例,默认覆盖文件中原数据。
FileOutputStream(String name, boolean append)
通过文件的路径名创建一个
FileOutputStream实例。如果append为true,表示从末尾追加,否则会将原数据覆盖。
FileOutputStream(String name)
通过文件的路径名创建一个
FileOutputStream实例,默认覆盖文件中原数据。
常用方法
void write(int b)
向输出流中写入一个字节。该方法是一个抽象方法,要求子类必须实现此方法。
void write(byte b[])
向输出流中写入多个字节。该方法将缓存区
b中的字节写入到输出流中。
void write(byte b[], int off, int len)
向输出流中写入多个字节,从缓存区
b的off下标处开始写入len个字节。
void flush()
刷新该输出流,强制将缓存区中的字节写出去。
void close()
关闭该输出流,并释放与之相关的所有资源。
写入文件的案例
案例一:一次写入一个字节
代码示例:
public static void write1() throws IOException {
// 通过文件路径创建 FileOutputStream 实例
FileOutputStream fos = new FileOutputStream("c:/io/02.txt");
// 写入一个字节 97=a
fos.write(97);
// 写入一个字节 98=b
fos.write(98);
// 写入一个字节 99=c
fos.write(99);
// 关闭输出流
fos.close();
}
会创建一个c:/io/02.txt 文件,文件内容为:abc
案例二:一次写入多个字节
代码示例:
public static void write2() throws IOException {
// 通过文件路径创建 FileOutputStream 实例
FileOutputStream fos = new FileOutputStream("c:/io/03.txt");
String str = "水滴abc";
byte[] bytes = str.getBytes();
fos.write(bytes);
// 关闭输出流
fos.close();
}
会创建一个c:/io/03.txt 文件,文件内容为:水滴abc
案例三:一次写入多个字节,指定字节数组的偏移量
代码示例:
public static void write3() throws IOException {
// 通过文件路径创建 FileOutputStream 实例
FileOutputStream fos = new FileOutputStream("c:/io/04.txt");
String str = "水滴abc";
byte[] bytes = str.getBytes();
fos.write(bytes, 0, bytes.length - 3);
// 关闭输出流
fos.close();
}
会创建一个c:/io/03.txt 文件,文件内容为:水滴

835

被折叠的 条评论
为什么被折叠?



