一.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() 方法