目录
(一)什么是IO
对于任何程序设计语言而言,输入输出(Input/Output)系统都是非常核心的功能。程序运行需要数据,数据的获取往往需要跟外部系统进行通信,外部系统可能是文件、数据库、其他程序、网络、IO设备等等。外部系统比较复杂多变,那么我们有必要通过某种手段进行抽象、屏蔽外部的差异、从而实现更加便捷的编程。
(二)Input、Output
(三)数据源
(四)流
Java中流的概念细分
按流的方向分类
- 输入流:数据流从数据源到程序(以InputStream、Reader结尾的流)
- 输出流:数据流从程序到目的地(以OutputStream、Writer结尾的流)
按处理的数据单元分类:
- 字节流:以字节为单位获取数据,命名上以Stream结尾的流一般是字节流。
如FileInputSream、FileOutputSream
- 字符流:以字符为单位获取数据,命名上以Reader/Writer结尾的流一般是字符流,
如FileReader 、FileWriter。
使用哪个流是取决于要读取的文件类型是什么样的
字节流:读取的外部资源为二进制的文件,比如,图片,影音。
字符流:文件为文本性的东西,基于文本内容的形式读进来
按处理对象不同分类
- 节点流:可以直接从数据源或目的地读写书数据,如FileInputSream、FileReader、DataInputSream等。
- 处理流:不直接连接到数据源或目的地,是“处理流的流”。通过对其他流的处理提高程序的性能,如BufferedInputSream、BufferedReader等。处理流也叫包装流。
(五)IO流类的体系
以Stream结尾的都是字节流,以Reader和Writer结尾的都是字符流
IO流使用案例
在D盘中创建一个a.txt文件,内容如下
字节流FileInputStream对象使用read方法返回的值是0-255之间的int值
read方法只读取了一个字符,把文件中的字符基于字节读取,然后转换成十进制的整数,这个整数对应的就是这个字符的ASCII码
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FirstDemo {
public static void main(String[] args) {
FileInputStream fis=null;//使用完流对象后要把流对象关掉,如果在try catch里面创建流对象的话,那么创建的这个流对象的作用域是不包括finally里面的
try {
//实例化字节输入流对象
fis=new FileInputStream("D:/a.txt");
int s1=fis.read();//read方法是将字符一个一个读取的,所以首先打印输入字符a对应的ASCII码值97
int s2=fis.read();//打印输出字符b对应的ASCII码值98
int s3=fis.read();//打印输出字符c对应的ASCII码值99
int s4=fis.read();//由于文件内容已经读取完毕,则返回-1
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
System.out.println(s4);//如果没有找到那么返回-1
} catch (Exception e) {
e.printStackTrace();
}finally {//选择在finally里面关闭流对象是因为当程序出现问题时也会关闭流对象
if (fis!=null){
try {
fis.close();//关闭流对象
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
运行结果:
案例改进版本
改进地方:由于read方法只能一个一个字符进行读取,那么一个文件有很多内容时,把read放在循环里面即可,然后将ASCII码值转换为对应的char类型的值,即可输出文本内容
import java.io.FileInputStream;
import java.io.IOException;
public class SecondDemo {
public static void main(String[] args) {
FileInputStream fis=null;
try {
//创建字节输入流对象
fis = new FileInputStream("d:/a.txt");
StringBuilder sb=new StringBuilder();
int temp=0;
//由于read方法每次只能读取一个字符,那么就把read方法放在循环里面,这样就能把文件读取完
while ((temp=fis.read())!=-1){
System.out.println(temp);
sb.append((char)temp);//把读取得到的ASCII码值转换为字符并添加到StringBuilder类对象sb里面
}
System.out.println(sb);
}catch (Exception e){
e.printStackTrace();
}finally {
try {
if (fis!=null)
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
运行结果: