IO流分类
AA、根据数据流动的方向:输入流和输出流
如:打开一个新的记事本并输入一些内容,而这些内容是在内存里面的,没有存储到磁盘中,当点击保存之后,数据才会从内存流向磁盘;
当双击打开磁盘文件的时候,数据才会从磁盘流向内存
【数据存储有一个特点:内存一旦断电数据消失,磁盘永久保存】
如何选择使用输入流或者输出流?
【程序角度来说:Ctrl+s当内存流向磁盘[输出流],双击打开磁盘文件磁盘流向内存[输入流]】
什么是IO?
I(InputStream)O(OutputStream)指的就是输入流和输出流
生活中遇到常见的流:物流、人流、车流、水流、电流……【共同点:强调一个东西,从一个地方到另一个地方】
BB、根据数据流动的类型:字节流和字符流
数据流动的单位是字节就叫做字节流
数据流动的单位是字符就叫做字符流
IO的四大抽象流(都是抽象类):
InputStream:所有字节输入流的基类,其中API里面无提供专门获取对象的方法,可以自己写一个子类继承它,或者直接找它已有的子类,new一个它的子类就能用InputStream里面的方法
这里操作的是文件,就选一个相近一点的使用InputStream下面的子类——FileInputStream
FileInputStream 从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境
FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader
字段摘要【无】
构造方法摘要
FileInputStream(File file)
通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定
根据指定的文件**对象**创建字节输入流对象
FileInputStream(String name)
通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定
根据指定的文件**路径名**创建字节输入流对象
public class InputStremFileInputStremDemo {
public static void main(String[] args) throws FileNotFoundException {
//该构造需要抛异常,可进入FileInputStream构造里面看
//创建字节输入流对象
FileInputStream fileInputStream = new FileInputStream("xxxxxx.txt");//不存在的文件
System.out.println(fileInputStream);//文件不存在,报错
//Exception in thread "main" java.io.FileNotFoundException: xxxxxx.txt (系统找不到指定的文件。)
}
}
方法摘要
int read()
从此输入流中读取一个**数据字节**,下一个数据字节无则返回 -1
一次性只能读取到一个字节,返回的是ASCII值,如果读到末尾返回 -1
先创建a.txt文件并写入内容保存,再使用字节输入流读取出来
从文件读取出来是对应的数字
public class InputStremFileInputStremDemo {
public static void main(String[] args) throws IOException {
//创建字节输入流对象
FileInputStream fileInputStream = new FileInputStream("D:/hh/a.txt");
//读取第一个字节
int readK = fileInputStream.read();//read方法需要抛异常
System.out.println(readK);
//读取第二个字节
int readS = fileInputStream.read();
System.out.println(readS);
//读取第三个字节
int readD = fileInputStream.read();
System.out.println(readD);
//读取第四个字节
int readJ = fileInputStream.read();
System.out.println(readJ);
//读取第五个字节
int read = fileInputStream.read();
System.out.println(read);
/**
* 107
* 115
* 100
* 106
* -1
*/
//关闭IO流
fileInputStream.close();
}
}
从文件读取出来是对应的内容
public class InputStremFileInputStremDemo {
public static void main(String[] args) throws IOException {
//创建字节输入流对象
FileInputStream fileInputStream = new FileInputStream("D:/hh/a.txt");
//读取第一个字节
int read = fileInputStream.read();//read方法需要抛异常
System.out.println((char) read);
//读取第二个字节
read = fileInputStream.read();
System.out.println((char)read);
//读取第三个字节
read = fileInputStream.read();
System.out.println((char)read);
//读取第四个字节
read = fileInputStream.read();
System.out.println((char)read);
//读取第五个字节
read = fileInputStream.read();
System.out.println(read);//无对应内容
/**
* k
* s
* d
* j
* -1
*/
//关闭IO流
fileInputStream.close();
}
}
循环读取字节——模式1【这里的缺陷:一次性只能装一个数据,因为read()方法只能一次性读取一个字节】
public class InputStremFileInputStremDemo {
public static void main(String[] args) throws IOException {
//创建字节输入流对象
FileInputStream fileInputStream = new FileInputStream("D:/hh/a.txt");
//一次性读取一个字节
int read ; //这里不是没有初始化,没报错的原因,因为其实下面使用已经赋值了,局部变量必须会赋值,不然会提示Variable 'read' might not have been initialized
//定义一个可变字符串,来拼接字符
StringBuilder stringBuilder = new StringBuilder();
//循环读取字节,把读取出来的字符赋值给read,然后以read去判断是否等于-1
//这里不确定循环的次数所以不能用for循环,所以不知道循环次数都用while
while ((read = fileInputStream.read()) != -1){
stringBuilder.append((char) read);
//System.out.println((char)read);
/**
* k
* s
* d
* j
*/
}
System.out.println(stringBuilder);//ksdj
//关闭IO流
fileInputStream.close();
}
}
常识:一个英文字母占一个字节
int read(byte[] b)
从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中
一次性能读取多个字节,返回读取字节的个数,如果读到末尾返回 -1
循环读取字节——模式2【这里的缺陷:一次性能装多个数据,因为read(byte[] b)方法能一次性读取多个字节】
public class InputStremFileInputStremDemo {
public static void main(String[] args) throws IOException {
//创建字节输入流对象
FileInputStream fileInputStream = new FileInputStream("D:/hh/a.txt");
//一次性读取多个字节
byte[] bytes = new byte[4];//如果这里为7,实际只有四个字节,会显示null
//把读取出来的字节放到bytes数组里面
fileInputStream.read(bytes);
System.out.println(Arrays.toString(bytes));//[107, 115, 100, 106]
/**
* String(byte[] bytes)
* 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String
*/
System.out.println(new String(bytes));//ksdj
//关闭IO流
fileInputStream.close();
}
}
有中文可以输出中文
public class InputStremFileInputStremDemo {
public static void main(String[] args) throws IOException {
//创建字节输入流对象
FileInputStream fileInputStream =