I指Input,称为输入流:负责奥本数据读到内存中去
O指OutPut称为输出流,负责写数据出去
IO流应用场景:

Io流的分类,方向:



这些都是抽象类,不能直接创建对象,我们要找到他们的实现类

一·:FileInputStream (字节输入流)
作用:以内存为基准,可以把磁盘中的数据以字节的形式读到内存中去

package com.file.test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class FileInputStream {
public static void main(String[] args) throws Exception {
/**
* 掌握文件字节输入流,每次读取一个字节
*/
//得到这个字节输入流对象
//InputStream is = new java.io.FileInputStream(new File("FileStudy\\src\\main\\java\\com\\file\\test\\it.txt"));
//方法二:直接用FileInputStream(String pathname),直接把文件路径写进去就可以
java.io.FileInputStream is01 = new java.io.FileInputStream("FileStudy\\src\\main\\java\\com\\file\\test\\it.txt");
//2:读取文件的字节数据
int read = is01.read();//读第一个字节a
System.out.println((char) read);
int read1 = is01.read();//读第一个字节b
System.out.println((char) read1);
//public int read() 每次读取一个字节,读完后就会返回-1
}
}
使用FileInputStream(需要一个文件路径)来创建一个字节输入流对象,is01,然后通过调用对象的read方法进行读取字符
使用循环一次读取一个字节
package com.file.test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class FileInputStream {
public static void main(String[] args) throws Exception {
/**
* 掌握文件字节输入流,每次读取一个字节
*/
//得到这个字节输入流对象
//InputStream is = new java.io.FileInputStream(new File("FileStudy\\src\\main\\java\\com\\file\\test\\it.txt"));
//方法二:直接用FileInputStream(String pathname),直接把文件路径写进去就可以
java.io.FileInputStream is01 = new java.io.FileInputStream("FileStudy\\src\\main\\java\\com\\file\\test\\it.txt");
// //2:读取文件的字节数据
// int read = is01.read();//读第一个字节a
// System.out.println((char) read);
// int read1 = is01.read();//读第一个字节b
// System.out.println((char) read1);
// //public int read() 每次读取一个字节,读完后就会返回-1
//使用循环改造上述代码
int b;//用于记住读取的字节
while ((b =is01.read()) != -1) {
System.out.println("读取的字节为:");
System.out.print((char) b);//每次读取一个字节,如果是汉字就会乱码
//读取性能差,尽量减少我们的系统去调用硬盘数据的次数
}
//每次使用完以后记得释放资源
is01.close();
}
}
使用FileInputStream字节输入流每次读读取一个字节,读取性能较差,并且读取的汉字是乱码(因为utf-8)编码中,汉字是三个字节;
文件字节输入流一次读取多个字节(read(byte[] buffer))
:每次用一个字节数组去读取数据,返回字节数组读取了多少个字节,如果发现没有数据可读会返回-1
读取字节要用new String(buffer);
package com.file.test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class FileInputStream {
public static void main(String[] args) throws Exception {
/**
* 掌握文件字节输入流,每次读取一个字节
*/
/**
* 每次读取多个字节
*/
//首先创建一个文件字节输入流对象与源文件接通
InputStream is = new java.io.FileInputStream("FileStudy\\src\\main\\java\\com\\file\\test\\it.txt");
//读取文件中的字节数据,每次读取多个字节
byte[] buffer =new byte[3];//一次读取是三个字节
int read = is.read(buffer);
String s = new String(buffer);//从第一个字节开始倒出,倒出read这么长的字节数
System.out.println(s);
System.out.println("当次读取的字节数量为"+read);
//可以还使用这个桶来读取字节
int read1 = is.read(buffer);
//为了避免读取错误,我们要读取多少,倒出多少
String s1 = new String(buffer);
System.out.println(s1);//一共5个字节abA66,第一次读取abA,再次读取的时候会是66A。因为会拿后面两个字节去覆盖前面的,因为没有覆盖A的字节,所以会留在那里
is.close();
}
}

package com.file.test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class FileInputStream {
public static void main(String[] args) throws Exception {
/**
* 掌握文件字节输入流,每次读取一个字节
*/
/**
* 每次读取多个字节
*/
//首先创建一个文件字节输入流对象与源文件接通
InputStream is = new java.io.FileInputStream("FileStudy\\src\\main\\java\\com\\file\\test\\it.txt");
//读取文件中的字节数据,每次读取多个字节
byte[] buffer =new byte[3];//一次读取是三个字节
int read = is.read(buffer);
String s = new String(buffer,0,read);//从第一个字节开始倒出,倒出read这么长的字节数
System.out.println(s);
System.out.println("当次读取的字节数量为"+read);
//可以还使用这个桶来读取字节
int read1 = is.read(buffer);
//为了避免读取错误,我们要读取多少,倒出多少
String s1 = new String(buffer,0,read1);
System.out.println(s1);//一共5个字节abA66,第一次读取abA,再次读取的时候会是66A。因为会拿后面两个字节去覆盖前面的,因为没有覆盖A的字节,所以会留在那里
is.close();
}
}

读多少,倒出多少
这样读取太麻烦,而且读取的效率不高,耗用性能太大,使用循环来进行读写,我们对代码进行改造
InputStream is = new java.io.FileInputStream("FileStudy\\src\\main\\java\\com\\file\\test\\it.txt");
byte[] buffer= new byte[3];//一次读取三个字节
int len;
System.out.println("读取的字符为");
while((len=is.read(buffer))!=-1){
//is.read()会返回一个int类型的数组,代表每次读取多少个字节
String s = new String(buffer, 0, len);
System.out.print(s);
}
is.close();
//性能得到提示,但是也可避免出现汉字乱码的问题
一次读取全部字节(First way):
InputStream is = new java.io.FileInputStream("FileStudy\\src\\main\\java\\com\\file\\test\\it.txt");
File file = new File("FileStudy\\src\\main\\java\\com\\file\\test\\it.txt");
long length = file.length();
byte[] bytes = new byte[(int) length];
while (is.read(bytes) != -1) {
System.out.println(new String(bytes));
}
System.out.println(length);
System.out.println(bytes.length);
is.close();
我们通过一个File类对象指定一个文件。通过length()来获取这个文件的大小,由于电脑运行内心有线,所以在数组中数组中的支持数据类型为int, 而我们file文件的长度为long,所以需要强转一下
一次读取全部字节(Second way):

代码:
InputStream is = new java.io.FileInputStream("FileStudy\\\\src\\\\main\\\\java\\\\com\\\\file\\\\test\\\\it.txt");
byte[] bytes = is.readAllBytes();
System.out.println(new String(bytes));
注意:如果文件太大,那么就会抛出异常,内存溢出