- IO流也称为输入、输出流。就是用来读写数据的。
I 表示
- I 表示input, 数据从硬盘文件读入到内存的过程,称之输入,负责读。
O 表示
- O 表示 output,是内存程序的数据从内存到写出到硬盘文件的过程,称为输出,负责写。
IO流的分类
- 按流的方向分
- 按流中的数据最小单位为
总结流的四大类:
- 字节输入流:以内存为基准,来自磁盘文件/网络中的数据 以字节的形式读入到内存 中去的流称为字节输入流
- 字节输出流:以内存为基准,把内存中的数据 以字节写出到磁盘文件或者网络中去 的流称为字节输入流
- 字符输入流:以内存为基准,来自磁盘文件/网络中的数据 以字符的形式读入到内存 中去的流称为字符输入流
- 字符输出流:以内存为基准,把内存中的数据 以字符写出到磁盘文件或者网络介质中 去的流称为字符输出流
IO流的作用?
- 读写文件数据的
IO流是怎么划分的,大体分为几类,各自的作用?
- 字节流:字节输出流,字节输出流(读写字节数据的)
- 字符类:字符输出流,字符输出流(读写字符数据的)
FileInputStream
文件字节输入流:( 每次读取一个字节 )
- 作用:以内存为基准,把磁盘文件中的数据以字节的形式读取带内存中去
构造器 说明 public FileInputStream(File file) 创建字节输入流管道与源文件对象接通 public FileInputStream(String pathname) 创建字节输入流管道与源文件路径接通
方法名称 说明 public int read() 每次读取一个字节返回,如果字节已经没有可读的返回-1 public int read(byte[ ] buffer) 每次读取一个字节数组返回,如果字节已经没有可读的返回-1 package com.csdn.d2_byte_stream; import java.io.*; public class FileInputStreamDemo01 { public static void main(String[] args) throws IOException { //创建文件对象 File file = new File("src\\data.txt"); //创建data.txt文件 file.createNewFile(); //1.创建一个文件字节输入流管道与源文件接通 InputStream is = new FileInputStream(new File("src\\data.txt")); new File("src\\csdn.txt").createNewFile(); InputStream inputStream = new FileInputStream("src\\csdn.txt"); //2、读取一个字节返回(每次读取一滴水) int read1 = is.read(); System.out.println(read1);//97 int read2 = is.read(); System.out.println(read2);//98 int read3 = is.read(); System.out.println(read3);//99 //读取完毕返回 -1 int read4 = is.read(); System.out.println(read4);//229 //3、使用循环改进 //定义一个变量记录每次读取的字节 int b; while ((b = inputStream.read()) != -1) { System.out.print((char) b);//abc å } } }
文件字节输入流:( 每次读取一个字节 数组 )
方法名称 说明 public int read(byte [ ] buffer) 每次读取一个字节数组返回,如果字节已经没有可读的返回-1 package com.csdn.d2_byte_stream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; public class FileInputStreamDemo02 { public static void main(String[] args) throws IOException { //1.创建一个文件字节输入流管道与源文件接通 InputStream is = new FileInputStream("src\\data.txt"); byte[] buffer = new byte[3]; int len = is.read(buffer); System.out.println("读取了几个字节:" + len);//3 String rs = new String(buffer); System.out.println(rs);//abc int len1 = is.read(buffer); System.out.println("读取了几个字节:" + len1);//3 String rs1 = new String(buffer); System.out.println(rs1);//吃 int len2 = is.read(buffer); System.out.println("读取了几个字节:" + len2);//-1 String rs2 = new String(buffer); System.out.println(rs2);//读的是上一个桶留下来的 吃 } }
方法名 说明 String (byte [ ] bytes,int offset,int length) 通过使用平台的默认字符集 解码 指定的字节子数组来构造一个新的String
- 读取多少倒出多少
package com.csdn.d2_byte_stream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; public class FileInputStreamDemo02 { public static void main(String[] args) throws IOException { //1.创建一个文件字节输入流管道与源文件接通 InputStream is = new FileInputStream("src\\csdn.txt"); /* byte[] buffer = new byte[3]; int len = is.read(buffer); System.out.println("读取了几个字节:" + len);//3 String rs = new String(buffer); System.out.println(rs);//ab3 int len1 = is.read(buffer); System.out.println("读取了几个字节:" + len1);//3 String rs1 = new String(buffer); System.out.println(rs1);//abc int len2 = is.read(buffer); System.out.println("读取了几个字节:" + len2);//2 String rs2 = new String(buffer,0,len2); System.out.println(rs2);//cd */ //使用循环改进,每次读取一个字节数组 byte[] buffer1 = new byte[3]; int len3; //记录每次读取的字节数 while ((len3=is.read(buffer1)) != -1) { System.out.println(new String(buffer1, 0, len3));//ab3abccd } } }
1、文件字节输入流,每次读取一个字节数组的api是哪个?
2、每次读取一个字节数组存在什么问题?
读取的性能得到了提升
- 读取 中文 字符输出无法避免乱码问题
文件字节输入流(一次读完 全部字节)
1、如何使用字节输入流读取中文内容输出不乱码呢?
- 定义一个与文件一样大的字节数组,一次性读取完文件的全部字节。
2、直接把文件数据全部读取到一个字节数组可以避免乱码,是否存在问题?
- 如果文件过大,字节数组可能引起内存溢出。
方式一
- 自己定义一个字节数组与文件的大小一样大,然后使用读取字节数组的方法,一次性读取完成。
方式二
- 官方为字节输入流InputStream提供了如下API可以直接把文件的全部数据读取到一个字节数组中
public byte [ ] readAllBytes ()throws IOException 直接将当前字节输入流对应的文件对象的字节数组装入到一个字节数组返回 package com.csdn.d2_byte_stream; import java.io.*; public class FileInputStreamDemo03 { public static void main(String[] args) throws IOException { //1.创建文件对象 File f = new File("src\\csdn.txt"); //2.创建一个文件字节输入流管道与源文件接通 InputStream is = new FileInputStream(f); //3.定义一个字节数组与文件的大小刚刚一样大。 byte[] buffer = new byte[(int) f.length()]; int len = is.read(buffer); System.out.println("读取了多少个字节:" + len);//8 System.out.println("文件大小:" + f.length());//8 System.out.println(new String(buffer));//ab3abccd byte[] bytes = is.readAllBytes(); System.out.println(new String(buffer));//ab3abccd } }