字节流可以可以处理一切文件(视频、音频、图片、纯文本),所以很多框架的底层都返回字节流。但当一个文件是纯文本时,用字符流比字节流的处理效果更佳(特别是加了缓冲BufferedReader/BufferedWriter,逐行读取逐行写出)
InputStreamReader/OutputStreamWriter字符流与字节流转换的桥梁 a bridge from byte streams to character streams
解码: 字节---->字符(InputStreamReader)
编码: 字符---->字节(OutputStreamWriter)
作用(2点):
1.能将字节流转换成字符流
2.指定字符集specified charset(在解码的过程如果与源码的字符集不统一就会出现乱码,所以最好指定字符集)
Construction | 描述 |
---|---|
InputStreamReader(InputStream in, String charsetName) | 创建使用给定字符集的 InputStreamReader |
OutputStreamWriter(OutputStream in, String charsetName) | 创建使用给定字符集的 OutputStreamWriter |
CharacterStreams -->InputStreamReader/OutputStreamWriter–>ByteStreams
Test_1:以字节流的的形式操作字节流(循环获取输入内容,并输出此内容)
- 操作System.in和System.out(键盘的输入输出都是字符串)
public class ConvertTest{
public static void main(String[] args) {
try (/*不用释放*/
/*凡使用字符串的地方都+缓冲:InputStreamReader isr = new InputStreamReader(System.in);*/
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));){
String str = "";
while(!str.equals("quit")) {/*循环读取,遇到quit终止*/
str = reader.readLine();/*逐行读取*/
writer.write(str);/*逐行写出*/
writer.newLine();
writer.flush();/*因内容较少,必须强制刷新,否则驻留在缓冲区*/
}
}catch(IOException e){
System.out.println("操作异常");
}
}
}
Test_2:指定字符集(操作网络流[下载百度的源代码])
public static void main(String[] args) {
try (/*不用释放*/
// 字节输入流 特别指定"UTF-8"
BufferedReader is = new BufferedReader(/*为了处理方便加缓冲*/
new InputStreamReader(/*InputStreamReader+"UTF-8"避免乱码问题*/
/*节点流、网络流、字节流*/new URL("https://www.baidu.com/").openStream(),"UTF-8"));
BufferedWriter os = new BufferedWriter(/*为了处理方便加缓冲*/
new OutputStreamWriter(/*OutputStreamReader+"UTF-8"避免乱码问题*/
/*输出流*/new FileOutputStream("baidu.html"),"UTF-8"));){
// (读取)操作
String temp;
while(null !=(temp = is.readLine())) {
os.write(temp);/*如果这里出现乱码,是由字符集不统一造成*/
os.newLine();
}
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}