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当中