java基础:IO流---非节点流之转换流

2021/11/17 20:42:33

本文主要是介绍java基础:IO流---非节点流之转换流,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

转换流

简介

字节流是比较通用的IO流,因为所有数据在计算机中都是以字节的形式存储的,所以在很多场景下,都提供了字节流的操作实现。字符流只是适用于读写字符数据的场景,例如,如果要读取别人写给你的一部电影,那么使用字符流很显然是不合适的,但是如果是读取别人写给你的一份代码文件,使用字符流就没有问题,因为代码文件里面都是字符。这时候需要注意的是,别人写给你的文件字符的编码,要和你读出来的文件字符编码一致,否则读出的文字就可能出现乱码

转换流,可以在把一个字节流转换为字符的同时,并指定转换的字符编码

输出

java.io.OutputStreamWriter,可以将字节输出流转换为字符输出流,并指定编码
下面是它的部分源码

public class OutputStreamWriter extends Writer {    	
	public OutputStreamWriter(OutputStream in) {        
	//使用默认编码转换   
	}        
	public OutputStreamWriter(OutputStream in, String charsetName){        
	//使用指定编码转换   
	}   
}

可以看出,它的构造器参数,要求传入一个需要转换的字节输出流,和一个指定的字符编码

OutputStreamWriter本身就是一个字符输出流,因为它继承了 Writer

使用

public static void main(String[] args) {
		
		//声明一个PrintWriter流,
		PrintWriter out = null;
		
		//声明转换流,用来包装字节流,并转换为字符流
		OutputStreamWriter osw = null;
		
		try {
			//创建文件对象
			File file = new File("src/Test/test5/a.txt");
			
			//将字节流转换为字符流
			osw = new OutputStreamWriter(new FileOutputStream(file),"UTF-8");
			
			//“包裹”转换流,增强这个字符流的功能,可以一次写出一行字符串,并自动换行        
			//注意,转换流同时也是一个字符流        
			out = new PrintWriter(osw);
			
			//或者可以写在一起也是ok的
//			out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file),"UTF-8"));
			
			//输出到文件a.txt中
			out.println("你好!");
			out.flush();
			
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(osw != null) {
				try {
					osw.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			
			if(out != null) {
				out.close();
			}
		}
	}

在a.txt文件中的输出
UTF-8编码时:
在这里插入图片描述
GBK编码时
在这里插入图片描述

输入

java.io.InputStreamReader,可以将字节输入流转换为字符输入流,并指定编码

public class InputStreamReader extends Reader {    	
	public InputStreamReader(InputStream in) {        
	//使用默认编码转换   
	}        
	public InputStreamReader(InputStream in, String charsetName){
	//使用指定编码转换   
	}
}

它的构造器参数,要求传入一个需要转换的字节输入流,和一个指定的字符编码,InputStreamReader本身就是一个字符输出流,它继承了 Reader

具体使用

	public static void main(String[] args) {
		
		//缓冲流,用来提高效率
		BufferedReader in = null;
		
		//声明转换流
		InputStreamReader isr = null;
		
		File file = new File("src/Test/test5/a.txt");
		try {
			//将字节流转换为字符流,并且指定读取时的编码格式
			isr = new InputStreamReader(new FileInputStream(file),"GBK");
			
			in = new BufferedReader(isr);
			
			//写在一起,就只要关闭in的资源
//			in = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));
			
			//使用流
			String line = null;
			while((line = in.readLine())!= null) {
				//输出到控制台
				System.out.println(line);
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(isr != null) {
				try {
					isr.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			
			if(in != null) {
				try {
					in.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

编码格式对应正确才可以读出来,例如,如果你是用UTF-8编码写进文件的你就得用UTF-8的编码格式读取文件



这篇关于java基础:IO流---非节点流之转换流的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程