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)));

版权声明:本文为博主原创文章,未经博主允许不得转载。

Java IO中转换流的作用

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

Java文件与io——复制文件和转换流

字节流与字符流的区别 在所有的流操作里,字节永远是最基础的。任何基于字节的操作都是正确的。无论是文本文件还是二进制的文件。 如果确认流里面只有可打印的字符,包括英文的和各种国家的文字,也包括中文,...
  • sunnylinner
  • sunnylinner
  • 2016年08月02日 09:46
  • 1564

Java 图片与byte数组互相转换

//图片到byte数组   public byte[] image2byte(String path){     byte[] data = null;     FileImageInputSt...
  • huang9012
  • huang9012
  • 2014年01月14日 00:17
  • 55772

Java实现字节流与图片的转化

  • 2016年01月09日 20:38
  • 79KB
  • 下载

Java中转换流的相关用法

/** 1、字节流与字符流之间的转换,称作转换流 包括:InputStreamReader--->是字节流通向字符流的桥梁、OutputStreamWriter--->是字符流通向字节流的桥梁 ...
  • u011521890
  • u011521890
  • 2015年09月27日 21:33
  • 1389

java转换流,io流规律

Java IO流总结之转换流  (2012-10-17 10:37:21) 转载▼ 标签:  java转换流   字符流   字节   杂谈...
  • shaozucheng
  • shaozucheng
  • 2014年06月14日 11:52
  • 847

java 后台 Excel 文件生成后转化为字节流

java 后台 Excel 文件生成后转化为字节流 java excel 使用 poi组件, HSSFWorkbook workBook = new HSSFWorkbook();  对于work...
  • shfei10100
  • shfei10100
  • 2016年12月22日 19:42
  • 1294

字节流转化成图片 java

  • 2010年06月28日 15:24
  • 581B
  • 下载

黑马程序员——Java基础---IO流(字符流、字节流、转换流、流操作规律)

简述: IO(Input Output) IO流用于处理设备之间的数据传输。(比如硬盘上的文件,内存中驻留的数据)IO流是用于操作数据的,数据的最常见体现形式是:文件。 ...
  • u011965771
  • u011965771
  • 2014年11月24日 21:47
  • 1837

字节流与字符流的区别详解

字节流与字符流 先来看一下流的概念: 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。 程序中...
  • zxman660
  • zxman660
  • 2012年08月17日 09:23
  • 142035
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java 字节流 字符流 转换流
举报原因:
原因补充:

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