一、什么是IO
I : Input;
O:Output;
通过IO可以完成硬盘文件的读和写。
二、IO流的分类
(1):按照流的方向进行分类(以内存作为参照物):
往内存中去,叫做输入(Input),或者叫做读(Read)。
从内存中出来,叫做输出(Output),或者叫做写(write)。
(2):按照读取数据方式不同进行分类:
-
有的流是按照字节的方式读取数据,一次读取1个字节byte,等同于一次读取8个二进制。这种流是万能的,什么类型的文件都可以读取。包括文本文件,图片,声音文件,视频等;
例如文件file1.txt(a中国bc张三fe),采用字节流的话是这样读的:
第一次读:一个字节,正好读到’a’,
第二次读:一个字节,正好读到’中’字符的一半,
第三次读:一个字节,正好读到’中’字符的另外一半。 -
有的流是按照字符的方式读取数据的,一次读取一个字符,这种流是为了方便读取普通文本文件而存在的,这种流不能读取图片、声音、视频等文件。只能读取纯文本文件,连word文件都无法读取。
三、文件流
- 文件流包括
FilelnputStream FileOutputStream — 字节流
FileReader FileWriter — 字符流 - FilelnputStream的使用
- lnputStream 是用来读取字节的,是个抽象类,我们通常使用的是该类的子类
- FilelnputStream 是InputStream的子类,利用FilelnputStream 可以将一个文件的内容按字节为单位读取出来
- FilelnputStream有一个很常用的构造函数:
public FilelnputStream(String fileName) throws FileNotFoundException
(1)利用该构造函数可以实现将输入流连接到某个文件的功能;
(2)必须对本构造函数抛出的异常进行捕捉;
(3)如果用字符串来表示操作系统的文件路径时,我们可以使用 \ \ (两个反斜杠)和 /(一个正斜杠)两种方式来作为文件夹的路径分隔符;
(4)FileOutputStream 同理。
- FileReader的使用
- Reader 是用来读取字符的,是个抽象类,我们通常使用的是该类的子类
- FileReader是Reader的子类,利用FileReader可以将一个文件的内容以字符为单位读取出来
- FileReader有一个很常用的构造函数:
public FileReader(String fileName) throws FileNotFoundException
(1) 利用该构造函数可以实现将输入流连接到某个文件的功能
(2)必须对本构造函数抛出的异常进行捕捉
(3)如果用字符串来表示操作系统的文件路径时,我们可以使用 \ \ (两个反斜杠)和 /(一个正斜杠)两种方式来作为文件夹的路径分隔符;
(4)FileWriter 同理。
四、字节流、字符流的区别
- FilelnputStream 和 FileOutputStream 可以完成所有格式文件的赋值;
- FileReader 和 FileWriter 只可以完成文本文件的复制,却无法完成视频等格式文件的复制;
- 因为字节是不需要解码和编码的,将字节转化为字符才存在解码和解码的问题,所以字节流可以从所有格式的设备中读写数据,但字符流只能从文本格式的设备中读写数据。
五、字节流和字符流的使用
- 字符流实现文本文件的复制(读取)
字符流一次读取两个字节(字符流不能处理非文本文件,或者说,字符流是专门处理文本文件的)
package com.ittanya.demo1;
import java.io.FileReader;
import java.io.FileWriter;
public class FileReadWriterCopy {
public static void main(String[] args) throws Exception{
//绝对路径
FileReader fr=new FileReader("D:\\ideaProjects\\basic code\\javaday\\src\\com\\ittanya\\demo1\\FileReadWriterCopy.java");
//写入,随便写到D盘下的一个根目录里
FileWriter fw=new FileWriter("D:\\Tanya.haha");
int ch;
ch=fr.read();
while(-1!=ch){
fw.write(ch);
ch=fr.read();
}
fw.flush();//刷新
fr.close();
fw.close();
}
}
得到如下文件:
- 用字节流拷贝文本文件
(一次读取一个字节)
package com.ittanya.demo1;
import java.io.*;
//用字节流拷贝文本文件
public class InputStreamOutPutStream {
public static void main(String[] args) throws Exception{
FileInputStream fi=new FileInputStream("D:\\ideaProjects\\basic code\\javaday\\src\\com\\ittanya\\demo1\\FileReadWriterCopy.java");
//写入,随便写到D盘下的一个根目录里
FileOutputStream fo=new FileOutputStream("D:\\Tanya.haha1");
int ch;
ch=fi.read();
while(-1!=ch){
fo.write(ch);
ch=fi.read();
}
fo.flush();//刷新
fi.close();
fo.close();
}
}
得到以下文件:
- 用字节流读取非文本文件(以图片文件为例):
package com.ittanya.demo1;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class InputStreamOutPutStream2 {
public static void main(String[] args) throws Exception{
FileInputStream fi=new FileInputStream("D:\\壁纸\\镜玄.png");
//写入,随便写到D盘下的一个根目录里
FileOutputStream fo=new FileOutputStream("D:\\镜玄大帅哥.jpg");
int ch;
ch=fi.read();
while(-1!=ch){
fo.write(ch);
ch=fi.read();
}
fo.flush();//刷新
fi.close();
fo.close();
}
}
读取结果: