java - I/O - FileReader, FileWriter

字节流:

FileInputStream

FileOutputStream

字节流每次读取一个字节,好处是什么类型文件都可以读取,坏处是处理纯文本时可能出现问题(中文每个字占2个字节,可能导致读取错误出现乱码)。

 

字符流:

FileReader, FileWriter

只能操作纯文本文件(右键记事本可以打开而且不影响内容),txt,html等。

 

字节流用byte接收数据,byte是8位

字符流用char接受数据,char是16位

汉字占用两个字节,也就是16位

所以字节流有可能乱码,而字符流不会。

两者用房上基本相同,只是参数一个是byte一个是char

 

FileReader:

package io;

import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;

public class FileReaderTest {
    public static void main(String[] args){

        FileReader fr = null;
        FileInputStream fis = null;

        try {
            fr = new FileReader("C:\\Users\\Administrator\\Desktop\\test\\filereadertest.txt");
            fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\test\\filereadertest.txt");
            char[] c = new char[5];
            int count = fr.read(c);
            while(count != -1){
                System.out.println("---|" + new String(c) + "|---");
                count = fr.read(c);
            }
            //---|你好世界,|---
            //---|
            //你好I|---
            //---|/O。好I|---

            byte[] b = new byte[5];
            count = fis.read(b);
            while(count != -1){
                System.out.println("---|" + new String(b) + "|---");
                count = fis.read(b);
            }
            //---|你好?|---
            //---|澜纾?|---
            //---|
            //你?|---
            //---|肐/O?|---
            //---|/O?|---

            //字节型出现了乱码,字符型没有
            //因为字符型每次读取了一个char是16位的,而字节型只能使用byte读取,每次是8位,每个汉字是16位,所以字节型会出现乱码




        }catch(Exception e){
            e.printStackTrace();
        }finally {  //使用fianlly保证流能关闭
            if (fr != null) {
                try {
                    fr.close(); //关闭流
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fis != null) {
                try {
                    fis.close(); //关闭流
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }


    }
}

 

 

FileWriter

package io;

import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;

public class FileWriterTest {

    public static void main(String[] args){

            FileWriter fw = null;
            FileOutputStream fos = null;

            try {
                fw = new FileWriter("C:\\Users\\Administrator\\Desktop\\test\\fileWriterTest.txt"); //没有这个文件的话会新建一个
                fos = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\test\\fileWriterTest.txt", true);//第二个参数是是否在原有的后面添加,默认是false也就是覆盖,FileWriter同理

                fw.write("你好啊世界,\r\n你好难啊I/O。\r\n");  //windows中txt的换行是\r\n\,如果想在文本中添加字符串“\r\n”,要用“\\r\\n”则会输出“\r\n”。
                fw.flush();//以前必须写,现在新版本会自动推送- -不过为了适应各种版本最好都写上
                //你好啊世界,
                //你好难啊I/O。

                fos.write("你好啊世界,\r\n你好难啊I/O。\r\n".getBytes());  //把String转化为byte[]数组,然后可以用字节流存取。
                fos.flush();//以前必须写,现在新版本会自动推送- -不过为了适应各种版本最好都写上
                //你好啊世界,
                //你好难啊I/O。
                //因为是一次性全部存入不用分割所以貌似问题不大- -,可能更复杂的情况下需要分批输入的时候才有效果

            }catch(Exception e){
                e.printStackTrace();
            }finally {  //使用fianlly保证流能关闭
                if (fw != null) {
                    try {
                        fw.close(); //关闭流
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (fos != null) {
                    try {
                        fos.close(); //关闭流
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

    }
}

 

posted @ 2019-10-09 11:30  不咬人的兔子  阅读(353)  评论(0编辑  收藏  举报