1.处理流
1)缓冲流
package buffered; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; /** * * 字符缓冲流 * * @author Wang * */ public class bufferChar { public static void main(String[] args) { //创建源 仅限于 字符的纯文本 File src =new File("F:/testIO/Demo03.java"); File dest =new File("F:/testIO/Demo03BufferCopy.java"); //选择流 BufferedReader reader =null; BufferedWriter wr =null; try { reader =new BufferedReader(new FileReader(src)); //加入了缓冲流就是这里变为 BudderedReader(); 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)转换流(处理乱码)
编码与解码的简单的示例:
package DecodeAndCode; import java.io.UnsupportedEncodingException; /** * * 探究文件的编码与解码来解决乱码的方式 * 乱码的两个原因 * * @author Wang * */ public class Demo01 { public static void main(String[] args) throws UnsupportedEncodingException { String str ="中国"; //编码 byte[] data =str.getBytes(); // 解码 System.out.println(new String(data,0,3));//设置字节数为3 而中国是两个字 字符长度应该是4 } public static void test01() throws UnsupportedEncodingException { //解码 byte -->char String str ="中国"; //这里会使用eclipse的默认编码字符集GBK来进行解码 //编码 char -->byte byte[] data =str.getBytes(); //这里会使用eclipse的默认编码字符集GBK来进行编码 //编码与解码字符集同一 System.out.println(new String(data)); data =str.getBytes("utf-8"); //设定编码字符集 utf-8 //不同一出现乱码 System.out.println(new String(data)); //编码 byte[] data2 = "中国".getBytes("utf-8"); //设定编码字符集 utf-8 //解码 str=new String(data2,"utf-8"); //设定解码字符集 utf-8 System.out.println(str); } }
转换流: 只能字节转为字符
1、输出流 OutputStreamWriter -> 编码
2、输入流 InputStreamReader -> 解码
当你的源文件不是乱码 那么你用什么编码解码放过是都无所谓 只要二者一样就能输出你想要的文件
package DecodeAndCode; import java.awt.image.BufferedImageFilter; 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.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; /** * 转换流: 字节转为字符 * 1、输出流 OutputStreamWriter -> 编码 * 2、输入流 InputStreamReader -> 解码 * * 当你的源文件不是乱码 那么你用什么编码解码放过是都无所谓 只要二者一样就能输出你想要的文件 * * @author Wang * */ public class Demo02 { public static void main(String[] args) throws IOException { //指定解码字符集 BufferedReader br = new BufferedReader( new InputStreamReader( new BufferedInputStream( new FileInputStream( new File("F:/testIO/Demo03.java"))),"UTF-8") //utf-8 会乱码 解码字符集为GBK 解码方式为GBK就不会乱码 ); //写出文件 编码 BufferedWriter bw =new BufferedWriter( new OutputStreamWriter( new BufferedOutputStream( new FileOutputStream(new File("F:/testIO/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(); } }
转换流的时候会有很多定义的嵌套;
总结一下:
注意:
节点流,处理流(字节缓冲,字符缓冲流)他要建立在节点流之上;
缓冲流就是这两句改变了:
reader =new BufferedReader(new FileReader(src)); //加入了缓冲流就是这里变为 BudderedReader();
wr =new BufferedWriter(new FileWriter(dest));
节点流一般建议加上缓冲流,提高性能;
查看一个文件的编码方式:可以文本方式打开然后另存为,会出现一个这样的界面如下图(应该可以清楚的看见文件的编码方式):
怎么查看eclipse的默认编码方式及设置编码方式:
Windows->Preferences->General就会出现如下界面:
你就应该可以看见左下角的默认编码方式为GBK,可以根据自己的意愿调节;
编码就是从字符变为二进制
解码就是从二进制变为字符
编码与解码是以人为中心的
乱码的两种原因:
1.就是编码的字符集不相同;
2.就是输出的字节长度不够: