Java IO流
一、流介绍
IO流简单来说就是Input和Output流,IO流主要是用来处理设备之间的数据传输,Java对于数据的操作都是通过流实现,而java用于操作流的对象都在IO包中。
IO流的分类:
1.根据处理数据类型的不同分为:字符流和字节流;
2.根据数据流向不同分为:输入流和输出流 ;(程序读取文件内容叫输入,程序把内容写入文件叫输出)
字符流和字节流的区别:
1.读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位;
2.处理对象不同:字节流可以处理全部类型数据,字符流只能处理字符型的数据;
3.读写位数不同:字节流一次读入或读出8位二进制, 字符流一次读入或读出16位二进制;
注:处理纯文本文件首先考虑字符流
关系类图:
二、字符流
字符流的基本简介:
1.字符流中的对象融合了编码表,是系统默认的编码表(GBK)
2.字符流只处理文本数据
3.数据最常见的表现方式是文件,字符流用于操作文件的之类一般是FileReader和FileWriter
字符流读写注意事项:
1.写入文件后必须flush(),然后关闭流;
2.使用流要捕获异常;
3.定义文件路劲时用“/”或“\\”或者File.separator;
4.创建文件时,有相同名字文件将会被覆盖;读取文件时,文件不存在会抛出异常;
字符输出流实例:
class FireWriterDemo {
public static void main(String[] args) throws IOException { //需要对IO异常进行处理
//创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件。
//而且该文件会被创建到指定目录下。如果该目录有同名文件,那么该文件将被覆盖。
FileWriter fw = new FileWriter("F:\\1.txt");//目的是明确数据要存放的目的地。
//调用write的方法将字符串写到流中
fw.write("hello world!");
//刷新流对象缓冲中的数据,将数据刷到目的地中
fw.flush();
//关闭流资源,但是关闭之前会刷新一次内部缓冲中的数据。当我们结束输入时候,必须close();
fw.write("first_test");
fw.close();
//flush和close的区别:flush刷新后可以继续输入,close刷新后不能继续输入。
}
}
二、字节流
字节流概述:2.字节流操作不用flush
注:可以利用此方法来制定读取方式中传入数组的长度,而省去循环判断。单文件较大时此数组长度所占内存空间就会溢出 (虚拟机启动分配的默认内存一般为64M)。
字节流实例:
import java.io.*;
class CopyPic {
public static void copyBmp() {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("F:\\java_Demo\\day9_28\\1.bmp");
fos = new FileOutputStream("F:\\java_Demo\\day9_28\\2.bmp");
byte[] copy = new byte[1024];
int len = 0;
while((len=fis.read(copy))!=-1) {
fos.write(copy,0,len);
}
}
catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("复制文件异常");
}
finally {
try {
if(fis!=null) fis.close();
}
catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("读取流异常");
}
}
}
}
三、转换流
InputStreamReader:字节到字符的桥梁 ;OutputStreamWriter:字符到字节的桥梁
转换流的特点:是字符流和字节流之间的转换桥梁。
转换流使用场景:
1.源或目标对应的设备是字节流,但操作的是文本数据,可以使用。
2.一单操作文本涉及具体的知道编码表是,必须使用转换流
代码实例:
(1)、读取键盘输入的每一行内容,并希尔到文本中,知道遇到over行结束
public static void main(String[] args) throws IOException {
//字节流-->字符流
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new FileWriter("is2.txt"));
String line = null;
while((line = br.readLine())!=null){
if("over".equals(line)){
break;
}
bw.write(line);
bw.newLine();
bw.flush();
}
bw.close();
br.close(); }
(2)、字符流bufferedReader转为字节流System.out
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("is2.txt"));
//字符流-->字节流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String line = null;
while ((line = br.readLine())!=null) {
bw.write(line);
bw.newLine();
bw.flush();
}
bw.close();
br.close();
}
(3)、指定编码输入出去文件
//1.采用指定的编码读取文本文件
public static void main(String[] args) throws IOException {
//在IO流中,如果想指定编码读写数据,只能使用转换流。
//采用指定编码从文本文件中读取内容
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("C:\\a.txt"), "UTF-8"));
String line = null;
while ((line=br.readLine())!=null) {
System.out.println(line);
}
br.close();
}
// 2.采用指定的编码输出文本文件
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:\\a.txt"), "UTF-8"));
bw.write("I am 君山");
bw.close();
}
三、缓冲流
缓冲流是一个包装流,目的是缓存作用,加快读取和写入数据的速度。
字节缓冲流:BufferedInputStream、BufferedOutputStream
字符缓冲流:BufferedReader、BufferedWriter
注:我们在将字符输入输出流、字节输入输出流的时候,读取操作,通常都会定义一个字节或字符数组,将读取/写入的数据先存放到这个数组里面,然后在取数组里面的数据。这比我们一个一个的读取/写入数据要快很多,而这也就是缓冲流的由来。只不过缓冲流里面定义了一个 数组用来存储我们读取/写入的数据,当内部定义的数组满了(注意:我们操作的时候外部还是会定义一个小的数组,小数组放入到内部数组中),就会进行下一步操作。
//字节缓冲输入流
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream("io"+File.separator+"a.txt"));
//定义一个字节数组,用来存储数据
byte[] buffer = new byte[1024];
int len = -1;//定义一个整数,表示读取的字节数
while((len=bis.read(buffer))!=-1){
System.out.println(new String(buffer,0,len));
}
//关闭流资源
bis.close();//当定义缓存数组满的时候自动flush()
//字节缓冲输出流
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream("io"+File.separator+"a.txt"));
bos.write("ABCD".getBytes());
bos.close();
//字符缓冲输入流
BufferedReader br = new BufferedReader(
new FileReader("io"+File.separator+"a.txt"));
char[] buffer = new char[10];
int len = -1;
while((len=br.read(buffer))!=-1){
System.out.println(new String(buffer,0,len));
}
br.close();
//字符缓冲输出流
BufferedWriter bw = new BufferedWriter(
new FileWriter("io"+File.separator+"a.txt"));
bw.write("ABCD");
bw.close();
其他详细资料:点击打开链接