转换流与打印流

编码引出的问题

import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; /* FileReader可以读取IDE默认编码格式(UTF-8)的文件 FileReader读取系统默认编码(中文GBK)会产生乱码??? */ public class new01 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new FileReader("D:\\environment\\java_project\\javase\\我是GBK格式文件.txt")); int len=0; while ((len=br.read())!=-1){ System.out.println((char) len); } br.close(); } }

转换流 转换流原理 【转换流与打印流】转换流与打印流
文章图片

OutputStreamWriter
import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; /* java.io.OutputStreamWriter extends Writer OutputStreamWriter:是字符流通向字节流的桥梁:可使用指定的charset将要写入流中的字符编码成字节。(编码:把能看懂的编程看不懂的)继承自父类的共性成员方法: - void write(int c) 写入单个字符 - void write(char[] cbuf) 写入字符数组 - abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分,off数组的开始索引,len写的字符个数 - void write(String str) 写入字符串 - void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数 - void flush() 刷新该流的缓冲 - void close() 关闭此流,但要先刷新它 构造方法: OutputStreamWriter(OutputStream out) 创建使用默认字符编码的 OutputStreamWriter OutputStreamWriter(OutputStream out, String charsetName) 创建使用指定字符集的 OutputStreamWriter 参数: OutputStream out:字节输出流,可以用来写转换之后的字节到文件中 String charsetName:指定的编码表名称,不区分大小写,可以是utf-8/UTF-8,gbk/GBK,...不指定默认使用UTF-8 使用步骤: 1.创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称 2.使用OutputStreamWriter对象中的方法write,把字符转换为字节存储缓冲区中(编码) 3.使用OutputStreamWriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节的过程) 4.释放资源 */ public class Demo01OutputStreamWriter { public static void main(String[] args) throws IOException { write_utf_8(); } /* 使用转换流OutputStreamWriter写UTF-8格式的文件 */ private static void write_utf_8() throws IOException { //1.创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称 //OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\environment\\java_project\\javase\\utf_8.txt"), "utf-8"); OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\environment\\java_project\\javase\\utf_8.txt"), "GBK"); //2.使用OutputStreamWriter对象中的方法write,把字符转换为字节存储缓冲区中(编码) osw.write("你好"); //3.使用OutputStreamWriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节的过程) osw.flush(); //4.释放资源 osw.close(); } }

InputStreamReader
import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; /* java.io.InputStreamReader extends Reader InputStreamReader:是字节流通向字符流的桥梁:它使用指定的charset读取字节并将其解码为字符。(解码:把看不懂的变成能看懂的)继承自父类的共性成员方法: int read()读取单个字符并放回 int read(char[] cubf)一次读取多个字符,将字符读入数组 void close()关闭该流并释放与之关联的所有资源 构造方法: InputStreamReader(InputStream in) 创建一个使用默认字符集的InputStreamReader InputStreamReader(InputStream in, String charsetName) 创建使用指定字符集的InputStreamReader 参数: InputStream in:字节输入流,用来读取文件中保存的字节 String charsetName:指定的编码表名称,不区分大小写,可以是utf-8/UTF-8,gbk/GBK,...不指定默认使用UTF-8 使用步骤: 1.创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称 2.使用InputStreamReader对象中的方法read读取文件 3.释放资源 注意事项: 构造方法中指定的编码表名称要和文件的编码相同,否则会发生乱码 */ public class Demo02InputStreamReader { public static void main(String[] args) throws IOException { read_utf_8(); }/* 使用InputStreamReader读取UTF-8格式的文件 */ private static void read_utf_8() throws IOException { //1.创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称 InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\environment\\java_project\\javase\\utf_8.txt"), "UTF-8"); //2.使用InputStreamReader对象中的方法read读取文件 int len = 0; while ((len = isr.read())!=-1){ System.out.println((char)len); } //3.释放资源 isr.close(); } }

转换文件编码
/* 练习:转换文件编码 将GBK编码的文本文件,转换为UTF-8编码的文本文件分析: 1.创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称GBK 2.创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称UTF-8 3.使用InputStreamReader对象中的方法read读取文件 4.使用OutputStreamWriter对象中的方法write,把读取的数据写入到文件中 5.释放资源 */ import java.io.*; public class Demo03Test { public static void main(String[] args) throws IOException { read_GBK(); }private static void read_GBK() throws IOException { //1.创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称GBK InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\environment\\java_project\\javase\\utf_8.txt"), "utf-8"); //2.创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称UTF-8 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\environment\\java_project\\javase\\GBK.txt"), "GBK"); // 3.使用InputStreamReader对象中的方法read读取文件 int len = 0; while ((len = isr.read())!=-1){ //4.使用OutputStreamWriter对象中的方法write,把读取的数据写入到文件中 osw.write(len); } //5.释放资源 osw.close(); isr.close(); } }

打印流(write,println,System.setOut)
import java.io.FileNotFoundException; import java.io.PrintStream; /* java.io.PrintStream:打印流 PrintStream 为其他输出流添加了功能,使它们能够方便的打印各种数据值表示形式 PrintStream特点: 1.只负责数据的输出,不负责数据的读取 2.与其他输出流不同,PrintStream永远不会抛出IOException 3.有特有的方法,print,println void print(任意类型的值) void println(任意类型的值并换行) 构造方法: PrintStream(File file):输出的目的地是一个文件 PrintStream(OutputStream out):输出的目的地是一个字节输出流 PrintStream(String fileName):输出的目的地是一个文件路径 PrintStream extends OutputStream 继承自父类的成员方法: - public void close():关闭此输出流并释放与此流相关联的任何系统资源 - public void flush():刷新此输出流并强制任何缓冲的输出字节被写出 - public void write(byte[] b):将b.length字节从指定的字节数组写入此输出流 - public void write(byte[] b, int off, int len):从指定的字节数组写入len字节,从偏移量off开始输出到此输出流 - public abstract void write(int b):将指定的字节输出流 注意: 如果使用继承自父类的write方法写数据,那么查看数据的时候会查询编码表97-->a 如果使用自己特有的方法print/println方法写数据,写的数据原样输出97-->97 */ public class Demo01PrintStream { public static void main(String[] args) throws FileNotFoundException { //System.out.println("HelloWorld"); //创建打印流PrintStream对象,构造方法中要绑定要输出的目的地 PrintStream ps = new PrintStream("D:\\environment\\java_project\\javase\\目的地是打印流.txt"); //如果使用继承自父类的write方法写数据,那么查看数据的时候会查询编码表97->a ps.write(97); //如果使用自己特有的方法print/println方法写数据,写的数据原样输出97-->97 ps.println(97); ps.println(8.8); ps.println('a'); ps.println("HelloWorld"); ps.println(true); //释放资源 ps.close(); } } ============================================================================= import java.io.FileNotFoundException; import java.io.PrintStream; /* 可以改变输出语句的目的地(打印流的流向) 输出语句,默认在控制台输出 使用System.setOut方法改变输出语句的目的地改为参数中传递的打印流的目的地 static void setOut(PrintStream out) 重新分配“标准”输出流 */ public class Demo02PrintStream { public static void main(String[] args) throws FileNotFoundException { System.out.println("我是在控制台输出"); PrintStream ps = new PrintStream("D:\\environment\\java_project\\javase\\目的地是打印流.txt"); System.setOut(ps); System.out.println("我在打印流的目的地中输出"); ps.close(); } }

    推荐阅读