Java 字节流 字符流 转换流

原创 2015年05月10日 13:55:16

我们知道Java中的流分为字符流和字节流,其中字符流主要针对字符文本进行处理,而字节流处理范围更为广泛,毕竟图片、电影等只要是文件都是以二进制的形式存在的,而不是字符。
字符流:
FileReader
FileWriter。


BufferedReader
BufferedWriter


字节流:
FileInputStream
FileOutputStream


BufferedInputStream
BufferedOutputStream

我们看一下J2SE文档:


BufferedReader(Reader in):创建一个使用默认大小输入缓冲区的缓冲字符输入流。
可以看出BufferedReader是一个Reader的子类,构造函数传进来的是父类Reader类,其实是装饰者模式,将父类比较低效的读取数据的方式做成了比较高效的缓冲区读取方式。
  String readLine():读取一个文本行。
它有一个方法readLine(),直接读取一行,相对于父类Reader的read()方法更加方便。


System.in:对应的标准输入设备:键盘。
static InputStream in :“标准”输入流。
我们可以写一个类来使用System中的静态方法in来从键盘读取数据:

<span style="font-size:18px;">import java.io.*;
class  ReadIn{
	public static void main(String[] args) throws IOException{
		InputStream inin = System.in;		//新建一个InputStream对象,读取位置为键盘
		StringBuilder sb = new StringBuilder();	//用于存储读入的字符,相当于自己建了一个缓存区

		while(true){
			int ch = inin.read();			//读取字节
			if(ch=='\r')
				continue;

			if(ch=='\n'){
				String s = sb.toString();//读到回车符就转成String,看看是否是"over",是就退出度数
				if("over".equals(s))
					break;
				else{
					System.out.println(s.toUpperCase());//不是"over"的话就不退出,一行读取完毕,输出到屏幕上
					sb.delete(0,sb.length());	//清空缓存StringBuilder sb
				}
			}
			else
				sb.append((char)ch);	//如果没读到换行符,就继续往缓存StringBuilder里添加读取的字符
		}
	}
}</span>

System的in的类型是InputStream,属于字节流,和BufferedReader属于不同的流类。在InputStream中没有readLine()这样的整行读取方法,只有read()。
那么能不能直接使用readLine()方法来完成键盘录入的一行数据的读取呢?
即“能不能将字节流转成字符流,然后再使用字符流缓冲区的readLine方法呢”?
可以的!
在字符流中有这样的字符流:
将字节流转换成字符流的桥梁——InputStreamReader;
InputStreamReader(InputStream in) :创建一个使用默认字符集的 InputStreamReader。传入的对象是InputStream类型,而自己本身是Reader的子类。
将字符流转换成字节流的桥梁——OutputStreamWriter。
OutputStreamWriter(OutputStream out) :创建使用默认字符编码的 OutputStreamWriter。传入的对象是OutputStream类型,而自己本身是Writer的子类。
从名字就可以看出,他们分别属于(从属关系看名字的后半部分)字符流Reader和Writer,他们的功能(功能看名字的前半部分)和字节流InputStream、OutputStream相关。

<span style="font-size:18px;">import java.io.*;
class  TransStreamDemo{
	public static void main(String[] args) throws IOException{
		InputStream in = System.in;				//获取键盘录入对象。
		InputStreamReader isr = new InputStreamReader(in);	//将字节流对象转成字符流对象,使用转换流。InputStreamReader
		BufferedReader bufr = new BufferedReader(isr);		//为了提高效率,将字符串进行缓冲区技术高效操作。使用BufferedReader

//		BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));	//最常见写法,以后都这样写!!!

		OutputStream out = System.out;
		OutputStreamWriter osw = new OutputStreamWriter(out);
		BufferedWriter bufw = new BufferedWriter(osw);
//		BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));	//同上!!!

		String line = null;

		while( ( line = bufr.readLine() ) != null ){
			if("over".equals(line))
				break;
			bufw.write(line.toUpperCase());	//bufw将osw包装了,osw将out包装了,本例中out是Syetem.out的对象实现,所以原本用System.out.println的地方直接可以用包装后的bufw输出字符串。
			bufw.newLine();			//输出换行符:可以根据Linux和Windows的不同自动输出\n或\r\n
			bufw.flush();			//输出流有缓冲区,需要flush才输出来
		}

		bufr.close();

	}
}</span>

