IO流(2)字符流

字符流

           介绍:字符流和字节流的区别就是,字符流是按字符为单位读取的,字节流是按字节为单位读取的,字符流只能读取文本,不能读取文件。字符流比较i聪明,当他读取文本的时候碰见英文就读取一个字节碰见汉字的时候就读取多个字节。

            编码表介绍

                     常用编码表

                               UTF-8       开发常用编码表,中文在这个码表里面占3个字节(中文在码表中表示的字节为负数)

                               GBK           window系统默认码表

                      什么是编码表,为什么会有编码表?

                                为什么会有码表呢?因为我们硬盘只能存储二进制介绍只能存储0和1,我们是不能看见中文,数组字母,符号,但是码表上面有中文,数字,字母,符号,我们硬盘保存的二进制就会取找他默认的码表,找到对应他的那个字符,然后显示在我们屏幕上面。

                    乱码造成原因

                                   我们有时会发现,我们利用字符流读取文件内容打印到控制台会乱码,这是因为我们的工具默认的码表为utf-8而我们的文件的编码为GBK,GBK码表中中文为两个字节,而utf-8码表中中文为3个字节,而我们读取是按字符为单位,因为文件是GBK编码的,在GBK码表中文为两个字节,所以我们利用字符流读取一个字符读取到的就是两个字节,而我们的工具默认utf-8编码表,中文是3个字节,可他只读取了两个字节过来,少了一个字节,所以就找不到对应的字符,从而造成乱码。


                     常用字符流

                                                  FileReader                        字符输入流

                                                  FileWriter                           字符输出流

                                                  BufferedReader                 字符缓冲输入流

                                                  BufferedWriter                   字符缓冲输出流

                                                 InputStreamReader            

                                                 OutputStreamWriter

                                                  PrintWriter                           打印流

                    注意:在字符流中,以Reader结尾的为输入流以Writer结尾的为输出流,字符流是以字符为单位读取的。

                    字符输入流的父类接口为  Reader

                    字符输出流的父类接口为   Writer


       FileWriter

                      构造方法

                                 FileWriter(File  file)                             如果file关联的文件不存在,则会创建该文件

                                 FileWriter(String  fileName,boolean   append)

                                 FileWriter(String  fileName)               使用一个文件路径作为参数,如果该文件不存在则会创建该文件

                                 FileWriter(String  fileName,boolean   append)         如果append为false就会默认清空文件内容,如果为true则不会清空文件内容,会直接在文件后面添加新的内容

                    常用方法介绍

                         void  writer(String  s)              写入一个字符串到字定文件(该方法有很多,重载方法功能都一样)

                         void   writer(char[]  arr)

                        void   writer(int  i)

 FileWriter writer = new FileWriter("Day10/b.txt");
      //把我爱java写入文件
      writer.write("我爱java");
      writer.close();

                        void    close()                            关闭流 ,如果流用完了流需要关闭流,释放资源


          FileReader

                       构造方法

                            FileReader(File  file)                   如果参数file指定的文件不存在或者为一个文件夹,就会抛出异常

                           FileReader(String  fileName)          如果参数给我定的路径不存在或者为一个文件夹,就会抛出异常

                    常用方法

                             int  reader(char[]  arr)                    读取参数指定文件,一次读取一个字符数组,返回读取的字符数组个数,如果文件读取完毕就返回-1

                          

     //创建字符输入流对象,关联一个文件
     FileReader reader = new FileReader("aaa.txt");
     char[] chars = new char[1024];
     //在文件里面读取一个1024个字符
     int len = reader.read(chars);
     reader.close();
     

                        int   reader()                                        一次读取一个字符,返回字符的int值(由于效率太低,不常用)

 //创建字符输入流对象,关联一个文件
     FileReader reader = new FileReader("aaa.txt");
    //一次读取一个字符
     int len = reader.read();
        System.out.println((char)len);
     reader.close();

        


        BufferedWriter   字符缓冲输出流

                      介绍:字符缓冲输出流比FileWriter的效率要高,输出速度要比FileWriter要快,因为BuuferedWriter底部默认有一个字符数组长度为8192,我们把这个数组叫为缓冲区,我们向文件写入void符不是直接向文件中写入,而是先写入这个缓冲区,等缓冲区存储满了,然后一次性写入文件,如果缓冲区true有满他就不会把内容写入到文件中,除非我们调用了flush和colse方法。

             构造方法

                         BufferedWriter(Writer  writer)                              参数为一个字符输出流的子类

             常用方法

                       void    writer(String  s)                                           这个方法和FileWriter的方法一样,也具有他的从载方法

                       void     newLing()                                                    在文件中间写入一个换行


          BufferedReader        字符缓冲输出流

                构造方法

                       BufferedReader(Reader  reader)                          参数为一个Reader的子类对象

                常用方法

                       String   readerLine()                                             一次读取文本中的一行   

 BufferedReader   bufferedReader = new BufferedReader(new FileReader("aaa.txt"));
   //一次读取文本中的一行内容   如果把文件内容读取完了就返回null
   String s = bufferedReader.readLine();
   bufferedReader.close();

   

    InputStreamReader  转换流

                         介绍:该流可以按照指定编码表读取文件,使读取获得到的字符不会乱码。

               构造方法           

                          注意:他构造方法的参数不是Reader的子类而是InputStream的子类

                   InputStreamReader(InputStream in,String  charsetName)                        按指定编码表去读取文件内容,最好是文件是什么编码就使用什么编码表去读,如果不设置默认编码表为utf-8

