流的分类:都是站在程序代码的角度来辨别方向。
(1)按方向: 输入流/输出流,也称读流/写流,
(2)按处理数据方式:字节流/字符流,字节流以二进制方式进行数据传输,速度快(图片,英文),字符流是以字符为单位进行数据传输(中文)。
(3)按功能:节点流/处理流,节点流是对数据直传输,处理流会在数据传输过程中对数据进行二次处理后再传输。
IO所谓的四大抽象类就是:
InputStream、OutputStream、Reader、Writer
InputStream:
字节输入流的父类,数据单位为字节。
常用方法:
int read(); 从输入流中读取下一个字
void close(); 关闭流
OutputStream:
字节输出流的父类,数据单位为字节。
常用方法:
void write(int b); 将一个integer数组长度写入此流
void flush(); 刷新此流
void close(); 关闭该流并释放与之相关的所有资源
Reader:
字符输入流的父类,数据单位为字符。
常用方法:
int read(); 读取单个字符。
int read(char[] cbuf, int off , int len ); 将字符读入数组的某一部分。
void close(); 关闭该流并释放与之相关的所有资源
Writer: 字符输出流的父类,数据单位为字符。
常用方法:
void writer(); 创建一个字符流
void flush(); 清空缓冲区的数据流
void close(); 关闭字符流
注意:一般来说文本中含有中文用字符,流入与流出是一个相对概念。stream:字节
FileInputStream是InputStream的一个子类,以字节来读取文件。
FileInputStream的方法用代码表现
@Test
ublic void fileInputStream() throws IOException {
//File.separator:与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。此字符串只包含一个字符,即 separatorChar。
String filePast = "D:" + File.separator + "javaTest" + File.separator + "newBuild";
//插管,new FileInputStream这是一个是虚拟的,并没有已经创建了一个文件
FileInputStream fis = new FileInputStream(filePast);
//查看剩余总字节数
System.out.println("总字节数"+fis.available());
//用int b转成char b来接
int b;
//文件读完还回-1,这是源代码规定
while ((b= fis.read())!=-1){
System.out.print((char)b);
}
fis.close();
}
注意:FileInputStream如果文件不存在,会还回异常,并不会重新创建一个文件
FileOutputStream是OutputStream的一个子类,以字节来读取文件
@Test
public void fileOutputStream() throws IOException{
//插管2根,一个指向原文件,一个要直线复制的新文件
String filePast1 = "D:" + File.separator + "javaTest" + File.separator + "newBuild";
String filePast2="D:" + File.separator + "javaTest" + File.separator + "build.text";
FileInputStream fis = new FileInputStream(filePast1);
//如果没有文件 FileInputStream会创建一个来
FileOutputStream fio=new FileOutputStream(filePast2);
int b;
while ((b=fis.read())!=-1){
fio.write(b);
}
//处除残留
fio.flush();
//关闭各种fio与fis流
fio.close();
fis.close();
}
注意:FileOutStream如果文件不存在,不会还回异常,会重新创建一个文件
FileReader:
FileReader是Reader的一个子类,可以以字符形式读出指定文件夹。
public void fileRead()throws IOException{
//注意文件后缀
//如果文件不存在FileReader建立一个新文件
String filePath="D:" + File.separator + "javaTest" + File.separator + "build.text";
FileReader file=new FileReader(filePath);
//获取编码方式
System.out.println(file.getEncoding());
//注意文件编码
int b;
while ((b=file.read())!=-1){
//还回值是-1
System.out.print((char)b);
}
}
FileWriter:
FileWriter是Writer的一个子类,可以以字符形式给指定文件写入
public void fileWriter() throws IOException {
//没有文件会创建一个
String filePath="D:"+ File.separator+"javaTest"+File.separator+"Unicode.dat";
String myFilePath="D:"+ File.separator+"javaTest"+File.separator+"UnicodeTest.dat";
FileWriter fileWriter=new FileWriter(filePath);
FileWriter myFileWriter=new FileWriter(myFilePath);
//在一个文件写入10个A
for (int i=0;i<10;i++){
myFileWriter.write("A");
}
int unicodeMaxLength=65525;
for (int i=0;i<unicodeMaxLength;i++){
fileWriter.write(i);
}
fileWriter.flush();
myFileWriter.flush();
}
注意:打印流是输出语句的底层结构,无需抛出异常且自带flush效果
BufferedReade:
缓冲字符输入流BufferedReade是Read的一个子类
public void bufferedReader()throws IOException{
String filePath="D:" + File.separator + "javaTest" + File.separator + "build.text";
BufferedReader br=new BufferedReader(new FileReader(filePath));
String rs=null;
while ((rs= br.readLine())!=null){
System.out.println(rs);
}
}
注意:int read():从此输入流读取一个字节,如果读完还回-1;
String readLine():从此输入流读取一行数据,如果读完还回null;
public static void main(String[] args) {
//模拟控制台输出
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String rs = "";
while (true) {
try {
if (!((rs = br.readLine()) != null)) {
System.out.println(">>" + rs);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
BufferedWriter
缓冲字符输出流BufferedWriter是Writer的一个子类
public void bufferWrite() throws IOException {
//没有文件会创建一个
String filePast = "D:" + File.separator + "javaTest" + File.separator + "newBuild1";
BufferedWriter bw = new BufferedWriter(new FileWriter(filePast));
Random random = new Random();
for (int i = 0; i < 100; i++) {
bw.write("随机数:"+random.nextInt(100));
bw.newLine();
}
bw.flush();
bw.close();
}