即——
从文件读取字符,用FileReader,但是为了让其读取更高效,使用BufferedReader将其包装一下;
从键盘读取数据,(新建一个InputStream对象获取键盘录入对象,)用InputStreamReader转换流将InputStream转换,然后用BufferedReader将InputStreamReader包装。
当然InputStream也可以从文件读取,这个时候使用的就不是InputStream in = System.in,而是InputStream in = new FileInputStream(String fileName)。
即:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(String fileName)));

版权声明:本文为博主原创文章,欢迎转载欢迎传播,注不注明出处随你,只要对更多人有所帮助就行。 https://blog.csdn.net/puppylpg/article/details/45620387

java 字节流转字符流

1.文本是一种16位无符号整数,是字符unicode编码(双字节编码). 2.文件时byte byte byte ...的数据序列。 3.文本文件是 文本(char)序列按照某种编码方案(utf-...
  • AQ_xiaobin
  • AQ_xiaobin
  • 2016年12月08日 16:50
  • 2547

JAVA中的字节流和字符流的转换

以字符为导向的stream基本上有与之相对应的以字节为导向的Stream,两个对应类实现的功能相同,只是操作时的导向不同 1:字节输入流转换为字符输入流: InputStreamReader是字节...
  • xuruoxin
  • xuruoxin
  • 2013年04月07日 11:59
  • 7664

Java中的字符串与字节流转换

直接代码,看后就明白: public class StreamFromString { static String src = "今天的天气真的不好"; public static void mai...
  • bk461409485
  • bk461409485
  • 2011年07月01日 15:47
  • 20238

字节流转字符流

package test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream;...
  • zhaoqingkaitt
  • zhaoqingkaitt
  • 2015年06月22日 19:09
  • 695

http字节流转字符流的问题

http将des加密的数据请求到服务器,由于des是二进制数据,所以请求时必须以流数据的方式请求web服务器。但是这个时候除了传输流数据,还需要指定des的密钥id,所以导致一个字符串一个流数据,处理...
  • u014476088
  • u014476088
  • 2017年06月14日 11:47
  • 803

字节流转换字符流

输入和输出流体系中提供了两个装换流,是将字节流转换成字符流,其中InputStreamReader将字节输入流转换成字符输入流,OutputStreamWriter将字节输出流转换成字符输出流。(这是...
  • xuguoli_beyondboy
  • xuguoli_beyondboy
  • 2015年03月03日 12:56
  • 1344

字节流与字符流转换

字节流与字符流之间的区别却可以联系起来,这就是表中的两个类InputStreamReader和OutputStreamWriter。InputStreamReader负责把字节输入流转换为字符输入流,...
  • xiaozhu0301
  • xiaozhu0301
  • 2016年06月06日 09:12
  • 2324

将字节流转换成字符流详细例子

转换流:将字节流转换字符流   (1)输入字节流转换输入字符流的 转换的方法: 将输入字节流转换成输入字符流:inputStreamReader(); 辅助:(一般字符流按照行读,或者读入都用...
  • newVenues
  • newVenues
  • 2017年04月14日 16:46
  • 1594

Java IO中转换流的作用

字符流与字节流转换 InputStreamReader OutputStreamWriter 转换流的两个作用 提高对文本操作的便捷程度 操作文本涉及到指定编码...
  • u013905744
  • u013905744
  • 2016年07月16日 14:22
  • 6944

Java中转换流的相关用法

/** 1、字节流与字符流之间的转换,称作转换流 包括:InputStreamReader--->是字节流通向字符流的桥梁、OutputStreamWriter--->是字符流通向字节流的桥梁 ...
  • u011521890
  • u011521890
  • 2015年09月27日 21:33
  • 1588
收藏助手
不良信息举报
您举报文章:Java 字节流 字符流 转换流
举报原因:
原因补充:

(最多只允许输入30个字)