5.22Java转换流(将字节流转成字符流)

5.22Java转换流(将字节流转成字符流)

字节流转字符流图片

很多系统或者框架的底层返回的都是字节流,但是为了处理可能要进行转换成字符流,所以提供了这个转换方法

举例

System.in、System.out都是字节流输入、输出

InputStreamReader

将字节转成字符--->解码--->decode

作用
  • InputStreamReader--->字节流转成字符流,处理纯文本内容

  • 字节转成字符--->解码--->字符集--->指定字符集

OutputStreamWriter

将写入的字符转换成字节--->编码--->encode

这两个流的特点:在构造器可以指定字符集

InputStreamReader:--->字节数不够或者字符集不对都可能出现乱码

package iostudy.convert;

import jdk.internal.util.xml.impl.Input;

import java.io.*;
import java.net.URL;

/**
* 转换流:InputStreamReader、OutputStreamWriter
* 作用:
* 1、以字符流的形式操作字节流(纯文本的形式)
* 2、指定字符集--->构造器自带了
*/
public class ConvertTestNo2 {
   public static void main(String[] args) {
       /*创建源*/
       File src = new File("D:/workspace/abc.txt");
       Writer writer = null;
       //操作System.in和System.out--->System.in输入的都是字符可以对其转换
       //操作网络流 下载百度源代码--->网络爬虫第一步(先拿到源代码、进行分析、清晰、在进行处理--->存储)
       //打开一个网络节点流、字节流--->因为是字节流,所以可以用字节流装饰符加速处理--->openStream为打开一个网络流节点
       try (InputStream is = new URL("http://www.baidu.com").openStream()){
           //创建FileWriter对象
           writer = new FileWriter(src);
           //进行操作
           int temp;
           while ((temp=is.read())!=-1){
               writer.write((char)temp); //这里面可能会出现乱码现象--->使用InputStreamReader类实例化对象
          }
           /*强制刷新流*/
           writer.flush();
      }catch (IOException e){
           System.out.println("操作异常!!!");
      }finally {
           try {
               if (null!=writer){
                   writer.close();
              }
          }catch (IOException e){
               e.printStackTrace();
          }
      }
       testNo1();
  }

   public static void testNo1(){
       /*创建源*/
       File src = new File("D:/workspace/abc.txt");
       Writer writer = null;
       //操作System.in和System.out--->System.in输入的都是字符可以对其转换
       //操作网络流 下载百度源代码--->网络爬虫第一步(先拿到源代码、进行分析、清晰、在进行处理--->存储)
       //打开一个网络节点流、字节流--->因为是字节流,所以可以用字节流装饰符加速处理--->openStream为打开一个网络流节点--->InputStreamReader获取网页源代码转成UTF-8的形式
       try (InputStreamReader is = new InputStreamReader(new URL("http://www.baidu.com").openStream(), "UTF-8")){
           //使用装饰流加速节点流
           //创建FileWriter对象
           writer = new FileWriter(src);
           //进行操作
           int temp;
           while ((temp=is.read())!=-1){
               writer.write((char)temp); //这里面可能会出现乱码现象--->使用InputStreamReader类实例化对象
          }
           /*强制刷新流*/
           writer.flush();
      }catch (IOException e){
           System.out.println("操作异常!!!");
      }finally {
           try {
               if (null!=writer){
                   writer.close();
              }
          }catch (IOException e){
               e.printStackTrace();
          }
      }
  }

   public void testNo2(){
       /*创建源*/
       File src = new File("D:/workspace/abc.txt");
       Writer writer = null;
       //操作System.in和System.out--->System.in输入的都是字符可以对其转换
       //操作网络流 下载百度源代码--->网络爬虫第一步(先拿到源代码、进行分析、清晰、在进行处理--->存储)
       //打开一个网络节点流、字节流--->因为是字节流,所以可以用字节流装饰符加速处理--->openStream为打开一个网络流节点--->InputStreamReader获取网页源代码转成UTF-8的形式
       try (BufferedReader is = new BufferedReader
              (new InputStreamReader
                      (new URL("http://www.baidu.com").openStream(), "UTF-8"))){
           /*
           1、new URL是一个节点流,里面放入网址+运行openStream方法既可以打开一个网络流
           2、拉下来以后发现全是字符,使用InputStreamReader转成字节流,需要指定字符集可以避免乱码--->InputStreamReader可以指定读取内容的字符集
           3、在使用BufferedReader装饰流加速节点流处理
           4、除了节点流其他都是装饰流
           --->以上三步只是拿下页面资源。不是所有网站都支持拉取页面源代码
            */
           //使用装饰流加速节点流
           //创建字符串
           String str;
           while ((str=is.readLine())!=null){
               writer.write(str); //这里面可能会出现乱码现象--->使用InputStreamReader类实例化对象
          }
           /*强制刷新流*/
           writer.flush();
      }catch (IOException e){
           System.out.println("操作异常!!!");
      }finally {
           try {
               if (null!=writer){
                   writer.close();
              }
          }catch (IOException e){
               e.printStackTrace();
          }
      }
  }
}

OutputStreamWriter:

        BufferedWriter writer1 = new BufferedWriter(
               new OutputStreamWriter(
                       new FileOutputStream("Baidu.html"),"UTF-8"
              )
           //加入到try...with...source当中

 

 

It's a lonely road!!!
原文地址:https://www.cnblogs.com/JunkingBoy/p/14811923.html