IO 概述
I: input O:Output 流: 像水流一样传输数据
内存不能永久化存储 程序停止 数据丢失
IO流: 存储和读取数据的解决方案
File : 表示系统中的文件或者文件夹的路径 (获取文件信息 判断文件的类型 创建文件/文件夹 删除文件/文件夹 … )
注意: File类只能对文件本身进行操作 不能读写文件里面存储的数据
IO流 用于读写文件中的数据(可以读写文件 或 网络中的数据)
问: IO流中 谁在读 谁在写? 以谁为参照物看读写的方向呢?
答: 以程序为参照物 是程序在读 程序在写
IO的分类
纯文本文件: windows自带记事本能打开且能读懂的就是纯文本
IO流的体系
字节流
FileOutputStream
操作本地文件的字节输出流体 可以把程序中的数据写到本地文件中
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| import java.io.FileOutputStream; import java.io.IOException;
public class Main { public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("notes_IO\\a.txt"); fileOutputStream.write(97); fileOutputStream.close(); } }
|
FileOutputStream写数据的3种方式
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| public class ByteStreamDemo3 { public static void main(String[] args) throws IOException { FileOutputStream fileOutputStream = new FileOutputStream("notes_IO\\a.txt");
fileOutputStream.write(97); fileOutputStream.write(98);
byte [] bytes = {97,98,99,101}; fileOutputStream.write(bytes);
fileOutputStream.write(bytes,1,2);
fileOutputStream.close(); } }
|
FileOutputStream 换行与续写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Arrays;
public class ByteStreamDemo4 { public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("notes_IO\\a.txt",true); String str = "kankelaoyezuishui"; byte[] bytes = str.getBytes(); fileOutputStream.write(bytes);
String wrap = "\r\n"; byte[] wrapBytes = wrap.getBytes(); fileOutputStream.write(wrapBytes);
String str2 = "666"; byte[] bytes2 = str2.getBytes(); fileOutputStream.write(bytes2);
fileOutputStream.close(); } }
|
FileInputStream
操作本地文件的字节输入流 可以把本地文件中的数据读取到程序中来
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;
public class ByteStreamDemo1 { public static void main(String[] args) throws IOException {
FileInputStream fileInputStream = new FileInputStream("notes_IO\\a.txt"); int b1 = fileInputStream.read(); System.out.println((char) b1);
int b2 = fileInputStream.read(); System.out.println((char) b2);
fileInputStream.close(); } }
|
FileInputStream循环读取
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException;
public class ByteStreamDemo2 { public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("notes_IO\\a.txt"); int b;
while ((b = fis.read()) != -1){ System.out.println((char) b); }
fis.close(); } }
|
为什么会有乱码?
原因1: 读取时未读完整个汉字
原因2: 编码和解码时的方式不统一 -> 统一 UTF-8
字符流
字符流的底层其实就是字节流
字符流 = 字节流 + 字符集
特点:
输入流: 一次读一个字节 遇到中文 一次读多个字节
输出流: 底层会把数据按照指定的编码形式进行编码 变成字节再写到文件中
使用场景:
对于纯文本文件进行读写操作
FileReader
空参 read
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException;
public class CharStreamDemo1 { public static void main(String[] args) throws IOException {
FileReader fileReader = new FileReader("notes_IO\\a.txt");
int ch; while ((ch = fileReader.read()) != -1){ System.out.println((char) ch); }
fileReader.close();
} }
|
带参 read
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException;
public class CharStreamDemo2 { public static void main(String[] args) throws IOException { FileReader fileReader = new FileReader("notes_IO\\a.txt"); char[] chars = new char[2]; int len; while ((len = fileReader.read(chars))!= -1){ System.out.println(new String(chars,0,len)); }
fileReader.close(); } }
|
FileWriter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| import java.io.*;
public class CharStreamDemo3 { public static void main(String[] args) throws IOException { FileWriter fileReader = new FileWriter("notes_IO\\a.txt",true);
fileReader.write(25105);
fileReader.write("你好啊!!!");
char [] chars = {'a','v','k','元'}; fileReader.write(chars);
fileReader.close(); } }
|
字符流原理解析
字符输入流的底层原理
字符输出流的底层原理