IO流的概念和分类
概念:IO流——“I”是Input,即输入;“O”是Output,即输出;“流”是数据传输。
分类:(1)按照数据流向分:①输入流:读数据;②输出流:写数据。
(2)按照处理数据类型分:①字节流:Input Stream/Output Stream ;不能读出来;②字符流:Reader/Writer; 可以读出来。
1. 字节流
1.1 字节流抽象基类
(1)InputStream:这个抽象类是表示字节输入流的所有类的超类。
(2)OutputStream:这个抽象类是表示字节输出流的所有类的超类。
(3)子类名特点:子类名称都是以其父类名作为子类名的后缀。
1.2 字节输出流写数据的三种方式
(1)void write(int b); 将指定的字节写入此文件输出流 一次写一个字节数据。
(2)void write(byte[ ] b); 将 b.length字节从指定的字节数组写入此文件输出流 一次写一个字节数组数据。
(3)void write(byte[] b, int off, int len); 将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流 一次写一个字节数组的部分数据。
1.3 字节输出流写数据的步骤
(1)创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)。
(2)调用字节输出流对象的写数据方法。
(3)释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源)。’
具体代码:(我创建在D盘中的txt文件)
public class FileOutputStreamDemo01 {
public static void main(String[] args) throws IOException {
// 创建字节输出流对象
FileOutputStream fos = new FileOutputStream("D:\\abc\\fos.txt");
// 调用系统功能创建了文件
// 创建了字节输出流对象
// 让字节输出流对象指向创建好的文件
//
// void write(int b)
// 将指定的字节写入此文件输出流
fos.write(97);
// 最后都要释放资源
// 关闭此文件输出流并释放与此流相关联的任何系统资源
fos.close();
}
}
1.4 字节输出流写数据的异常处理
try{
可能出现异常的代码;
}catch(异常类名 变量名){
异常的处理代码;
}finally{
执行所有清除操作;
}
具体代码:
public class FileOutputStreamDemo04 {
public static void main(String[] args) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream("D:\\abc\\fos.txt");
fos.write("hello".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
// 加入finally来实现释放资源
finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
1.5 字节输入流读数据
public class FileInputStreamDemo01 {
public static void main(String[] args) throws IOException {
// 创建字节输入流对象
FileInputStream fis = new FileInputStream("d:\\abc\\fos.txt");
int b;
//
// fis.read():读数据
// b=fis.read():把读取到的数据赋值给by
// b != -1:判断读取到的数据是否是-1
//
while ((b = fis.read()) != -1) {
System.out.print((char) b);
}
// 释放资源
fis.close();
}
}
1.6 字节缓冲流
(1)BufferedOutputStream(OutputStream out); 创建字节缓冲输出流对象 。
(2)BufferedInputStream(InputStream in); 创建字节缓冲输入流对象。
2. 字符流
2.1 字符输出流写数据的五种方式
(1)void write(int c); 写一个字符。
(2)void write(char[] cbuf); 写入一个字符数组。
(3)void write(char[] cbuf, int off, int len); 写入字符数组的一部分。
(4)void write(String str); 写一个字符串。
(5)void write(String str, int off, int len); 写一个字符串的一部分。
2.2 字符输入流读数据的两种方式
(1)int read(); 一次读一个字符数据。
(2)int read(char[] cbuf) ; 一次读一个字符数组数据 。
具体代码:
public class InputStreamReaderDemo {
public static void main(String[] args) throws IOException {
FileInputStream in = new FileInputStream("d:\\abc\\osw.txt");
InputStreamReader isr = new InputStreamReader(in);
// 一次读一个字符数组数据
char[] chs = new char[1024];
int len;
while ((len = isr.read(chs)) != -1) {
System.out.print(new String(chs, 0, len));
}
// 释放资源
isr.close();
}
}
2.3 字符缓冲流
(1)BufferedWriter(Writer out); 创建字符缓冲输出流对象。
(2)BufferedReader(Reader in); 创建字符缓冲输入流对象。
3. 小结
3.1 字节流
3.2 字符流