0 编码解码的顺序和如何甄别:
1 总结大纲:
处理流:增强功能、提供性能,节点流之上 一、缓冲流 1)、字节缓冲流 BufferedInputStream InputStream is =new BufferedInputStream(new FileInputStream(src)); BufferedOutputStream OutputStream os =new BufferedOutputStream( new FileOutputStream(dest)); 2)、字符缓冲流 BufferedReader readLine() BufferedReader reader =new BufferedReader(new FileReader(new File(src))); BufferedWriter newLine() BufferedWriter wr =new BufferedWriter(new FileWriter(new File(dest))); 二、转换流: 字节流 转为字符流 处理乱码(编码集、解码集) 1、编码与解码概念 以程序为中心 编码: 字符 ---编码字符集>二进制 解码 : 二进制 --解码字符集-> 字符 数字 ----- >字符 (解码 以人为主体,解释给人看得懂) 字符 -----> 数字 (编码,人为主题,把人类世界符号编程到计算机世界中) 2、乱码: 1)编码与解码的字符集不统一 2)字节缺少,长度丢失 3、文件乱码 InputStreamReader(字节输入流,"解码集") OutputStreamWriter(字符输出流,"编码集")
2 代码:
2.1 字节包装流实现拷贝:
/** * 字节流文件拷贝+缓冲流 ,提高性能 * 缓冲流(节点流) * @author Administrator * */ public class BufferedByteDemo { /** * @param args */ public static void main(String[] args) { } /** * 文件的拷贝 * @param 源文件路径 * @param 目录文件路径 * @throws FileNotFoundException,IOException * @return */ public static void copyFile(String srcPath,String destPath) throws FileNotFoundException,IOException { //1、建立联系 源(存在且为文件) +目的地(文件可以不存在) File src =new File(srcPath); File dest =new File(destPath); if(! src.isFile()){ //不是文件或者为null System.out.println("只能拷贝文件"); throw new IOException("只能拷贝文件"); } //2、选择流 InputStream is =new BufferedInputStream(new FileInputStream(src)); OutputStream os =new BufferedOutputStream( new FileOutputStream(dest)); //3、文件拷贝 循环+读取+写出 byte[] flush =new byte[1024]; int len =0; //读取 while(-1!=(len=is.read(flush))){ //写出 os.write(flush, 0, len); } os.flush(); //强制刷出 //关闭流 os.close(); is.close(); } }
2.2 字符包装流实现拷贝:
/** * 字符缓冲流 +新增方法(不能发生多态) * @author Administrator * */ public class BufferedCharDemo { /** * @param args */ public static void main(String[] args) { //创建源 仅限于 字符的纯文本 File src =new File("E:/xp/test/Demo03.java"); File dest =new File("e:/xp/test/char.txt"); //选择流 BufferedReader reader =null; BufferedWriter wr =null; try { reader =new BufferedReader(new FileReader(src)); wr =new BufferedWriter(new FileWriter(dest)); //读取操作 /* char[] flush =new char[1024]; int len =0; while(-1!=(len=reader.read(flush))){ wr.write(flush, 0, len); }*/ //新增方法的操作 String line =null; while(null!=(line=reader.readLine())){ wr.write(line); //wr.append("\r\n"); wr.newLine(); //换行符号 } wr.flush();//强制刷出 } catch (FileNotFoundException e) { e.printStackTrace(); System.out.println("源文件不存在"); } catch (IOException e) { e.printStackTrace(); System.out.println("文件读取失败"); }finally{ try { if (null != wr) { wr.close(); } } catch (Exception e2) { } try { if (null != reader) { reader.close(); } } catch (Exception e2) { } } } }
2.3 包装流的终极文件拷贝,(此写法只能拷贝文本文件,对于图片 声音 视频等不适用 ) ,注意体会代码的注释
体会 File类被一层层包裹的目的, 以及类 InputStreamReader BufferedWriter BufferedReader的遍历方法
readLine writeLine的使用
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; /** * 转换流: 字节转为字符 * 1、输出流 OutputStreamWriter 编码 (把人看得懂的字符写到计算机中 给这些字符编数字 编码) * 2、输入流 InputStreamReader 解码(存储在计算中中的文件是二进制的,要把二进制的数字变成人类读的懂的字符 解释给人看 解码) * * 确保源不能为乱码 * @author Administrator * */ public class ConverDemo02 { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { //指定解码字符集 BufferedReader br =new BufferedReader( // 只有这个类才能字符、数组和行的高效读取 new InputStreamReader( // InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符, 是FileReader的父类,也只有InputStreamReader 才能指定字符集,InputStream-->Reader = InputStreamReader new BufferedInputStream( new FileInputStream( new File("E:/xp/test/Demo03.java"))),"UTF-8") -- 从 BufferedInputStream( FileInputStream(file) ) ); //写出文件 编码 BufferedWriter bw =new BufferedWriter( new OutputStreamWriter( new BufferedOutputStream( new FileOutputStream(new File("E:/xp/test/encode.java"))))); String info =null; while(null!=(info=br.readLine())){ //System.out.println(info); bw.write(info); bw.newLine(); } bw.flush(); bw.close(); br.close(); } }