一,什么是IO
概念:是以流为基础进行数据的输入输出。通俗点说就是java通过数据流方式和外部进行通讯。
IO中数据的操作是通过流的方式,我们可以把数据流看成水流一样,他可以从一个源头端流入到另一个目的端,且水流不是一次全部到达,而且连续的流入目的端。I是指从外部设备的数据流流入java程序的流,o是指从java程序中把数据流输出到其他设备中的流。
IO操作的2个步骤
1、准备数据
2、把数据从内核中拷贝到程序进程
IO的分类
根据数据的流向分为:输入流和输出流
输入流input:读取外部数据(磁盘、光盘等存储设备的数据)程序(内存)中的流。
输出流output:将程序(内存)数据输出到磁盘、光盘等存储设备中的流。
按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)。
按数据流的流向不同分为:输入流,输出流。
按流的角色的不同分为:节点流,处理流。
二, 字节流
概念:InputStream
与OutputStream
是两个抽象类,是字节流的基类,所有具体的字节流实现类都是分别继承了这两个类。
字节输入流:
字节输入流【InputStream】java,io.Inputstream 抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。它定义了字节输入流的基本共性功能方法。
public void close():关闭此输入流并释放与此流相关联的任何系统资源。
public abstract int read() : 从输入流读取数据的下一个字节。
public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组b中。
close方法,当完成流的操作时,必须调用此方法,释放系统资源。
/**
* @author 高影 2022/12/13 11:57
* @version 1.0
*/
public class Demo03 {
public static void main(String[] args) throws IOException {
//输出流:把内容的内存输出到文件中(写操作) 输入流:把文件的内容输入到内存中(读操作)
File f1 = new File("D:/a.txt");
f1.createNewFile();
String s = "abcde";
OutputStream out = new FileOutputStream(f1);
out.write(s.getBytes());
//定义输入流来读取文件内容
InputStream in = new FileInputStream(f1);
//读一个字节,把当前字符转换成对应的整数 返回
int c1 = in.read();
System.out.println(c1);
}
}
字节输出流:
字节输出流【OutputStream】java.io.0utputStream 抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。它定义了字节输出流的基本共性功能方法。
public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
public void flush() : 刷新此输出流并强制任何缓冲的输出字节被写出。
public void write(byte[] b) : 将 b.length字节从指定的字节数组写入此输出流。
public void write(byte[] b, int off, int len) :从指定的字节数组写入len字节,从偏移量 off开始输出到此输出流。
public abstract void write(int b):将指定的字节输出流。
/**
* @author 高影 2022/12/13 10:49
* @version 1.0
*/
public class Demo01 {
public static void main(String[] args) throws IOException {
File f1 = new File("d:/aa");
File f2 = new File(f1,"a.txt");
f1.mkdirs();
f2.createNewFile();
//使用OutPutStream输出流完成对文件的写入操作 内存输出到文件
OutputStream out = new FileOutputStream(f2); //定义一个输出流,输出到f2文件中
//out.write(97);//按照ASCII解析数字 写入文件中 写入的是97对应的 a
byte[] bytes = {97,98,99,100,101,102,103};
//out.write(bytes); //按照ASCII解析数字 写入文件中 写入的是:abcdefg
out.write(bytes,2,3); // 从数组 指定索引位置2 写入3个元素
}
}
/**
* @author 高影 2022/12/13 11:05
* @version 1.0
*/
public class Demo02 {
public static void main(String[] args) throws IOException {
File f1 = new File("d:/来自一个爱你的表白");
f1.createNewFile();
OutputStream out = new FileOutputStream(f1);
Scanner sc = new Scanner(System.in);
System.out.println("请输入:");
String msg = sc.next();
byte[] bytes = msg.getBytes(); //获取字符串对应解析后的byte数组
out.write(bytes);
}
}
综合案例:完成文件的复制
在D盘中新建文件a.txt里面写入内容
/**
* @author 高影 2022/12/13 13:17
* @version 1.0
*/
public class Demo04 {
public static void main(String[] args) throws IOException {
//创建文件对象
File f1 = new File("D:/a.txt");
f1.createNewFile(); //创建文件
String s = "还和以前一样好好的"; // 准备写入的数据
OutputStream out = new FileOutputStream(f1); //创建输出对象
out.write(s.getBytes());
//创建输入流对象
InputStream in = new FileInputStream(f1);
//获取字节返回一个int类型的变量
int read = in.read();
//初始化n
int n;
//使n=read值,当n不等于-1时,则打印出n的值
while ((n=in.read()) !=-1){
System.out.println(n);
}
}
}
/**
* @author 高影 2022/12/13 13:17
* @version 1.0
*/
public class Demo05 {
public static void main(String[] args) throws IOException {
//定义源文件和目标文件的File对象
File f1 = new File("D:/a.txt");
File f2 = new File("D:/f2.txt");
//定义输入输出流关联文件
InputStream in = new FileInputStream(f1);
OutputStream out = new FileOutputStream(f2);
byte[] b = new byte[10];
int n;
while ((n=in.read(b)) !=-1){
out.write(b,0,n);
}
}
}