一.IO流
一.java中IO的初步了解
(一).概念:
Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法。
(二).java IO流的框架图
(三).流的分类:
1.按方向分:
- 输入流:用来读 in
- 输出流:用来写 out
2.按一次读取的字节数分:
- InputStream outputStream
- Reader Writer
- 字节流一次读取1个字节 byte 字符流一次读取多个字符
- 字节流:数据流中最小的数据单元是字节
- 字符流:数据流中最小的数据单元是字符, Java中的字符是Unicode编码,一个字符占用两个字节(无论中文还是英文都是两个字节)。
3.按功能分:
- 节点流:可以从或向一个特定的地方(节点)读写数据,直接连接数据源。如最常见的是文件的FileReader,还可以是数组、管道、字符串,关键字分别为ByteArray/CharArray,Piped,String。.
- 处理流(包装流):并不直接连接数据源,是对一个已存在的流的连接和封装,是一种典型的装饰器设计模式,使用处理流主要是为了更方便的执行输入输出工作,如PrintStream,输出功能很强大,又如BufferedReader提供缓存机制,推荐输出时都使用处理流包装。
二.常用的IO流类(部分)
1.InputStream和Reader
InputStream 是字节流输入对象抽象类,它实现了从字节输入流中读取数据的方法。开发人员可以使用子类实现该接口,从而通过该对象获取到 InputStream 中的数据。在输入过程中,系统会将字节编码为字符。此外,InputStream 也提供了诸如关闭流、清空数据缓存等常规操作。
Reader 是用于读取字符流的抽象类,它的子类实现了具体的字符输入流。默认情况下,Reader 所使用的字符编码与平台默认的字符编码相同。因此,在不指定编码的情况下,Reader 将使用操作系统的默认字符编码来读取字符流。
实例:
public class io {
public static void main(String[] args) throws IOException {
FileInputStream file =new FileInputStream("study1\\text1");
byte[]arr=new byte[1024];
int len;
while((len=file.read())!=-1){
String str= new String(arr,0,len);
System.out.println(str);
}
}
}
public class IO5 {
public static void main(String[] args) throws IOException {
//1.创建对象
FileReader fr=new FileReader("Study1\\text1");
//2.读取数据
//read()底层上也是字节流,但是他是字节流+字节集,遇到汉字就读取多个字节
int r;
/*while((r=fr.read())!=-1){
System.out.print(r);//解码后以十进制形式保cun
}*/
while((r=fr.read())!=-1){
System.out.print((char)r);//解码后以十进制形式保cun
}
//3.释放资源
fr.close();
}
}
2.OutputStream和Writer
OutputStream 是用于写入字节流的抽象类,它的子类实现了具体的字节输出流。
Writer是用于写入字符流的抽象类,它的子类实现了具体的字符输出流。
public class IO1 {
public static void main(String[] args) throws IOException {
//1.创建字节输出对象
//参数是字符串表示的路径或者File对象都可以
//如果文件不存在会创建一个新文件,但要保证父级路径是存在的
//如果文件已经存在,则会清空文件
FileOutputStream fos=new FileOutputStream("Study1\\text1");
//2.写出数据
//write方法的参数是整数,但是实际上写到本地文件中是以ASCLL对于的字符输出
fos.write(97);
byte[]arr={97,98,99,100};
fos.write(arr);
//释放资源
//每次使用完六后都要释放资源
fos.close();
}
}
public class WriteFileExample {
public static void main(String[] args) {
String content = "这是要写入文件的内容";
try (Writer writer = new FileWriter("example.txt")) {
writer.write(content);
} catch (IOException e) {
e.printStackTrace();
}
}
3.BufferReader和BufferWriter
BufferedReader 继承自 Reader 类,它的作用是从输入流中读取文本数据,并缓冲各个字符,以提供字符、数组和行的高效读取。
BufferedWriter 继承自 Writer 类,它的作用是向输出流中写入字符数据,并缓冲各个字符,以提高写入性能。
这两个类的主要优势在于减少了对底层数据源(例如文件、网络连接等)的直接读写次数,而是将数据先暂存在内存缓冲区中,减少了 I/O 操作的频率,从而提高了读写性能。因此,在需要频繁读写大量数据时,使用 BufferedReader 和 BufferedWriter 可以提高程序的效率。
public class IO6 {
public static void main(String[] args) throws IOException {
/*
* 缓冲流:4个
* 字符缓冲流和字节缓冲流
*
* */
//1.创建对象
File root=new File("study1\\text1");
File get=new File("study1\\text2");
read(root);
Write(get);
}
private static void Write(File get) throws IOException {
BufferedWriter bw=new BufferedWriter(new FileWriter(get));
String str1="好好学习";
String str2="天天向上";
bw.write(str1);
bw.newLine();
bw.write(str2);
bw.newLine();
bw.close();
}
private static void read(File root) throws IOException {
BufferedReader br=new BufferedReader(new FileReader(root));
String line;
while((line=br.readLine())!=null){
System.out.println(line);
}
br.close();
}
}
4.InputStreamReader和OutputStreamWriter
InputStreamReader:把字节输入流转换为字符输入流.
OutputStreamWriter:把字节输出流转换为字符输出流
//1、创建源和目标
File srcFile = new File("io"+File.separator+"a.txt");
File descFile = new File("io"+File.separator+"b.txt");
//2、创建字节输入输出流对象
InputStream in = new FileInputStream(srcFile);
OutputStream out = new FileOutputStream(descFile);
//3、创建转换输入输出对象
Reader rd = new InputStreamReader(in);
Writer wt = new OutputStreamWriter(out);
//3、读取和写入操作
char[] buffer = new char[10];//创建一个容量为 10 的字符数组,存储已经读取的数据
int len = -1;//表示已经读取了多少个字符,如果是 -1,表示已经读取到文件的末尾
while((len=rd.read(buffer))!=-1){
wt.write(buffer, 0, len);
}
//4、关闭流资源
rd.close();
wt.close();
三.操作 IO 流的模板
①、创建源或目标对象
输入:把文件中的数据流向到程序中,此时文件是 源,程序是目标
输出:把程序中的数据流向到文件中,此时文件是目标,程序是源
②、创建 IO 流对象
输入:创建输入流对象
输出:创建输出流对象
③、具体的 IO 操作
④、关闭资源
输入:输入流的 close() 方法
输出:输出流的 close() 方法