一、IO流
IO流的概述:
IO流用来处理设备之间的数据传输,Java对数据的操作是通过流的方式,用于操作流的对象都在IO包中,进行输入、输出操作。
输入:也叫作读取数据
输出:也叫作写出数据
1.1 IO流的分类
根据数据的流向:
输入流:把数据从其他设备读取到内存中的流
输出流:把数据从内存中写入其他设备上的流
根据数据的类型:
字节流:以字节为单位,读写数据的流
字符流:以字符为单位,读写数据的流
1.2 流的父类
字节输入流:InputStream
字节输出流:OutputStream
字符输入流:Reader
字符输出流:Writer
二、字节流
一切文件数据(文本、图片、视频)在存储时,都是以二进制数字的形式保存,一个一个的字节形式,那么在传输的时候也一样。字节流可以传输任意数据的文件。
无论使用什么流对象进行传输,底层传输的始终是二进制数据
2.1 字节输出流OutPutStream
字节输出流OutPutStream是所有字节输出流的超类,是一个抽象类。定义了字节输出流的基本共性方法
方法:
public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
public abstract void write(int b) :将指定的字节输出流。
public void write(byte[] b) :将 b.length字节从指定的字节数组写入此输出流。
public void write(byte[] b, int off, int len) :从指定的字节数组写入len个字节,从偏移量 off 开始输出到此输出流。
2.2 文件输出流FileOutPutStream
FileOutPutStream类是文件输出流,用于将数据写出文件
写入数据的原理(内存-->硬盘) 输出
Java程序---JVM---OS---OS调用数据的方法---把数据写入文件
2.2.1 构造方法
public FileOutputStream(File file) :创建文件输出流以写入由指定的 File对象表示的文件。
public FileOutputStream(String name) : 创建文件输出流以指定的名称写入文件。
构造方法的作用:创建一个FileOutputStream的对象,根据构造方法中传递的参数,创建一个空的文件,把FileOutputStream对象指向创建好的文件
注意:在创建一个流对象时,必须传入一个文件路径。该路径下,如果没有文件,就会创建该文件。如果有,就会将这个文件的内容清空
使用字节输出流OutPutStream中的write方法可以写入字节数据
public class Demo01 {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("a.txt");
// public abstract void write(int b) :将指定的字节输出流。
fos.write(98);
byte[] bytes={
98,99,100,101,102};
//public void write(byte[] b) :将 b.length字节从指定的字节数组写入此输出流。
fos.write(bytes);
//public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
fos.write(bytes,1,2);
/*
那么我们想要在文件中显示100,需要写入3个字节*/
fos.write(49);
fos.write(48);
fos.write(48);
//写入字符串的方法,使用String类中的方法转为为字节数组
String str="你好";
fos.write(str.getBytes());
System.out.println(Arrays.toString(str.getBytes()));//表示你好的字节数组:[-28, -67, -96, -27, -91, -67]
//使用完流记得关闭
fos.close();
}
}
显示效果:
使用完流记得调用close方法:
(1)通知系统释放关于管理流指定文件的资源
(2)让IO流对象变成垃圾,等待垃圾回收器对其进行回收
2.2.2 追加写的构造方法
FileOutputStream(File file, boolean append) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(String name, boolean append) 创建一个向具有指定 name 的文件中写入数据的输出文件流。
其中,第一个参数和上面的构造方法相同,指向一个文件。第二个参数是追加写的开关
true:不会覆盖原文件,继续在文件的末尾追加写数据
false:创建一个新的文件,覆盖原文件
当我们需要换行的时候,不同的系统存在不一样的情况,windows系统里可以使用“\r\n”,Linux里则为“\n”。Mac系统里为"\r"
代码演示:
public class Demo02 {
public static void main(String[] args) throws IOException {
//追加写 第二个参数为true 不会覆盖原文件
FileOutputStream fos = new FileOutputStream("b.txt",true);
for (int i = 0; i < 5; i++) {
fos.write(("你好"+i).getBytes());
//使用换行符
fos.write("\r\n".getBytes());
}
}
}
将程序运行两次之后,b.txt的文件内容:
2.3 字节输入流InPutStream
字节输入流InPutStream是字节输入流的所有类的超类,可以读取字节信息到内存中。
其中定义了字节输入流的基本共性方法
public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
public abstract int read() : 从输入流读取数据的下一个字节。
public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。
2.4 文件字节输入流FileInPutStream
FileInPutStream是文件输入流,从文件中读取数据
读取数据的原理:硬盘---内存 输入
Java程序---JVM---OS---OS读取数据的方法---读取文件
2.4.1 构造方法
FileInputStream(File file) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
FileInputStream(String name) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。
创建一个FileInputStream对象,会把FileInputStream对象指向构造方法中读取的文件
注意:当创建一个文件字节输入流对象时,必须传入一个文件路径,如果该文件路径不存在,就会抛出FileNotFoundException异常
使用字节输入流的read方法可以读取数据
一次读取一个字节:
public class Demo01 {
public static void main(String[] args) throws IOException {
//构造方法传入刚在写入的文件路径
FileInputStream fis = new FileInputStream("a.txt");
//public abstract int read() 读取文件中的一个字节并返回,读取到文件的末尾返回-1
//定义一个int类型接受read方法返回的字节