1.字符流
1.1 Reader
读取流,或者输入流,用于读取文本数据,常用FileReader对象读取文本数据
- FileReader常用方法
- read(),读取单个字符,读完指针后移,返回值是字符对应ascii码值,读不到数据返回-1
- read(buf,start,len)读若干字符到缓冲区buf,长度为len,开始位置为start,返回的是读到的字符个数
FileReader fr = new FileReader("xxx.txt",[true]);//true可选,表示追加
//单个读取
int ch = fr.read();
//读完
char[] buf = new char[1024];
int len = 0;
while((len = fr.read(buf))!=-1){
sout(new String(buf,0,len));
}
1.2 Writer
输出流,输出字符的流对象,常用FileWriter对象将字符数据写入文件,也可以将数据流向指向控制台,变成打印效果
- FileWriter常用方法:
- writer(“xxx”),写指定的字符串
FileWriter fw = new FileWriter("xxx.txt");
fw.write("hello,world");
FileWriter fw = new FileWriter("a.txt");
char[] buf = {'整','个','数','组','写','入'};
fw.write(buf);
fw.write(buf,0,len);
2.字节流
2.1 InputStream
字节输入流,按字节长度读取数据,常用对象FileInputStream读取二进制文件如视频,音乐,图片
- FileInputStream基本方法:
- read(),读取单个字节的数据,返回ASCII码,读到结束返回-1
- read(buf,start,len),读取若干字节,存到字节数组缓冲区,从start位置开始存,长度为len,返回读取的字节个数,结束返回-1
FileInputStream fis = new FileInputStream("xxx.txt");
//dange
int ch = fis.read();
//lianxu
byte[] buf = new byte[1024];
int len = 0;
while((len=fis.read(buf))!=-1){
sout(new String(buf,0,len));
}
2.2 OutputStream
字节输出流,按字节长度输出数据到指定流向的设备中,可以是控制台,文件等。常用FileOutputStream写数据到文件
- FileOutputStream基本操作
- write(byte[] data),写指定字节数组的内容
FileOutputStream fos = new FileOutputStream("xxx.txt");
fos.write("xxx".getBytes());
3.Buffered流
加缓冲区的流对象,对上面的流对象进行了封装和功能增强,其背后是装饰设计模式的思想,可以封转字符流,字节流。
- BufferedInputStream
- BufferedOutputStream
- BufferedReader
- BufferedWriter
需要注意的是,用输出流对象写数据时,首先写入到的是缓冲区,所以需要刷新(flush)操作。 - 字符
//读---------------------------------------------------------------
BufferedReader bufr =
new BufferedReader(new FileReader("a.txt"));
String line = null;
while((line=bufr.readLine())!=null){
sout(line);
}
//写---------------------------------------------------------------
BufferedWriter bufw =
new BufferedWriter(new FileWriter("b.txt"));
bufw.write("xxx");
bufw.flush();
//文本拷贝-------------------------------------------------
BufferedReader bufr =
new BufferedReader(new FileReader("a.txt"));
BufferedWriter bufw =
new BufferedWriter(new FileWriter("b.txt"));
String line = null;
while((line=bufr.readLine())!=null){
bufw.write(line);
bufw.newLine();
bufw.flush();
}
4.转换流
字符流和字节流的相互转换
- InputStreamReader
字节流到字符流的转化,如键盘输入时,输入的是字节流,可以通过他转换成字符流 - OutputSteamWriter
字符流到字节流的转换,如写入文件数据,源数据是字符,通过他转成字节
//字节--->字符
InputStreamReader isr = new InputStreamReader(System.in);
//字符--->字节
OutputStreamWriter osw =
new OutputStreamWriter(new FileWriter("xxx.txt"));
5.打印流
PrintStream&PrintWriter,PrintWriter更好用,只能用于输出数据,和Buffered类同为包装类,对输出流对象进行了封装和功能增强,可以接收Writer,OutputStream,File文件对象,文件路径
- println(),打印一行数据,还可以指定是否自动刷新
//接受文件对象
File file = new File("xxx.txt");
PrintWriter pw = new PrintWriter(file);
//接受字符流
PrintWriter pw = new PrintWriter(new FileWriter("xxx.txt"));
pw.println("xxx",true);//自动刷新
//接受字节流
PrintWriter pw =
new PrintWriter(new FileOutputStream("xxx.txt"));
6.合并流
将几个流对象合并成一个流对象,搭配Vector容器使用
Vector<FileInputStream> vec = new Vector<FileInputStream>();
vec.add(new FileInputStream("1.txt"));
vec.add(new FileInputStream("2.txt"));
vec.add(new FileInputStream("3.txt"));
Enumeration<FileInputStream> enu = vec.elements();
//字节输入流,合并流
SequenceInputStream sis = new SequenceInputStream(enu);
//包装一下
BufferedInputStream bufis = new BufferedInputStream(sis);
//包装的字节输出流
BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("1_2_3.txt"));
int by = 0;
while((by=bufis.read())!=-1) {
bufos.write(by);
}
bufis.close();
bufos.close();
/*自定义缓冲区
int len = 0;
byte[] buf = new byte[1024];
FileOutputStream fis = new FileOutputStream("1_2_3.txt");
while((len=sis.read(buf))!=-1) {
fis.write(buf, 0, len);
}
fis.close();
sis.close();
*/