1. IO流
1.1 概述
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
I : input 输入
O : output 输出
1.2 分类
按处理数据类型的不同,分为字节流和字符流
按数据流向的不同,分为输入流和输出流。(入和出是相对于内存来讲的)
按功能不同,分为节点流和处理流
节点流:直接操作数据源
处理流:对其他流进行处理
1.3 四大抽象类
InputStream
OutputStream
Reader
Writer
2. 文件流
2.1 FileInputStream
2.1.1 概述
用来打开文件并读取文件中的数据
想要读取一个文件,就必须要找到它
1 绝对位置
以系统根目录为准,比如D:/xxx\\xxx\xx\a.txt
2 相对位置
./ 表示当前目录
../ 表示上级目录
../../ 上上级目录
2.1.2 常用方法
2.1.3 Read使用
read : 读取一个字节,并返回对应的ASCII码值,返回为int类型,如果到达文件末尾(读完了) 则返回-1
public static void main(String[] args) throws IOException {
// 打开输入流链接,需要传入文件路径
// D:/xx/xx/xxx 绝对路径
// ./定位到当前路径 ./xx/xx/xxx 相对路径
FileInputStream fis = new FileInputStream("./src/Day21/FileInputStream_01.java");
// 读数据时,读取下一个字节并返回对应的ASCII值,如果到达文件末尾,则返回-1
int temp = fis.read();
System.out.println(temp);
System.out.println((char)temp);
System.out.println(fis.read());
// 关闭流
fis.close();
}
2.1.4 Read重载使用
read方法重载:可以传递一个数组,一次读取会把该数组读满/读完,然后一次性返回
返回int类型,为当前读取的个数,如果达到文件未尾 返回-1
数组就相当于是一个缓冲区,效率会有所提升
public static void main(String[] args) throws IOException {
// 创建文件,需要传入文件路径
File file = new File("./src/Day21/FileInputStream_01.java");
// 打开输入流链接
FileInputStream fis = new FileInputStream(file);
// 创建一个字节数组
byte[] bytes = new byte[1024];
// 传入字节数组,返回读取的字节个数,如果到达文件末尾,返回-1;
int temp = fis.read(bytes);
// 把字节数组转成字符串输出
System.out.print(new String(bytes,0,temp));
// 关闭资源
fis.close();
}
2.2 FileReader
2.2.1 概述
FileReader: 一次读取一个字符,也就是两个字节,主要用于读取纯文本文件,解决乱码问题
read() : 一次读取一个字符,返回对应的ASCII码,达到文件末尾返回-1
read(char[ ]):一次读取一个字符数组,提高读取效率,返回本地读取的字符个数,到达文件未尾返回-1
2.2.2 使用方法
public static void main(String[] args) throws IOException {
// 创建文件
File file = new File("./src/Day21/FileReader_01.java");
// 创建字符输入
FileReader fr = new FileReader(file);
char[] chars = new char[1024];
// 读取
int temp= fr.read(chars);
System.out.println(new String(chars,0,temp));
// 关闭
fr.close();
}
2.3 FileOutputStream
2.3.1 概述
FileOutputStream是字节输出流,用于把数据写出到指定文件中
如果指定文件不存在,会自动创建该文件,但是 不会创建目录(不会创建文件夹)
2.3.2 常用方法
2.3.3 构造方法
输出时,可以指定是覆盖还是插入
构造方法 : 1 只传递一个文件路径 2 传递一个文件路径,和布尔型
如果 我们调用的构造方法,只需要传入一个路径,则第二个布尔型默认为false
如果布尔型为false,则为覆盖写出 , 为true 则为 追加写出
如果是覆盖写出的话,在创建输出流对象时,就会把文件内容清空
2.3.4 使用方法
public static void main(String[] args) throws IOException {
// 创建字节输出流
FileOutputStream fos = new FileOutputStream("./src/Day21/FileOutputStream/test.txt");
// 写出int类型的ASCII码
fos.write(97);
// 写出一个数组
byte[] bytes = {97,98,99,100,101,102};
fos.write(bytes);
// 写出字节数组,从第0个开始,写出三个
fos.write(bytes,0,3);
// 没有提供写出字符串的方法,想要写出字符串需要先转换为字节数组
bytes = "你好吗?".getBytes();
fos.write(bytes);
// 刷缓存
fos.flush();
// 关闭资源
fos.close();
}
2.4 FileWriter
2.4.1 概述
字符输出
2.4.2 使用方法
public static void main(String[] args) throws IOException {
// 创建字符输出流
FileWriter fw = new FileWriter("./src/Day21/FileOutputStream/test.txt");
// 写出int,ASCII码
fw.write(97);
// 写出char数组
char[] chars = {'a','b','c','d','e'};
fw.write(chars);
// 写出字符数组中,从第0位开始,写出两个
fw.write(chars,0,2);
// 写出字符串
fw.write("abcde");
// 写出字符串,从第0位开始,写出2个
fw.write("abcde",0,2);
// 写出字符
fw.write('a');
// 刷缓存
fw.flush();
// 关闭资源
fw.close();
}
3. 缓存流
3.1 概述
【特点】
主要是为了提高效率而存在的,减少物理读取次数
提供readLine()、newLine()这样的便捷的方法(针对缓冲字符流)
在读取和写入时,会有缓存部分,调用flush为刷新缓存,将内存数据写入到磁盘
3.2 BufferReader
public static void main(String[] args) throws IOException {
// 字节输入流
FileInputStream fis = new FileInputStream("./src/Day21/BufferedReader_01.java");
// 字节输入缓冲流,需要把字节输入流对象传入
BufferedInputStream bis = new BufferedInputStream(fis);
// 使用方式 参考 字节输入流即可,方法作用一样
// 先开启的后关闭,关闭缓冲流的时候,会自动把节点流也关闭
bis.close();
// fis.close();
// System.out.println(fis.read());
// 字符输入流
FileReader fr = new FileReader("./src/Day21/BufferedReader_01.java");
// 字符输入缓冲流
BufferedReader br = new BufferedReader(fr);
// 新增读取一行的方法,其他方法参考字符输入流
// 返回值为字符串类型,返回此次读到的数据,如果到达文件末尾,返回null
// 不读取换行符
// br.readLine();
String temp = null;
while ((temp = br.readLine()) != null) {
System.out.println(temp);
}
br.close();
}
3.3 BufferedWriter
public static void main(String[] args) throws IOException{
// 字节输出流对象
FileOutputStream fos = new FileOutputStream("./src/test.txt");
// 字节输出缓冲流对象
BufferedOutputStream bos = new BufferedOutputStream(fos);
// 使用方式同字节输出流一致
bos.close();
// 字符输出流
FileWriter fw = new FileWriter("./src/test.txt");
// 字符输出缓冲流
BufferedWriter bw = new BufferedWriter(fw);
//新增一个写出换行的方法,其他方法参考字符输出流,使用方式一样
bw.newLine();
}
4. 转换流
public static void main(String[] args) throws Exception {
//创建字节输入流
FileInputStream fis = new FileInputStream("./src/test.txt");
// System.out.println((char)fis.read0);
//InputStreamReader isr = new InputStreamReader(fis):
// 如果我们编码环境不一致,会出现乱码问题,此时可以再构造方法中传入对应编码解决乱码问题
// 通过记事本,另存为,保存为 ANSI编码(GBK),由于我们软件环境为UTF-8格式
// 所以直接读取会出现码问题,要么把eclipse的编码设置为GBK可以解决,要么就创建对象时指定文件编码解决
InputStreamReader isr = new InputStreamReader(fis,"GBK");
int temp = 0;
while ((temp = isr.read()) != -1)
System.out.println((char) temp);
}
5. 打印流
5.1 概述
[特点]
打印流是输出最方便的类
包含字节打印流 PrintStream.字符打印流 PrintWriterPrintStream是 OutputStream,的子类,把一个输出流的实例传递到打印流之后,可以更加方便地输出内容,相当于把输出流重新包装一下
PrintStream 类的 print0方法被重载很多次 print(int i)、print(boolean b)、print(charc)
使用StringReader 读取字符串,然后使用打印流打印到控制台
[标准输入/输出]Java 的标准输入/输出分别通过 System.in 和 System.out 来代表,在默认的情况下分别代表键盘和显示器,当程序通过 System.in 来获得输入时,实际上是通过键盘获得输入。当程序通过 System.out 执行输出时,程序总是输出到屏幕
在 System 类中提供了三个重定向标准输入/输出的方法
static void setErr(PrintStream err) 重定向“标准”错误输出流
static void setln(lnputStream in) 重定向“标准”输入流
static void setQutPrintStream out)重定向“标准”输出流
5.2 使用方式
public static void main(String[] args) throws IOException {
// 字节输出流
FileOutputStream fos = new FileOutputStream("./src/test.txt");
//包装输出流,时输出操作更便捷
// 字节打印流
PrintStream ps = new PrintStream(fos);
ps.println(false);
ps.println(123);
ps.println("你好吗");
// 字符输出流
FileWriter fw = new FileWriter("./src/test.txt");
// 字符打印流
PrintWriter pw = new PrintWriter(fw);
pw.println("你在哪?");
pw.println(321);
pw.flush();
// System中 默认的out 是打印在控制台,但是可以修改打印路径
System.out.println("开始执行");
System.setOut(ps);
}
6. 数据流
6.1 概述
数据流 是为了不同平台之间数据读取的统一性 Linux,Windows等操作系统对数据进行存储的时候方式是不同的
为了解决之间的差异性java提供了两个轻量级的方法,只要每个平台有java环境,就能保证数据的一致性
比如 在进行网络协议传输的时候,是非常适用的
6.2 使用
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("./src/test.txt");
DataOutputStream dos = new DataOutputStream(fos);
// 以特定类型写出
dos.writeInt(123);
dos.writeLong(321);
dos.writeUTF("你好吗");
dos.flush();
dos.close();
FileInputStream fis = new FileInputStream("./src/test.txt");
DataInputStream dis = new DataInputStream(fis);
// 必须要按照写出的先后顺序及类型,去读取
System.out.println(dis.readInt());
System.out.println(dis.readLong());
System.out.println(dis.readUTF());
}