JavaSE01_Day04(上)-IO流、文件IO流
1.1 定义
I表示的是input输入,O表示output输出,Java中的IO流是以标准的形式进行对外界的设备进行数据的读写操作。读取称之为输入,写出称之为输出。
1.2 优点
RAF和IO流都可以对文件中的数据进行读写操作。RAF是基于指针的方式对于文件中的数据进行读写操作,读写很灵活,但是IO流是顺序进行读写操作。从灵活度来说,IO流不如RAF,但是对于复杂数据的读写操作,IO流要强于RAF。在工作中使用IO较多。
1.3 分类
-
按照流处理的方向进行分类:
-
输入流:将外界的数据"读取"到内存中。
-
输出流:将内存中的数据"写出"到外界中。
-
-
按照流处理时读写的单位进行分类:
-
字节流:字节流对数据的读写操作是以字节为单位进行读写。
-
字符流:字符流对数据的读写的操作是以字符为单位进行读写。
-
注意:
1.字符流的底层仍然是基于字节对数据进行读写的。
2.字符流只能对文本数据进行读写操作(像音频文件数据,视频文件数据,图片数据不能使用字符流进行读写操作)。
-
按照流处理的方式进行分类:
-
节点流:可以称之为是低级流,低级流是真实负责数据的读写操作,数据源明确。
-
处理流:可以称之为是高级流,不能对数据进行读写的操作,必须搭配低级流进行使用,使用高级流可以对数据的读写效率得到提升。
-
流与流之间的多次包装操作,称之为流连接。
1.4 InputStream和OutputStream常用API方法
-
InputStream是所有字节流的输入方向(读取)流的超类
//读取一个字节,以int的形式进行返回。读取字节低八位,如果返回值为-1,代表读到文件末尾
int read();
//读取给定字节数组的length个字节单位的数据,并将读取的数据存储到字节数组中,返回值为实际读取的字节量
int read(byte[] b);
-
OutputStream是所有字节流的输出方向(写出)流的超类
//写出一个字节,写出的是字节的低八位
void write();
//将给定的字节数组中的所有字节内容全部写出
void write(byte[] b)
二、文件IO流(低级流/节点流)
2.1 文件字节输出流FileOutputStream
FileOutputStream是文件的字节输出流,可以使用该流以字节为单位,向文件中进行写出数据。
//创建一个File对象,然后通过加载File文件的方式创建文件输出流对象
File file = new File("demo.txt");
FileOutputStream fos = new FileOutputStream(file);
//创建一个指定文件路径的文件输出流对象
FileOutputStream fos = new FileOutputStream("demo.txt");
注意事项:
如果文件进行写出内容时,之前就已经存在内容,当使用如上方案创建FileOutputStream文件输出流对象进行向demo.txt文件中写出数据时,会将之前文件中的数据全部覆盖掉。
//创建一个File对象,然后通过加载File文件的方式创建文件输出流对象
File file = new File("demo.txt");
FileOutputStream fos = new FileOutputStream(file,true);
//创建一个指定文件路径的文件输出流对象
FileOutputStream fos = new FileOutputStream("demo.txt",true);
注意事项:
以上创建的FileOutputStream文件输出流对象,是支持向文件中写出数据内容进行追加的模式,也就意味着在demo.txt文件中写出数据内容,不会覆盖掉之前的数据内容,而是在之前数据内容的末尾,继续写出新的数据内容。这种创建FileOutputStream文件输出流对象的方案应用率较高。
package cn.tedu.io;
import java.io.FileOutputStream;
/**
* 文件输出流案例
* FileOutputStream(低级流/节点流)
* @author cjn
*
*/
public class FOSDemo {
public static void main(String[] args) throws Exception {
//1.创建文件输出流(低级流)对象
FileOutputStream fos = new FileOutputStream("fos.txt",true);
//2.准备需要进行向fos.txt文件中写出的数据
String str = "IO流是非常重要的知识点!!!";
//3.将文本信息->字节序列(字节数组)
byte[] data = str.getBytes("utf-8");
//4.向fos.txt文件中写出数据
fos.write(data);
System.out.println("向fos.txt中写出数据完毕!!!");
//5.关闭资源
fos.close();
}
}
2.2 文件字节输入流FileInputStream
FileInputStream是文件的字节输入流,可以使用该流以字节为单位进行读取文件内容。
//创建file对象,然后将file对象作为文件输入流的构造器参数
File file = new File("fos.txt");
FileInputStream fis = new FileInputStream(file);
//创建文件输入流对象时,在构造器中传递文件路径作为参数
FileInputStream fis = new FileInputStream("fos.txt");
package cn.tedu.io;
import java.io.FileInputStream;
/**
* 文件输入流案例
* FileInputStream(低级流/节点流)
* @author cjn
*
*/
public class FISDemo {
public static void main(String[] args) throws Exception {
//1.创建文件输入流对象(低级流/节点流)读取数据
FileInputStream fis = new FileInputStream("fos.txt");
//2.定义字节数组,用于批量读取数据
byte[] data = new byte[1024 * 8];//8kb
//3.使用文件输入流调用read读取数据
int len = fis.read(data);
//4.将字节序列->字符串
String str = new String(data,0,len,"utf-8");
//输出读取到的字符串内容
System.out.println(str);
//5.关闭资源
fis.close();
}
}
2.3 使用文件输入输出流进行对文件复制操作
package cn.tedu.io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
/**
* 使用文件流(低级流/节点流)完成文件的复制操作
* @author cjn
*
*/
public class FOS_FIS_Copy {
public static void main(String[] args) throws Exception {
/*
* 1.创建文件输出流对象,用于写出数据内容
* 创建文件输入流对象,用于读取数据内容
*/
FileInputStream fis = new FileInputStream("等什么君 - 难渡.mp3");
FileOutputStream fos = new FileOutputStream("等什么君 - 难渡copy.mp3");
//2.定义整型变量,用于存储读取的字节量
int len = 0;
//3.定义一个字节数组
byte[] data = new byte[1024*10];//10kb
//4.循环读取字节数组单位的数据内容,如果读取到末尾即停止读取操作
while ((len=fis.read(data)) != -1) {
//5.写出读取的数据内容
fos.write(data, 0, len);
}
System.out.println("复制文件操作完毕");
//6.关闭资源
fis.close();
fos.close();
}
}