一、纪要
1、基本常识
IO,即in和out,也就是输入和输出
1.1、数据大小表
8bit(位)=1Byte(字节)
1024Byte(字节)=1KB
1024KB=1MB
1024MB=1GB
1024GB=1TB
1.2、字符和字节区别
字节是存储容量的基本单位,1字节=8个二进制位。
字符是指字母、数字、汉字和各种符号。
1.3、字节流的由来
字节流读取文字字节数据后,不直接操作而是先查指定的编码表。获取对应的文字。 在对这个文字进行操作。简单说:字节流+编码表。<br />字节流处理中文,如果一次读写一个字符对应的字节数就不会有问题,一旦将一个字符对应的字节分裂开来,就会出现乱码了。
1.4、字节流和字符流区别
字节流本身没有缓冲区,效率提升非常高。即使不关闭资源(close方法),文件也能输出。
字符流本身就带有缓冲区,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行、新缓冲区,这时才能在不close的情况下输出内容
二、IO流分类
按数据流方向:输出流 、输入流
按处理数据单位:字节流、字符流
按功能: 节点流、处理流
缓冲流
我们搬砖的时候,一块一块地往车上装肯定是很低效的。我们可以使用一个小推车,先把砖装到小推车上,再把这小推车推到车前,把砖装到车上。这个例子中,小推车可以视为缓冲区,小推车的存在,减少了我们装车次数,从而提高了效率。
1、字节流方法
字节流:InputStream,OutputStream 都是抽象类。所以不能直接new
1.1、FileOutputStream 字节流
FileOutputStream(File file, boolean append);
构造方法:
本地没有文件,会创建一个空文件
append 参数为true时,数据从文件尾部写入;为false时,数据覆盖文件
字节流输出数据实例:写入文件
//字节流输出数据
public static void main(String[] args) throws Exception{
//获取文件地址
File file = new File("d:/test.txt");
//本地无此文件 自动创建 true 数据从文本尾部添加
OutputStream outputStream = new FileOutputStream(file,true);
//字符转字节
String str = "hello world";
byte[] b = str.getBytes();
//输出数据至文件
outputStream.write(b);
//关闭字节流
outputStream.close();
}
换行符(\r\n): String str = “\r\nhello world”;
1.2、FileInputStream 字节流
字节流输入数据 :读取文件
//字节流 读取数据
public static void main(String[] args) throws Exception{
//获取文件地址
File file = new File("d:" + File.separator + "test.txt");
//实例化输入流
InputStream inputStream = new FileInputStream(file);
//创建字节数组存储
byte[] b = new byte[1024];
int len = inputStream.read(b);
//关闭流
inputStream.close();
System.out.println(new String(b,0,len));
}
以上方法有问题,开辟这么大字节数组,明显是浪费嘛,可以根据文件大小来定义字节数组大小
File的public long length()方法
//字节流 读取数据
public static void main(String[] args) throws Exception{
//获取文件地址
File file = new File("d:" + File.separator + "test.txt");
//实例化输入流
InputStream inputStream = new FileInputStream(file);
//创建字节数组存储
byte[] b = new byte[(int)file.length()];
inputStream.read(b);
//关闭流
inputStream.close();
System.out.println(new String(b));
}
以上情况只适合输入文件的大小,不知道的情况下
//字节流 读取数据
public static void main(String[] args) throws Exception{
//获取文件地址
File file = new File("d:" + File.separator + "test.txt");
//实例化输入流
InputStream inputStream = new FileInputStream(file);
//创建字节数组存储
byte[] b = new byte[1024];
int temp = 0;
int len = 0;
//-1为文件读完的标志
while ((temp = inputStream.read())!=-1){
b[len] = (byte) temp;
len++;
}
//关闭流
inputStream.close();
System.out.println(new String(b,0,len));
}
1.3、BufferedInputStream 缓存字节流
缓冲字节流是为高效率而设计的,真正的读写操作还是靠FileInputStream,所以其构造方法入参是这两个类的对象也就不奇怪了。
//缓冲字节输出流
public static void main(String[] args) throws Exception {
//获取文件地址
File file = new File("d:/test.txt");
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
//写入文件
String str = "百度一下,您就知道";
bos.write(str.getBytes());
//关闭流
bos.close();
}
1.4、BufferedOutputStream 缓存字节流
缓冲字节流是为高效率而设计的,真正的读写操作还是靠FileOutputStream,所以其构造方法入参是这两个类的对象也就不奇怪了。
//缓冲字节输入流
public static void main(String[] args) throws Exception {
//获取文件地址
File file = new File("d:" + File.separator + "test.txt");
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
//一次性获取多少字节
byte[] b = new byte[1024];
//文件数据的长度
int len = bis.read(b);
//关闭流
bis.close();
System.out.println(new String(b,0,len));
}
2、字节流方法
字符流:Reader,writer 都是抽象类。所以不能直接new
2.1、FileWriter
字符流输出流:写文件
//字符流输出数据
public static void main(String[] args) throws Exception {
//获取文件地址
File file = new File("d:" + File.separator + "test.txt");
Writer writer = new FileWriter(file);
String str = "机会是留给有准备的人";
//写入数据至文件
writer.write(str);
//不关闭字符流,数据还在缓存区 输出不出来
writer.close();
}
2.2、FileReader
字符流输入流:读文件
//字符流读取数据
public static void main(String[] args) throws Exception {
//获取文件地址
File file = new File("d:/test.txt");
Reader reader = new FileReader(file);
//字符数组方式读出数据
char[] c = new char[1024];
//获取数据最后的长度
int len = reader.read(c);
//关闭流
reader.close();
System.out.println(new String(c,0,len));
}
2.3、OutputStreamWriter 字符流
字符流适用于文本文件的读写,OutputStreamWriter类其实也是借助FileOutputStream类实现的,故其构造方法是FileOutputStream的对象
public static void main(String[] args) throws Exception{
//获取文件地址
File file = new File("d:/test.txt");
// 需要FileOutputStream 实现
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(file));
String str = "hahahahaha";
osw.write(str);
//关闭流
osw.close();
}
2.4、InputStreamReader 字符流
public static void main(String[] args) throws Exception {
//获取文件地址
File file = new File("D:/test.txt");
//依赖FileInputStream 实现输入数据
InputStreamReader isr = new InputStreamReader(new FileInputStream(file));
//字符数组
char[] c = new char[1024];
int len = isr.read(c);
System.out.println(new String(c,0,len));
}
2.5、BufferedReader 字符缓冲流
public static void main(String[] args) throws Exception{
//获取文件地址
File file = new File("d:/test.txt");
BufferedWriter bw = new BufferedWriter(new FileWriter(file));
String str = "神话";
bw.write(str);
//关闭流
bw.close();
}
2.6、BufferedWriter 字符缓冲流
public static void main(String[] args) throws Exception {
//获取文件地址
File file = new File("D:/test.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
//字符数组
char[] c = new char[1024];
int len = br.read(c);
System.out.println(new String(c,0,len));
}
3、IO流方法
3.1、字节流方法
字节输入流InputStream主要方法:
- read() : 从此输入流中读取一个数据字节。
- read(byte[] b) : 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。
- read(byte[] b, int off, int len) : 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。
- close(): 关闭此输入流并释放与该流关联的所有系统资源。
字节输出流OutputStream主要方法:
- write(byte[] b) : 将 b.length 个字节从指定 byte 数组写入此文件输出流中。
- write(byte[] b, int off, int len) : 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
- write(int b) : 将指定字节写入此文件输出流。
- close() : 关闭此输入流并释放与该流关联的所有系统资源。
3.2、字符流方法
字符输入流Reader主要方法:
- read():读取单个字符。
- read(char[] cbuf) :将字符读入数组。
- read(char[] cbuf, int off, int len) : 将字符读入数组的某一部分。
- read(CharBuffer target) :试图将字符读入指定的字符缓冲区。
- flush() :刷新该流的缓冲。
- close() :关闭此流,但要先刷新它。
字符输出流Writer主要方法:
- write(char[] cbuf) :写入字符数组。
- write(char[] cbuf, int off, int len) :写入字符数组的某一部分。
- write(int c) :写入单个字符。
- write(String str) :写入字符串。
- write(String str, int off, int len) :写入字符串的某一部分。
- flush() :刷新该流的缓冲。
- close() :关闭此流,但要先刷新它。
另外,字符缓冲流还有两个独特的方法:
- BufferedWriter类newLine() :写入一个行分隔符。这个方法会自动适配所在系统的行分隔符。
- BufferedReader类readLine() :读取一个文本行。