java笔记IO 《1》
1.0.0基本概念及IO入门
对于任何程序设计语言而言,输入输出(Input/Output)系统都是非常核心的功能。程序运行需要数据,数据的获取往往需要跟外部系统进行通信,外部系统可能是文件、数据库、其他程序、网络、IO设备等等。外部系统比较复杂多变,那么我们有必要通过某种手段进行抽象、屏蔽外部的差异,从而实现更加便捷的编程。
IO:输入、输出(input/output),
输入input:可以让程序从外部系统获得(读取)数据,
读取硬盘上的文件内容到程序。例如:播放器打开一个视频文件、word打开一个doc文件。
读取网络上某个位置内容到程序。例如:浏览器中输入网址后,打开该网址对应的网页内容;下载网络上某个网址的文件。
读取数据库系统的数据到程序
读取某些硬件系统数据到程序。例如:车载电脑读取雷达扫描信息到程序;温控系统等。
输出output:程序输出数据给外部系统,从而可以操作外部系统(写,输出)
将数据写到硬盘中。例如:我们编辑完一个word文档后,将内容写到硬盘上进行保存。
将数据写到数据库系统中。例如:我们注册一个网站会员,实际就是后台程序向数据库中写入一条记录。
将数据写到某些硬件系统中。例如:导弹系统导航程序将新的路径输出到飞控子系统,飞控子系统根据数据修正飞行路径。
java。io 包为我们提供了相关的API,实现对所有外部系统的输入输出操作。
##1.1.1 数据源
数据源:data source,提供数据的原始媒介。
数据源分为:源设备,目标设备。
1.源设备:为程序提供数据,一般对应输入流。
2.目标设备:程序数据的目的地,一般应对输出流。
常见的数据员有:数据库,文件,其他程序,内存,网络连接,IO设备。
1.1.1数据源示意图
##1.1.2流的概念
流(stream),是一个抽象,动态的概念,是一连串连续动态的数据集合。
按流向分:
输入流:我们通过流(stream)将数据源(source)中的数据(information)输送到程序(Program)中。
输入流是数据源到程序(以InputStream.Reader结尾的流)。
输出流我们通过流(stream)将程序(Proram)中的数据(information)输送到目的数据源(dest)中。
输出流是程序到目的地(以OutPutStream,Writer结尾的流)。
##输入/输出流的划分 是相对于程序而言的,并不是相对数据源
按处理的数据单元分为:
1、字节流:以字节为单位获取数据,命名上以Stream结尾的流一般是字节流,eg:FileInputStream、FileOutputStream。
2、处理流:以字符为单位获取数据,命名上以Reader/Writer结尾的流一般是字符流,eg:FileReader、FileWriter。
按处理对象不同分:
1、节点流:可以直接从数据源或者目的地读写数据,eg:FileInputStream、FileReader、DataInputStream等。
2、处理流:不直接连接到数据源或者目的地,是“处理流的流”。通过对其他流的处理提高程序的性能,eg:BufferedInputStream、BufferedReader等。处理流也叫包装流。
节点流处于IO操作的第一线所有操作必须通过他们进行; 处理流可以对节点流进行包装,提高性能或提高程序的灵活性。
##1.1.3 第一个简单的IO流程序及深入理解
当程序需要读取数据源的数据时,就会通过IO流对象开启一个通向数据源的流,通过这个IO流对象的相关方法可以顺序读取数据源 中的数据。
【示例1.1.3】使用流读取文件内容(不规范写法,仅用于测试)
import java.io.*;
public class TestIO1 {
public static void main(String[] args) {
try {
//创建输入流
FileInputStream fis = new FileInputStream("d:/a.txt"); // 文件内容是:abc
//一个字节一个字节的读取数据
int s1 = fis.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);
// 流对象使用完,必须关闭!不然,总占用系统资源,最终会造成系统崩溃!
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
执行结果:
通过10.1需要注意的是:
1、在以上代码中读取的文件是已知的,所以可以使用固定次数的“ int s = fis.read(); ”语句读取内容,但在实际开发中,通常我们不知道文件的内容,因此我们在读取的时候需要配合while循环使用。
2、为了保证出现异常后流的正常关闭,通常要将流的关闭语句放到finally语句块中,并且要判断流是不是NULL.
###IO流的经典写法如下:
10.2 使用流读取文件内容(经典代码,一定要掌握)
import java.io.*;
public class TestIO2 {
public static void main(String[] args) {
FileInputStream fis = null;
try {
//创建输入流
fis = new FileInputStream("d:/a.txt"); // 内容是:abc
StringBuilder sb = new StringBuilder();
int temp = 0;
//当temp等于-1时,表示已经到了文件结尾,停止读取
while ((temp = fis.read()) != -1) {
sb.append((char) temp);
}
System.out.println(sb);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
//这种写法,保证了即使遇到异常情况,也会关闭流对象。
if (fis != null) {
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
执行结果如下: