这篇博客主要是总结一下Java中的字符流

1.字符输出流

public abstract class Writer
extends Object
implements Appendable,Closable,Flushable

写入字符流的抽象类。子类必须实现的方法仅有write(char[],int,int)、flush()和close().但是,多数子类将重写此处定义的一些方法,以提供
更高的效率和其他功能

public void write(String str) throws IOException 
 直接将字符串写入输出、public void write(char[] cbuf) throws IOException 
 输出字符数组public abstract void close() throws IOException 
 关闭public abstract void flush() throws IOException()


刷新

与OutputStream一样,对文件的操作使用:FileWriter类完成,此类的操作方法如下

public FileWriter(File file) throws IOException
根据File类构造FileWriter实例

public FileWriter(File file,boolean append) throws IOException
根据File类构造FileWriter实例,可以追加内容

public class WriterDemo {
    public  static void write1()
    {
        try {
            //构造一个字符流对象,true表示追加
            Writer writer = new FileWriter(
                    new File("H:"+ File.separator+"第一种字符流.txt")
            ,true);
            String info="good good study,day day up";
            //以字符数组的形式输出
            writer.write(info.toCharArray());
            //以字符串的形式输出
            writer.write(info);
            writer.close();
        }
        catch (FileNotFoundException ex)
        {
            ex.printStackTrace();
        }catch (IOException ex)
        {
            ex.printStackTrace();
        }
    }
    public static void main(String args[])
    {
        write1();
    }
}

2.字符输入流

**public abstract class Reader
extends Object
implements Readable,Closeable**

用于读取字符流的抽象类。子类必须实现的方法只有read(char[],int,int)和close().但是,多数子类将重写此处定义的一些方法,以提供更高的效率和其他功能

public int read() throws IOException
读取一个内容

public int read(char[] cbuf) throws IOException
读取一组内容,返回读入的大小

public abstract void close() throws IOException
关闭

public class ReaderDemo {

    public static void reader1()
    {
       try {
           Reader reader =new FileReader(
                   new File("H:"+ File.separator+"Mytext.txt")
           );
           char [] cs = new char[5];
           int len=-1;
           StringBuilder stringBuilder= new StringBuilder();
           while ((len=reader.read(cs))!=-1)
           {
               stringBuilder.append(new String(cs,0,len));
           }
           System.out.println(stringBuilder);
           reader.close();
       }
       catch (FileNotFoundException ex)
       {
           ex.printStackTrace();
       }catch (IOException ex)
       {
           ex.printStackTrace();
       }
    }

    /**
     *使用字节流读取文本文件
     */
    public static void byteReader()
    {
       try {
           InputStream inputStream = new FileInputStream(
                   new File("H:"+ File.separator+"Mytext.txt")
           );
           byte []bytes = new byte[10];
           int len=-1;
           StringBuilder stringBuilder =new StringBuilder();
           //将文件的内容读到bytes数组当中去
           while ((len=inputStream.read(bytes))!=-1)
           {
               stringBuilder.append(new String(bytes,0,len));
           }
           System.out.println(stringBuilder);
           inputStream.close();
       }catch (FileNotFoundException ex)
       {
           ex.printStackTrace();
       }catch (IOException ex)
       {
           ex.printStackTrace();
       }
    }
    public static void main(String args[])
    {
        //使用字节流读取文本文件会造成乱码
        //因为读取的字节不一定正好是一个字符
        byteReader();
        reader1();
    }
}

3.字节流与字符流的区别

在所有的流操作里,字节永远是最基础的。任何基于字节的
操作都是正确的。无论你是文本文件还是二进制文件

如果确认流里面只有打印的字符,包括英文的和各种国家的文字,
也包括中文,那么可以考虑字符流

由于编码不同,多字节的字符可能占用多个字。比如GBK的汉字就占用2个字节而UTF-8的案子就占用3个字节。所以字符流是根据指定的编码,将1个或者多个字节转化为java里面的unicode的字符,然后进行操作字符操作一般使用Writer,Reader等,字节操作一般都是InputStream,OutputStream以及各种包装类。

总结:如果你确认你要处理的流是可打印的字符,那么使用字符流看上去简单一点。如果不确定,那么用字节流总是不会错的