前面介绍过了FileOutputStream和FileInputStream,但是他们是属于字节流的,字节流,顾名思义,就是一个字节一个字节读取,这样,有时会出错或者出现乱码的情况,因为在“UTF-8”里一个中文是两个字节,而如果我们用字节形式读取,读取的时候刚好只读取一个字节,那么就会出现乱码
那么怎么区分字节流和字符流呢,其实很简单,只要后面跟着的是Reader或writer的就是字符流,后面跟着Stream的就是字节流
我们先来查看一下FileReader的api,
我们看到它是继承InputStreamReader,所以我们直接使用InputStreamReader:先创建一个文件zzq.txt 然后我们使用InputStreamReader读取里面的内容,它会提示()里面可以放一个InputStream类,然后InputStream可以制定编码格式,所以我们在()里new一个FileInputStream,再在后面加上“UTF-8”编码格式
/**
* 演示InputStreamReader的用法
*/
public static void test1() {
try {
InputStreamReader is = new InputStreamReader(new FileInputStream("zzq.txt"), "UTF-8");
int a = 0;
while ((a = is.read()) != -1) {
System.out.println(a);
System.out.println((char) a);
}
} catch (UnsupportedEncodingException | FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
接下来演示用数组FileInpurStream读取内容,我们先用File指定文件,然后用
InpurStreamReader读取
public static void test2() {
try {
File file = new File("a.txt");
InputStreamReader is = new InputStreamReader(new FileInputStream(file), "UTF-8");
char[] b = new char[(int) file.length()];
while (is.read(b) != -1) {
System.out.println(new String(b));
}
is.close();
} catch (UnsupportedEncodingException | FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
上面的方法,还要定义一个数组,可以使用IO流的包装类Buffered,这样,就可以直接读取一行
/**
* 演示BufferedReader的用法,整行读取文本
*/
public static void test3() {
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream("zzq.txt"), "UTF-8"));
while (br.ready()) {
String str = br.readLine();
System.out.println(str);
}
} catch (UnsupportedEncodingException | FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
下面介绍FileWrite的用法,查看api可以知道它也是继承OutputStreamWrite
/**
* 演示OutputStreamWriter的用法
*/
public static void test4() {
try {
OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream("zzq1.txt"));
os.write(97);
os.flush();
os.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
上面输出的97因为不是String类型,所以会被电脑内部装换成ascii码,然后在zzq1.txt文件中输入小写字母a
下面我们输入中文试试,在FileOutputStream()里面可以加一个参数true,这样我们之后写入的内容就不会覆盖之前写的了
/**
* 演示OutputStreamWriter的用法
*/
public static void test5() {
try {
OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream("b.txt", true));
os.write("\r\n");
os.write("我是zzq");
os.flush();
os.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
然后介绍一个我认为的大王PrintWrite,怎么说呢,总之如果需要使用输出流就可以想到直接使用PrintWrite,下面看下api,可以看到PrintWrite()里面可以直接放一个文件或者放一个OutputStream,这样就可以使用输出流的方法了
下面进行简单的演示
/**
* 演示PrintWriter类的用法
*/
public static void test6() {
try {
PrintWriter pw = new PrintWriter("zzq.txt");
pw.println("哈喽,我是zzq");
pw.println("你好吗");
pw.flush();
pw.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
以上就是字符流的简单介绍