IO流原理
I/O 是input/output 的缩写。用于处理设备之间的数据传输。
in --> 输入,out -->输出
java 将IO 必须为“流”,即Stream .只支持单向顺序流动,这里的流动是二进制数据,我们可以理解他们是连接程序与另一端口的管道.用于获取和发送数据到另一端。
IO流的分类:
1.根据数据的流向分为:输入流 和 输出流 (参照点是当前程序。从程序写出到另一端口,从另一端口读入到当前程序)
-
输入流:从外界到程序,用来读取数据
-
输出流:从程序到外界,用来写出数据
2.根据数据的操作单位分为:字节流, 字符流
-
字节流:以字节为单位读写数据
-
字符流:以符节为单位读写数据
3.根据是否直接操作数据分为:节点流(低级流) 和 处理流(高级流).高低级之分只是是否能直接作用于文件。
低级流: 也叫节点流,负责实际读写数据
高级流(不能直接作用于文件):也叫处理流,不能独立存在,必须连接在其他流上,目的是当数据流经当前流时对其他某些加工处理,
简化我们的读写操作。读写数据一定是建立在低级流的基础上进行。
java定义了两个超类(抽象类)
java.io.InputStream: 所有字节输入流的超类。
java.io.OutputStream: 所有字节输出流的超类
里面定义了若干读取和写出字节的相关方法,所有字节流都继承自InputStream 和 OutputStream.
因此无论我们将来要读写什么设备,只要使用对应的流调用相同的方法就可以。
文件流:java.io.FileOutputStream 和 java.io.FileInputStream。(直接连接文件)
这是常用的一对字节流,也是(低级流),用于连接程序与文件(硬盘)的”管道“,负责读写数据
文件字节流
FileInputStream 和 FileOutputStream
FileOutputStream 的构造方法:
覆盖模式
-
FileOutputStream (String path); 通过指定的路径来创建一个字节输出流对象
FileOutputStream fos = new FileOutputStream("fos.txt");当指定的文件路径不存在时,创建该文件。如果指定的文件已经存在,则每次操作写出数据到文件会覆盖之前的内容
-
FileOutputStream (File file);通过指定的文件来创建一个字节输出流对象,往原文件中写入数据的
以上构造方法创建文件输出流的是覆盖模式,如果指定的文件已经存在,则会将该文件原有数据全部抹除,然后通过当前流写出的数据保存到文件中
追加模式(非覆盖模式)
-
FileOutputStream (File file , boolean append);通过一个实际的文件来创建FileOutputStream对象,通过boolean
-
FileOutputStream (String path ,boolean append);
文件流有重载的构造方法,允许我们传入一个boolean 类型的参数,如果该值为true,则文件流创建时是追加模式,如果指定的文件存在,则原内容全部保存,通过当前流写出的新内容会被顺序追加到文件中。
// FileOutputStream fos = new FileOutputStream("fos.txt");
//RandomAccessFile fos = new RandomAccessFile("fos.txt","rw");
FileOutputStream fos = new FileOutputStream("fos.txt",true);
FileOutputStream 和 RandomAccessFile 写文件的区别
RandomAccessFile是基于指针的随机读写形式, 可以对文件任意位置进行局部覆盖,但是文件流不行,由于java标准的IO是顺序读写形式,对于操作而言只能按顺序的先后写。不能回退,因此写操作的灵活性不如RandomAccessFile.
但是后期基于流连接,可以串联若干高级流完成复杂的读写操作,这一点上是RandomAccessFile所不及的。
通俗理解:
RandomAccessFile 就好比个体,个体的活动灵活,但是力量薄弱,File 是一个团队的一员,团队的力量强大。
package JAVA_API.num12;
import java.io.*;
/**
* java标准IO
* in --输入,out--输出
* java将IO比喻为“流”,即Stream .只支持单向顺序流动,这里的流动是二进制数据,
* 我们可以理解他们是连接程序于另一端口的管道.用于获取和发送数据到另一端。
*
* IO流的分类:
* 1.根据数据的流向分为:输入流 和 输出流 (参照点是当前程序。从程序写出到磁盘,从磁盘读入到当前程序)
* 输入流:从外界到程序,用来读取数据
* 输出流:从程序到外界,用来写出数据
* 2.根据数据的操作单位分为:字节流,字符流
* 字节流:以字节为单位读写数据
* 字符流:以符节为单位读写数据
* 3.根据是否直接操作数据分为:节点流(低级流) 和 处理流(高级流).高低级之分只是是否能直接作用于文件。
* 低级流:也叫节点流,负责实际读写数据
* 高级流(不能直接作用于文件):也叫处理流,不能独立存在,必须连接在其他流上,目的是当数据流经当前流时对其他某些加工处理,
* 简化我们的读写操作。读写数据一定是建立在低级流的基础上进行。
*
* java定义了两个超类(抽象类)
* java.io.InputStream: 所有字节输入流的超类。
* java.io.OutputStream:所有字节输出流的超类
* 里面定义了若干读取和写出字节的相关方法,所有字节流都继承自InputStream 和 OutputStream.
* 因此无论我们将来要读写什么设备,只要使用对应的流调用相同的方法就可以了。
*
* 文件流:java.io.FileOutputStream 和 java.io.FileInputStream。(直接连接文件)
* 这是常用的一对字节流,也是(低级流),用于连接程序与文件(硬盘)的”管道“,负责读写数据
* @author yyc
* 2021/9/15 14:06
*/
/* 文件字节流 练习*/
public class Test1_FOS {
public static void main(String[] args) throws Exception {
/*
*FileOutputStream 的构造方法:
* FileOutputStream (String path);通过指定的路径来创建一个字节输出流对象
* FileOutputStream (File file);通过指定的文件来创建一个字节输出流对象,往原文件中写入数据的时候会覆盖原有文件。
* 以上构造方法创建文件输出流的是覆盖模式,如果指定的文件已经存在,则会将该文件原有数据全部抹除,然后通过当前流写出的数据保存到文件中
* FileOutputStream (File file , boolean append);通过一个实际的文件来创建FileOutputStream对象,
* 通过boolean
* FileOutputStream (String path ,boolean append);
* 文件流有重载的构造方法,允许我们传入一个boolean 类型的参数,如果该值为true,则文件流创建时是追加模式,
* 如果指定的文件存在,则原内容全部保存,通过当前流写出的新内容会被顺序追加到文件中。
* */
// FileOutputStream fos = new FileOutputStream("fos.txt");
//RandomAccessFile fos = new RandomAccessFile("fos.txt","rw");
//文件字节流
FileOutputStream fos = new FileOutputStream("fos.txt",true);
/*
* 与RandomAccessFile 写文件的区别,RandomAccessFile是基于指针的随机读写形式,
* 可以对文件任意位置进行局部覆盖,但是文件流不行,由于java标准的IO是顺序读写形式,对于操作而言
* 只能顺序先后写。不能回退,因此写操作的灵活性不如RandomAccessFile.
* 但是后期基于流连接,我们可以串联若干高级流完成复杂的读写操作,这一点上是RandomAccessFile所不及的。
* */
String str = "编码89757";
//将字符串内容写出到文件,因为write / read 只能操作字节,所以需要将字符串转化为字节数组。
byte[] data = str.getBytes("UTF-8");
fos.write(data);
str = "从这一刻即使你给我的名字~";
data = str.getBytes("UTF-8");
fos.write(data);
fos.close();
System.out.println("写出完毕!");
}
}