Java转换流

Java转换流,第1张

Java转换流

        InputStreamReader和OutputStreamWriter

正常情况下,字节流可以对所有的数据进行 *** 作,但是有些时候在处理一些文本时我们要用到字符流。比如,查看文本的中文时就是需要采用字符流更为方便。所以Java IO流中提供了两种用于将字节流转换为字符流的转换流。

        

InputStreamReader用于将字节输入流转换为字符输入流

OutputStreamWriter用于将字节输出流转换为字符输出流

使用转换流可以在一定程度上避免乱码,还可指定输入输出所使用的字符集

在test.txt中输出"我觉得你很温柔"这7个字,将test.txt保存为"UTF-8"的格式,然后通过字节流的方式读取

public class Test8 {
	public static void main(String[] args) {
		try {
			FileInputStream f1 = new 
			FileInputStream("D:\test.txt");
			int b = 0;
			
			while((b=f1.read())!=-1) {
				System.out.print((char)b);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
	//输出结果为:???è§????????????????

输出结果为:???è§????????????????,我们发现中文都是乱码。下面用字节数组,并通过字符串设定编码格式来显示内容

public class Test8 {
	public static void main(String[] args) {
		try {
			FileInputStream f1 = new 
			FileInputStream("D:/test.txt");
			
			byte b[] = new byte[1024];
			int len = 0;
			while((len = f1.read(b))!=-1) {
			
				System.out.print(
				new String(b,0,len,"UTF-8"));
				
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
		
//输出为:我觉得你很温柔

这时输出结果为:我觉得你很温柔,但是当存储的文字较多时,会出现解码不正确的问题,且字节长度无法根据解码内容自动设定,此时就需要转换流来完成。

public class Test8 {
	public static void main(String[] args) {
		try {
			FileInputStream fis = new 
			FileInputStream("D:/test.txt");
			
			InputStreamReader isr = new 
			InputStreamReader(fis,"UTF-8");
			
			int b = 0;
			while((b = isr.read())!=-1) {
				System.out.print((char)b);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}	
	}
}
//		输出为:我觉得你很温柔

下面以获取键盘输入为例来介绍转换流的用法,Java使用System.in代表标准输入,即键盘输入,但是这个标准输入流是InputStream类的实例,使用不太方便,而且键盘输入内容都是文本内容,所以可以使用InputStreamReader将其转换成字符输入流,普通的Reader读取输入内容依然不太方便,可以将普通的Reader再次包装成BufferedReader,利用BufferedReader的readLine()方法可以一次读取一行内容。

public class Test9 {
	public static void main(String[] args) {
	
		InputStreamReader reader = new 
		InputStreamReader(System.in);
		//将System.in对象 转换成Reader对象
		
		BufferedReader br = new BufferedReader(reader);
		//将普通的Reader 包装成BufferedReader
		
		String line = null;
		try {
		
			while((line = br.readLine())!=null) {
			//利用循环方式来逐行的读取
			
				if(line.equals("exit")){
				//如果读取的字符串为"exit",则程序退出
					System.exit(1);
				
				}
				
				System.out.println("输入内容为:"+line);
				//打印读取的内容
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

上面代码,将System.in 包装成 BufferedReader,BufferedReader流具有缓冲功能,它靠也一次读取一行文件,以换行符为标志,如果它没有读到换行符,则程序堵塞,等到读到换行符为止。运行上面程序可以发现这个特征,在控制台执行输入时,只有按下回车键,程序才会打印刚输入的内容。

由于BufferedReader具有一个readLine()方法,可以非常方便地进行一次读入一行内容,所以经常把读入文本内容的输入流包装成BufferedReader,用来方便地读取输入流的文本内容。

学到这里,大家可能有一个疑问:既然有字节流转字符流的转换流,那么为什么没有字符流转字节流的转换流呢?

这个问题一语指出了 Java 设计的遗漏之处,想一想字符流和字节流的差别。字节流比字符流的使用范围要更广,但字符流比字节流 *** 作方便。如果有一个流已经是字符流了,也就是说,是一个用起来更方便的流,为什么要转换成字节流呢?反之,如果现在有一个字节流,但可以确定这个字节流的内容都是文本内容,那么把它转换成字符流来处理就会更方便一些,所以 Java 只提供了将字节流转换成字符流的转换流,没有提供将字符流转换成字节流的转换流。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5637653.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存