1.JAVA中,对于数据的输入/输出操作以流(Stream)方式进行。流:数据在数据源(文件)和程序(内存)之间经历的路径。
字节流 字符流
输入流: InputStream Reader
输出流: OutStream Writer
字节流抽象基类:InputStream ,OutputStream
字符流抽象基类:Reader ,Writer
注:(1)这四个类派生出来的子类都是以其父类名作为子类名的后缀。InputStream的子类 FileInputStream,Reader的子类FileReader
(2)字节流:以字节(Byte)为单位去读取,可用于读写二进制以及任何类型文件
(3)字符流:可用于读写文本文件,不能操作二进制文件。
字符流的由来:早期I/O包中都是字节流,因为数据无论是硬盘还是内存中的都是字节,最终基于二进制。由于操作数据有很多种,文本文件处理是很常见,单独分出了字符流。
我们让计算机去识别我们生活中的文字,我们要进行二进制的变换形式来表示我们生活中的数据。老美生活中的都是一些字母比如a,b,c······,计算机只识别二进制1010······,于是就用二进制数字进行排列组合从小到大表示一个字母a,b,c····,形成了一张映射表(ASCII)。当你在键盘上输入一个字符就查找对应的映射表知道了二进制数字(显示十进制)。中国也要做这样的事,于是将汉字(几千文字和标点符号)同二进制进行映射表,形成了GB2312。中国的文字博大精深,于是进行了扩深形成了GBK(容纳了2W多)。国际化标准组织认识到很多国家都进行制作相应的文字和二进制的映射表,于是收录了世界上所有国家的文字,字符,标点等等从新编排,形成了Unicode编码。Unicode中每个字符都是用2Byte来表示,但是表示一个a只用8位就ok,这样很浪费空间,于是又进行了优化,形成了UTF—8,UTF-8中一个字节装不下就用两个,2个装不下就用3个······。于是问题出现了,我们写中文的时候,GBK识别,可是UTF-8也识别。但是同一个中文在这两张表中对应的二进制编码不一样,乱码就出现了。这样就出现了字符流,可以在内部融合编码表,就是由你来指定要查那个编码表。
/**
* 1.IO流是用来操作数据的,那么数据最常见的形式就是文件。
* 2.在硬盘上,创建一个文件并写入一些文字数据
* 3.专门用于操作文件的Writer子对象。FileWriter。后缀名是父类名,前缀名是该流对象的功能。
*
**/
package com.heima;
import java.io.*;
public class FileWriterDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建一个FileWriter对象。该对象一旦被初始化就必须要明确被操作的文件。
//而且该文件会被创建到指定目录下。如果该目录下已有同名文件,将被覆盖。
//概不就是明确数据要存放的目的地。
FileWriter fw=null;
try{
fw=new FileWriter("demo.txt");
//调用writer方法,将字符串写入到流中。
fw.write("wbcde");
}catch(IOException e){
System.out.println("catch"+e.toString());
}finally{
try{
//刷新流对象中的缓冲区中的数据。
//将数据流刷到目的地中。
//fw.flush();
//关闭流资源,但是关闭之前刷新一次内部的缓冲中的数据。
//将数据刷到目的地中。
//和flush区别:flush刷新后,六流可以继续使用,close刷新后,会将流关闭。
if(fw!=null)
fw.close();
}catch(IOException e){
System.out.println(e.toString());
}
}
}
}
/**
*
* 演示对已有文件的数据读写
*/
package com.heima;
import java.io.*;
public class FileReaderDemo1 {
FileReader fr=null;
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
//创建一个文件读取流对象和指定名称的文件相关联。
//要保证该文件是已经存在的,和如果不存在,会发生异常FileNotFoundException
fr=new FileReader("demo.txt");
//调用读取流对象的read方法。
//read():一次读一个字符。而且会自动往下读。
int ch=0;
while((ch=fr.read())!=-1)
{
System.out.println("ch="+(char)ch);
}
fr.close();
}
}