IO流_处理流_转换流(编码解码与乱码的讲解)_day26

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.就是输出的字节长度不够:


猜你喜欢

转载自blog.csdn.net/qq_38053395/article/details/80554210
今日推荐