字符流FileReader和FileWriter

来源:互联网 发布:狼蛛斩月灯光编程 编辑:程序博客网 时间:2024/05/24 02:24

前面介绍过了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 blocke.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 blocke.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 blocke.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 blocke.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();}}
以上就是字符流的简单介绍

0 0
原创粉丝点击