//按照GBK编码表去读取aaa.txt文档的内容     如果aaa.txt文档是使用utf-8编码的这样读取就会造成乱码
   InputStreamReader Reader = new  InputStreamReader(new   FileInputStream("aaa.txt"),"GBK");

             他的其他方法和FileReader的方法一样,在这里就没重复写了


         OutputStreamWriter

                        介绍:可以按照指定编码表格式把字符串写入文件

                  构造方法

                          OutputStreamWriter(OutputStream  out, String charsetName)              按照指定编码把数据写入文件,可以不写默认UTF-8编码表。    

    //创建转换流对象,按照GBK编码表写数据到文件中
   OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("Day10/aaa.txt"),"GBK");
   //把我爱java写入文件中    如果这个文件用我们的开发工具打开会乱码的因为我们是按照GBK编码表写进去的而我们的开发工具默认UTF-8
   writer.write("我爱java");
   writer.close();

               其他方法和FileWriter方法一样就不再重复介绍了.


         PrintWriter  字符对应流

                     介绍:这个字符打印流和PrintStream差不多,构造方法比PrintStream多了几个,可以按照指定的编码表把数据写入文件

                    构造方法

                               PrintWriter(File  file,String  charsetName)                传入一个File类对象,后面一个参数为写入文件内容的编码格式 ,如果不写默认utf-8

                               PrintWriter(Writer  writer, Striing  charsetName)        前面一个为Writer类的实现类,后面一个参数为写入文件的编码格式,不写默认utf-8

                              PrintWriter(OutputStream  out , String  charsetName)        可以传入一个字节输出流对象,后面一个参数是写入文件的编码格式,不写默认utf-8

       

                      常用方法

                           void  print(String  s)                 写入字符串指定的文件中

 PrintWriter printWriter = new PrintWriter("Day10/aaa.txt","GBK");
  printWriter.print("哈哈哈哈哈哈哈");
  printWriter.close();

                       void   println(String  s)               写入字符串到文件中并换一行

 

 PrintWriter printWriter = new PrintWriter("Day10/aaa.txt","GBK");
  printWriter.println("哈哈哈哈哈哈哈");
  printWriter.close();

                     


        字符流常用操作

                                         读取文件内容,复制文件

               FileWriter与FileReader拷贝文件

                    

//创建字符输出流,并关联文件
   FileWriter writer = new FileWriter("aaa.txt");
   //创建字符输入流,并关联文件
   FileReader reader = new FileReader("aaa.txt");
   int len = 0;
   //创建字符数组保存读取文件的字符,提高效率
   char[] chars = new char[1024];
   //循环读取文件内容   当reader方法把文件内容全部读取完毕时返回-1,当返回-1时就说明文件全部读取完毕
   while ((len = reader.read(chars)) != -1){
       //把读取到的内容写入文件,  chars读取到的数组   0从数组哪一个索引开始   len读取多少个
       writer.write(chars,0,len);
   }
   //关闭流释放资源
   writer.close();
   reader.close();

            BufferedWriter与BufferedReader复制文件

                 

//创建字节缓冲输入流
  BufferedReader reader = new BufferedReader(new FileReader("aaa.txt"));
  //创建字符缓冲输出流
  BufferedWriter writer = new BufferedWriter(new FileWriter("aaa.txt"));
  String s = null;
  //因为缓冲流里默认有一个长度为8192的字符数组使用不需要再定义数组来提高效率
  //循环读取文件内容   readLing方法一次读取文件的一行,当把文件内容全部读取完了返回null
  while ((s=reader.readLine())!=null){
      //写入一个字符串到文件中
      writer.write(s);
      //让文件内容换一行
      writer.newLine();
  }
  //关闭资源
     writer.close();
  reader.close();

             InputStreamReader与OutputStreamWriter按指定编码表复制文件

 

//创建转换流  并指定编码
 OutputStreamWriter  writer = new OutputStreamWriter(new FileOutputStream("aaa.txt"),"GBK");
 InputStreamReader  reader = new InputStreamReader(new FileInputStream("aaa.txt"),"GBK");
 //利用bufferedWriter与BufferedReade提高读取效率
 BufferedWriter bufferedWriter = new BufferedWriter(writer);
 BufferedReader bufferedReader = new BufferedReader(reader);
 String s = null;
 //循环读取文件内容,  readLine方法一次读取文件一行内容 ,当把文件读取完毕返回null
 while ((s=bufferedReader.readLine())!=null){
     //写入一行字符串到文件
     bufferedWriter.write(s);
     //在文件中换一行
     bufferedWriter.newLine();
 }
 //关闭资源  我们把转换流做参数传进了缓冲流,我们只有要关闭了缓冲流就可以了,他里面会帮我们关闭我们传进去的流
 bufferedReader.close();
 bufferedWriter.close();

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值