一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写入数据。
字节流:数据流最小的数据单元是字节
字符流:数据流最小的单元数字符。Java中的字符是Unicode编码,一个字符占两个字节
1.输入字节流InputStream
1)InputStream是所有输入字节流的父类,是一个抽象类
2)InputStream中的三个基本的读方法:
public abstract int read():读取一个字节数据,并返回读到的数据,如果返回-1表示读到了输入流的末尾
public int read(byte[] b):将数据读入一个字节数组,同时返回实际读取的字节数,如果返回-1表示读到了输入流的末尾
public int read(byte[] b,int off,int len):将数据读入一个字节数组,同时返回时间读取的字节数,如果返回-1表示读到了输入流的末尾
off:指定在数组b中存放的数据的起始偏移位置;
len:指定读取的最大字节数。
流结束的判断:方法read()的返回值为-1时;readLine()返回值为null时
3)public void close():关闭输入流,释放和这个流相关的系统资源
2.输出字节流OutputStream
1)OutputStream是所有的输出字节流的父类,它是一个抽象类
2)OutputStream中的三个基本的写方法:
public abstract void write(int b):往输出流中写入一个字节
public void write(byte[] b):往输出流中写入数组b中的所有字节
public void write(byte[] b,int off,int len):往输出流中写入数组b中从偏移量off开始的len个字节的数据
3)public void close():关闭输出流,释放和这个流相关的系统资源
3.字符输入流Reader
1)Reader是所有的输入字符流的父类,它是一个抽象类
2)InputStreamReader是一个连接字节流和字符流的桥梁,它将字节流转变为字符流
4.字符输出流Writer
1)Writer是所有的输出字符流的父类,他是一个抽象类
2)OutputStreamWriter是OutputStream到Writer转换的桥梁
5.字符流与字节流转换
虽然Java支持字节流和字符流,但有时需要在字节流和字符流两者之间转换。InputStreamReader和OutputStreamWriter,这两个为类是字节流和字符流之间相互转换的类。
1)InputSreamReader用于将一个字节流中的字节解码成字符:
有两个构造方法:
InputStreamReader(InputStream in);
功能:用默认字符集创建一个InputStreamReader对象
InputStreamReader(InputStream in,String CharsetName);
功能:接收已指定字符集名的字符串,并用该字符创建对象
2)OutputStream用于将写入的字符编码成字节后写入一个字节流。
同样有两个构造方法:
OutputStreamWriter(OutputStream out);
功能:用默认字符集创建一个OutputStreamWriter对象;
OutputStreamWriter(OutputStream out,String CharSetName);
功能:接收已指定字符集名的字符串,并用该字符集创建OutputStreamWrite对象
3)为了避免频繁的转换字节流和字符流,对以上两个类进行了封装。
BufferedWriter类封装了OutputStreamWriter类;
BufferedReader类封装了InputStreamReader类;
封装格式:
BufferedWriter out=new BufferedWriter(new OutputStreamWriter(System.out));
BufferedReader in= new BufferedReader(new InputStreamReader(System.in);
利用下面的语句,可以从控制台读取一行字符串:
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
String line=in.readLine();
6.字节流和字符流的区别
1)字节流没有缓存区,是直接输出的,而字符流是输出到缓冲区的,因此在输出时,字节流不调用close()方法时,信息已经输出了,而字符流只有在调用close()方法关闭缓冲区时信号才输出。要想字符流在未关闭时输出信息,则需要手动调用flush()方法
2)读写单位不同:字节流以字节(8 bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节
3)处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据
4)结论:只有处理纯文本数据就优先考虑使用字符流,除此之外都使用字节流
7.非流式文件类--File类
1)public static final String separator:表示路径分隔符"\"
2)public static final String pathSrparator:指的是分隔连续多个路径字符串的分隔符。
3)构造函数:
1.File(String pathName)
eg:File f1 = new File("FileTest.txt");//创建文件对象f1,f1所指的文件是在当前目录下创建的FileTest.txt
2.File(String parent,String child)
eg:File f2 = new File("D:\\dir1","FileTest2.txt");//注意:“D:\\dir1”目录事先必须存在,否则异常
3.File(File parent,String child)
eg:File f4 = new File("\\dir3");
File f5 = new File(f4,"FileText5.txt");//如果"\\dir3"不存在,使用f4.mkdir()创建