Java IO
java IO原理
I/O是input/output的缩写,用于处理设备之间的数据传输,如读写文件,网络通讯等。
java程序中,对于数据的输入/输出以流(stream)的方式进行。
java.io包下提供了各种流类和接口,用于获取不同种类的数据,并通过标准的方法输入或输出数据
对于输入输出的概念需要站在程序的角度考虑:
输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。
输出output:将程序(内存)数据输出到磁盘、光盘等存储设备。
流的分类
- 按操作的数据单位不同分为:字节流(8bit),字符流(16bit)
(1) 对于文本文件(.txt, .java, .c , .c++)使用字符流。
(2)对于非文本文件(.jpg ,.mp3, .mp4 , .avi ,.doc, .ppt)使用字节流。- 按数据流的流向不同分为:输入流,输出流
- 按流的角色不同分为:节点流,处理流
(1)程序用于直接操作目标设备所对应的类叫节点流。
(2)程序通过一个间接流类去调用节点流类,以达到更加灵活方便地读写各种类型的数据,这个间接流类就是处理流。
抽象基类 | 字节流 | 字符流 |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
java的IO流共涉及40多个类,实际上都是从这4个抽象基类派生的
由这四个类派生出来的子类名称都是以其父类名作为子类名后缀
IO流体系
示例
节点流
- FileInputStream
- FileOutputStream
- FileReader
- FileWriter
将一个txt文件的内容使用字符流复制到另一个txt文件中
import java.io.*;
public class Test {
public static void main(String[] args) {
FileReader fr = null;
FileWriter fw = null;
try {
File file = new File("hello.txt");//被赋值的源文件,该文件必须存在
fr = new FileReader(file);
//写入到此文件中,此文件可以不存在;该方法还有一个append参数传入false代表覆盖原文件,true代表在原文件后面追加
fw = new FileWriter("hello2.txt");
char[] cbuf = new char[5];//字符的一个缓冲数组
int len;
//一次最多可以读缓冲数组容量的字符,返回值len代表这一次读入了几个字符,如果什么也没有读到,返回-1
while ((len = fr.read(cbuf)) != -1) {
fw.write(cbuf, 0, len);// 将缓冲数组的内容通过FileWriter写入到新文件中
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//相应的流必须手动关闭,因为不在垃圾回收的范围之内。
if (fr != null) {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fw != null) {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
}
将一个jpeg文件的使用字节流复制到另一个jpeg文件中
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test2 {
public static void main(String[] args){
FileInputStream in = null;
FileOutputStream out = null;
try {
File file = new File("1.jpeg");
in = new FileInputStream(file);
out = new FileOutputStream("2.jpeg");
byte[] bytes = new byte[1024];
int<