个人主页:Dawn黎明开始
系列专栏:Java
⭐每日一句:所谓万丈深渊,走下去也是前程万里欢迎大家关注点赞收藏⭐️留言
文章目录
一.字节流
1.1定义
1.1.1说明
1.2输出流
1.2.1构造方法
1.2.2成员方法
1.2.3实例练习
1.3输入流
1.3.1构造方法
1.3.2成员方法
1.3.3实例练习
二.字符流
2.1定义
2.1.1说明
2.2输出流
2.2.1构造方法
2.2.2成员方法
2.2.3实例练习
2.3输入流
2.3.1构造方法
2.3.2成员方法
2.3.3实例练习
前言
Java中的I/O流主要定义在java.io包中,该包下定义了很多类,其中有4个类为流的顶级类,是所有流类型的父类,分别为InputStream和OutputStream,Reader和Writer。
在计算机中,无论是文本、图片、音频还是视频,所有文件都是以二进制(字节)形式存在的,I/O流中针对字节的输入/输出提供了一系列的流,统称为字节流。
(1)针对文件的读写操作,JDK专门提供了两个类,分别是FileInputStream和FileOutputStream。
(2)FileOutputStream是OutputStream的子类,它是操作文件的字节输出流,专门用于输出文件中的数据。
(3)FileInputStream是InputStream的子类,它是操作文件的字节输入流,专门用于读取文件中的数据。
(3)从文件读取数据是重复的操作,因此需要通过循环语句来实现数据的持续读取。
继承OutputStream类的方法
注意
(1)前三个write()方法都是用来写数据的,分按字节读取和按字节数组写入。
(2)flush()方法用来将当前输出流缓冲区(通常是字节数组)中的数据强制写入目标设备,此过程称为刷新。
(3)close()方法是用来关闭流并释放与当前IO流相关的系统资源。
FileOutputStream操作步骤
1.创建字节输出流对象
2.调用write()方法写数据
3.释放资源
实例练习1
代码如下
package StreamDemo;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamDemo1 {
public static void main(String[] args) throws IOException {
// 创建字节输出流对象
FileOutputStream fos = new FileOutputStream("fos.txt");
/*
* 创建字节输出流对象了做了几件事情:
* A:调用系统功能去创建文件
* B:创建fos对象
* C:把fos对象指向这个文件
*/
//写数据
fos.write("hello,IO\n".getBytes());
//关闭流,释放资源
fos.close();
}
}
运行结果
思考
❗如果文件不存在,会报错吗?
不会,会新建一个文件写入
❗为什么一定要close()呢?
1:让流对象变成垃圾,这样就可以被垃圾回收器回收了
2:通知系统去释放跟该文件相关的资源
❗如何实现数据的追加写入?
用构造方法带第二个参数是true的情况即可
实例练习2
代码如下
package StreamDemo;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamDemo2 {
public static void main(String[] args) throws IOException {
FileOutputStream fos=new FileOutputStream("a.txt");
//public void write(byte[] b):写一个字节数组
byte[] bys={97,98,99,100,101};
//public void write(byte[] b,int off,int len):写一个字节数组的一部分
fos.write(bys,1,3);
//释放资源
fos.close();
}
}
运行结果
思考
❗为什么是bcd而不是98,99,100?
字符编码问题
(1).前三个read()方法都是用来读数据的,分按字节读取和按字节数组读取。
(2).进行I/O流操作时,应该调用close()方法关闭流,从而释放当前I/O流所占的系统资源。
FileInputStream操作步骤
1.创建字节输入流对象
2.调用write()方法
3.关闭流,释放资源
实例练习1(一次读取一个字节)
代码如下
package StreamDemo;
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamDemo1 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileInputStream fin1 = new FileInputStream("fin1.txt");
int b=0;
while((b=fin1.read())!=-1) {
System.out.print((char)b);
}
fin1.close();
}
}
运行结果
实例练习2(一次读取一个数组)
代码如下
package StreamDemo;
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamDemo2 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileInputStream fin2 = new FileInputStream("fin2.txt");
byte []bys =new byte[1024];
int len=0;
while((len=fin2.read(bys))!=-1) {
String string = new String(bys,0,len);
System.out.println(string);
}
}
}
运行结果
除了字节流,JDK还提供了用于实现字符操作的字符流,同字节流一样,字符流也有两个抽象的顶级父类,分别是Reader和Writer。
继承OutputStreamReader类的方法
public void write(int c):写一个字符
public void write(char[] cbuf):写一个字符数组
public void write(char[] cbuf,int off,int len):写一个字符数组的一部分
public void write(String str):写一个字符串
public void write(String str,int off,int len):写一个字符串的一部分
实例练习1
代码如下
package FileWrite;
import java.io.FileWriter;
import java.io.IOException;
public class FileReaderDemo {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("fw.txt");
fw.write('a');
fw.write(97);
fw.close();
}
}
运行结果
实例练习2
代码如下
package FileWrite;
import java.io.FileWriter;
import java.io.IOException;
public class FileReaderDemo1 {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("fw.txt");
fw.write('a');
fw.write(97);
fw.flush();
fw.write("\nhello");
fw.close();
}
}
运行结果
思考:close()和flush()的区别?
A:close()关闭流对象,但是先刷新一次缓冲区。关闭之后,流对象不可以继续再使用了。
B:flush()仅仅刷新缓冲区,刷新之后,流对象还可以继续使用。
继承InputStreamReader类的方法
int read():一次读取一个字符
int read(char[] chs):一次读取一个字符数组
实例练习1(一次读取一个字符)
代码如下
package FileReader;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileReader fr = new FileReader("a.txt");
int ch = 0;
while ((ch = fr.read()) != -1) {
System.out.print((char) ch);
}
}
}
实例练习2(一次读取一个字符数组)
代码如下
package FileReader;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo1 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileReader fr = new FileReader("b.txt");
char[] chs = new char[1024];
int len = 0;
while ((len = fr.read(chs)) != -1) {
System.out.print(new String(chs, 0, len));
}
fr.close();
}
}
学习编程需要勤加练习,勇于实践,建议大家亲自动手实践练习,这样才能不断进步,掌握编程技巧,欢迎大家在评论区进行讨论。