将数据从输入设备拿到内存,我们称之为input , 将数据从内存输出到外设,我们称之为output ,简称这个过程为IO,且input,output 是站在java程序的角度说的。
1. 分类
- 阻塞式的IO
① 网络IO:网络数据的操作
② 文件IO:本地文件的操作 - NIO(New IO):同步非阻塞式IO
2. 流
- 流: 数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象分为各种类,方便更直观的进行数据操作。
- 输入/ 输出流: 根据数据的流向不同,输入就是将数据从各种输入设备中读取到内存中。输出则正好相反,是将数据写入到各种输出设备。不同数据的处理(输入/输出),设备划分也不同。
java程序角度: 读取本地文件,硬盘是输入设备;写数据时,硬盘是输出设备。
硬盘角度: java程序读取本地文件时,硬盘是输出设备;写数据时,硬盘是输入设备。 - 流的操作只能执行一次。
- Java中的IO流的分类:
① 字节、字符流:Stream字节流,Writer、Reader字符流;
② 输入、输出流:Input输入、Output输出、Writer输出、Reader输入;
③ 文件:带File的IO类,作为文件操作的IO流;
④ 特殊的流:Print表示打印输出到某个设备,Scanner表示接收某个设备的输入(接收控制台输入时,从System.in键盘作为输入设备来的),StringWriter/StringReader(了解);
⑤ 二进制数组的操作: ByteArray;
⑥ java对象:Object; - java 中的IO流,是可以包裹其他IO流的。
- 字节流、字符流对比:
① 字节流操作的基本单元是字节;字符流操作的基本单元为Unicode码元。
② 字节流在操作的时候本身不会用到缓冲区的,是与文件本身直接操作的;而字符流在操作的时候使
用到缓冲区的。
③ 在使用字节流操作中,即使没有关闭资源(close方法),也能输出;而字符流不使用close方法的
话,不会输出任何内容。 - 字节字符转换流:
在进行转换的时候我们需要用到OutputStreamWriter 和InputStreamReader。
字节流转换为字符流,需要使用字节字符转换流、文件编码格式。
输入的字节流转换字符流
public class TestDemo {
public static void main(String[] args) {
// 创建字节流对象 System.in 代表从控制台输入
InputStream in = System.in;
// 创建字符流对象
BufferedWriter bw = null;
BufferedReader br = null;
try {
// 实例化字符流对象 通过 InputStreamReader 将字节输入流转化成字符输入流
br = new BufferedReader(new InputStreamReader(in));
//br = new BufferedReader(new InputStreamReader(in,"GBK"));
bw = new BufferedWriter(new FileWriter("a.txt"));
// 定义读取数据的行
String line = null;
// 读取数据
while ((line = br.readLine()) != null) {
// 如果输入的是"exit"就退出
if("exit".equals(line)){
break;
}
// 将数据写入文件
bw.write(line);
// 写入新的一行
bw.newLine();
// 刷新数据缓冲
bw.flush();
}
} catch (Exception e){
e.printStackTrace();
} finally {
// 释放资源
try {
if(bw != null)
bw.close();
if (br != null)
br.close();
} catch (IOException e){
e.printStackTrace();
}
}
}
}
输出的字符流转换成字节流
public class TestDemo {
public static void main(String[] args) {
// 定义字节输出流的对象System.out
OutputStream out = System.out;
// 定义字符流的对象
BufferedReader br = null;
BufferedWriter bw = null;
try {
//通过OutputStreamWriter将字符转流换为字节流对象
bw = new BufferedWriter(new OutputStreamWriter(out));
//bw = new BufferedWriter(new OutputStreamWriter(out,"GBK"));
br = new BufferedReader(new FileReader("a.txt"));
// 定义读取行的字符串
String line = null;
// 读取数据
while ((line = br.readLine()) != null) {
// 输出到控制台
bw.write(line);
// 新的一行
bw.newLine();
// 刷新缓冲
bw.flush();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
try {
if (bw != null)
bw.close();
if (br != null)
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}