Java 字节流 字符流 转换流

我们知道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来从键盘读取数据:

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里添加读取的字符
		}
	}
}

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相关。

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

	}
}
时间: 2024-10-21 02:53:55

Java 字节流 字符流 转换流的相关文章

字符流/转换流

字符流/转换流:由于字节流操作中文不方便,所以出现了. 总共有以下方法: 1.InputStreamReader.OutputStreamWriter 2.FileReader.FileWriter 3.BufferedReader BufferedWriter的普通方法 4.BufferedReader BufferedWriter的特殊方法 字符流=字节流+编码表 编码的方法: byte[] getBytes(String charsetName):使用指定的字符集合把字符编码成字节数组  

IO流----转换流、缓冲流

打开一个文本文件,另存为: Ansi就是系统默认编码(就是gbk) 建一个编码是utf-8的txt文件, 例: import java.io.FileWriter; import java.io.IOException; public class Demo01 { public static void main(String[] args) throws IOException { //确定目的地 FileWriter fw=new FileWriter("E:\\zyx\\java\\utf-

java IO 四(转换流的使用)

扯点别的: 随着年龄的慢慢增长,有些道理才明白,有些爱才感慨.家人或许希望你能立足大城市,开创一番事业.但是在内心里家人永远希望你多花点时间陪陪他们,一起吃吃饭,说说话,只要你平平安安,生活快乐,家人就感到幸福.所以多花点时间陪陪父母.陪陪爱人.陪陪孩子. 又搁置了不短的时间,继续写java io的知识,现在感觉自己的记忆力真的不行了,总是记不住东西,哎,关键还是理解不够深入,靠死记硬背是不行的看样.开搞.参考自毕向东老师的视频 第一: InputStreamReader 看看JDK里面的解释,

【IO流】22 - 字符流 - 转换流OutputStreamWrite和InputStreamReader

转换流 InputStreamReader package cn.itcast.demo; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; /* * 转换流 * java.io.InputStreamReader 继承 Reader * 字符输入流,读取文本文件 * * 字节流向字符的桥梁,将字节流转字符流 * * 读取的方法: * read() 读取1个字

Java 基础 IO流(转换流,缓冲)

一,前言 在学习字符流(FileReader.FileWriter)的时候,其中说如果需要指定编码和缓冲区大小时,可以在字节流的基础上,构造一个InputStreamReader或者OutputStreamWriter,这又是什么意思呢 二,转换流 2.1 OutputStreamWriter类 查阅OutputStreamWriter的API介绍,OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节.它的作用的就是,将字符串按照指

IO流(三)__字节流 标准输入输出流 转换流

一.字节流:FileInputStream 和FileOutputStream 基本操作和字符流类相同,没有flush,但是close还是要的 复制一个字节流文件 private static void copy_1() throws IOException { FileInputStream fis=new FileInputStream("d://17-网络编程(TCP协议-练习-上传图片客户端).avi"); BufferedInputStream bufis=new Buffe

Java——IO类,转换流简化写法

body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;} th{border: 1px solid gray; padding: 4px; background-color: #DDD;} td{border: 1px solid gray; padding: 4px;} tr:nth-child(2n){background-co

Java - io输入输出流 --转换流

转换流  转换输出流 OutputStreamWriter: 说明: /* * OutputStreamWriter 这个类的作用 * 就是指定输出流的编码格式 * 这个类的构造方法 需要传递 一个输出流的对象 * FileOutputStream fos = new FileOutputStream("e:gu.txt"); * OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8"); * * *

IO异常--缓冲流--转换流--序列化流( IO流2 )

1.IO异常的处理 JDK7前处理:使用try...catch...finally 代码块,处理异常部分 // 声明变量 FileWriter fw = null; try { //创建流对象 fw = new FileWriter("fw.txt"); // 写出数据 fw.write("莫逸风"); //莫逸风 } catch (IOException e) { e.printStackTrace(); } finally { try { if (fw != n