在java中字节流主要是对一些视频,音频,图片进行操作,而字符流则是对一些字符操作。
和字节流一样,字符流也有两个基类:
字符输出流:“Writer”
字符输入流:“Reader”
通过一个实现类FielWriter和FielReader可以实现字符流的输入输出操作。
先介绍一下Writer的相关方法:
·public void write(int c) throws IOException
【将内容写入指定的文件,每次写入一个字符,该数据类型就是一个ASC码,根据该ASC码就可以找到对应的字符】
·public void write(char[] cbuf) throws IOException:
【每次写入一个字符数组的内容】
·public void write(String str) throws IOException:
【每次直接写入一个字符串】
示例:
package com.zhaoqiang.writer;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Iterator;
public class Demo1 {
public static void main(String[] args) throws IOException {
File f = new File("D:"+File.separator+"Demo"+File.separator+"test.txt");
if (!f.getParentFile().exists()) {
f.getParentFile().mkdirs();
f.createNewFile();
}
// 创建字符流输出对象
Writer out = new FileWriter(f);
String str ="测试数据";
// 获取字符数组
char[] ch = str.toCharArray();
// 第一种方法
for (char c : ch) {
out.write(c);
}
// 第二种方法
// out.write(ch);
// 第三种方法
// out.write(str);
out.flush();
out.close();
}
}
flush()是刷新缓存里面的数据.
下面介绍Reader里面的相关方法:
·public int read() throws IOException:
【每次读取一个字符,将字符的ASC返回,如果读取到最后返回-1】
·public int read(char[] cbuf) throws IOException
【每次读取一个字符数组的内容,返回的吗每次读取的数据的长度,
如果读取到最后返回-1】
·public abstract int read(char[] cbuf, int off, int len)
【每次读取指定的字符数组的指定的内容,
off表示要保存的数组的起始下标
len表示要保存的数据长度】
示例:
package com.zhaoqiang.Reader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class Demo1 {
public static void main(String[] args) throws IOException {
File f = new File("D:"+File.separator+"Demo"+File.separator+"test.txt");
if (!f.getParentFile().exists()) {
f.getParentFile().mkdirs();
f.createNewFile();
}
// 创建一个输入流对象
Reader re = new FileReader(f);
int len = 0 ;
// 第一种:输入一个字符
// while ((len = re.read()) != -1) {
// System.out.println((char)len); // 一个一个字符输出
// }
//
// 第二种
char[] ch = new char[1024];
while((len = re.read(ch)) != -1){
System.out.println(new String(ch,0,len));
}
// 输入指定长度的字符
re.read(ch, 0, 10);
re.close();
}
}
缓冲区:BufferedOutputStream,BufferedInputStream;
示例:
package com.zhaoqiang.buffer;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo1 {
public static void main(String[] args) throws IOException {
File f = new File("F:"+File.separator+"Demo"+File.separator+"12.jpg");
File of = new File("D:"+File.separator+"Demo"+File.separator+"2.jpg");
// 创建字节输入流缓冲区
BufferedInputStream bi = new BufferedInputStream(new FileInputStream(f));
// 创建字节输出流缓冲区
BufferedOutputStream bs = new BufferedOutputStream(new FileOutputStream(of));
byte[] by = new byte[1024];
int len = 0;
while((len = bi.read(by)) != -1){
bs.write(by, 0, len);
bs.flush();
}
bs.close();
bi.close();
}
}
字符流缓冲区:BufferedReader,BufferedWriter;
示例:
package com.zhaoqiang.buffer;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Demo2 {
public static void main(String[] args) throws IOException {
// 目的文件
File f = new File("F:"+File.separator+"Demo"+File.separator+"test.txt");
// 源文件
File of = new File("D:"+File.separator+"Demo"+File.separator+"test.txt");
// 字符输入流缓冲区
BufferedReader br = new BufferedReader(new FileReader(of));
// 字符输出流缓冲区
BufferedWriter bw = new BufferedWriter(new FileWriter(f));
String str = "";
// 第二种方法,一行读取
while((str = br.readLine()) != null){
bw.write(str);
bw.newLine();
bw.flush();
}
// 第一种方法,单个字符读取
// int len = 0;
// while((len = br.read())!=-1){
// bw.write(len);
// bw.flush();
// }
bw.close();
br.close();
}
}
对于字符流缓冲区,和字节流缓冲区他们的底层实现还是使用的是java提供的输入输出流方法。只是添加一个缓冲区可以提高输入输出之间的传输效率。