字符流:

FileReader

FileWriter



BufferedReader

BufferedWriter



字节流:

FileInputStream

FileOutputStream



BufferedInputStream

BufferedOutputSteam





读取键盘录入

System.out:对应的是标准输出设备,控制台

System.in:对应的是输入设备





通过键盘录入数据,当录入一行数据后,就将行数据进行打印。如果录入的数据是over,那么停止录入。

通过刚才的键盘录入一行数据并打印其大写,发现就是读一行数据的原理。也就是readLine方法,

readLine方法是字符流BufferedReader类中的方法

而键盘录入的read方法是字节流InputStream中的方法。





InputStreamReader是专门用于操作字节流的字符流对象。字节流通向节符流的桥梁,它使用指定的charset读取字节并将其解码为字符,它使用的字符集可以由名称指定位置或显示给定。每次调用InputStreamReader中的一个read方法都会导致从底层输入流读取一个或多个字节。要启用字节到字符的有效转换,可以提前从底层流中读取更多的字节。使其超过当前读取操作所须的字节。

import java.io.*;
class  ReadIn{
	public static void main(String[] args)throws IOException{
		InputStream in=System.in;
		//读取一个
		//int by=in.read();
		//System.out.println(by);
		//System.out.println('\n'+0);//读取\n的int值
		StringBuilder sb=new StringBuilder();
		while(true){
			int ch=in.read();
			if(ch=='\r')
			continue;
			if(ch=='\n')
			{
				String s=sb.toString();
				if("over".equals(s))
				break;
				System.out.println(s.toUpperCase());//变成大写打印
				sb.delete(0,sb.length());
			}
			sb.append((char)ch);
		}

	}

}
import java.io.*;
class TransStreamDemo{
	public static void main(String[] args){
		//获取键盘的录入对象
		InputStream in=System.in;
		//将字节流对象转化成字符流对象,使用转换流,InputStreamReader
		InputStreamReader isr=new InputStreamReader(in);
		//为了提高效率,将字符串进得缓冲区技术高效操作,使用BufferedReader
		BufferedReader bufr=new BufferedReader(isr);
		//也可以把上面的3句话写成一句话,这是键盘录入的最常见写法
		//BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));

		OutPutStream out=System.out;
		OutputStreamWriter osw=new OutputStreamWriter(out);
		//转换流
		BufferedReader bufr=new BufferedReader(isr);
		//也可以把上面的3句话写成一句话,这是键盘录入
		//BufferedWriter bufw=new BufferedReader(new OutputStreamWriter(System.out));

		String line=null;
		while((Line=bufr.readLine())!=null){
			if("over".equals(line))
			break;
			//System.out.println(line.toUpperCase());
			//sb.delete(0,sb.length());
			//osw.write(line.toUpperCase()+"
			//\r\n//");//这里要通过+”\r\n结束
			//osw.flush();
			//调用转换流
			bufw.write(line.toUpperCase());
			bufw.newLine();
			bufw.flush();
		}
		bufr.close();
	}
}

OutputStreamWriter它是一个字符流通向字节的桥梁,可使用指定的charset将要写入流中字符编码成字节。



1.源:键盘录入。

目的:控制台。

2.需求:想把键盘录入的数据存储到一个指定的文件中。

源:键盘。

目的:文件。

3.需求:想到把一个文件的内容打印到控制台上。

源:键盘。

目的:控制台。



流操作的基本规律:

最痛苦的是流对象有很多,不知道应该用哪 一个,通过两个明确来完成。

1.通过两个明确来完成。

源:输入流。InputStream Reader

目的:输出流。OutPutStream Writer.

2.操作的数据流是否是纯文本。

是:字符流。

不是:字节流。

3.当体系明确后,在明确要使用哪个具体对象。通过设备来进行区分。

源设备:内存,硬盘,键盘。

目的设备:内存,硬盘,控制台。

1.将一个文体文件中数据存储到另一个文件中,复制文件。

源:因为是源,所以使用读数据。InputStream Reader

---是不是操作文本文件。

是!这时就可以选择Reader

这样体系就明确了。

---接下来明确该体系中属于哪一个对象。

明确设备:硬盘,上一个文件。

Reader体系中可以操作文件的对象是FileReader

---是否需要提高效率:是!加入Reader体系中缓冲区 BufferedReader.





FileReader fr=new FileReader("a.txt");

BufferedReader bufr=new BufferedReader(fr);





目的:OutputStream Writer

是否为纯文本。

是!Writer.

设备:键盘,一个文件。

Writer体系中可以操作文件的对象FileWriter

是否需要提高效率:是!加入Reader体系中缓冲区 BufferedWriter.

FileWriter fw=new FileWriter("b.txt");

BufferedWriter bufw=new BufferedWriter(fw);





2.需求:将键盘录入的数据保存到一个文件中,这个需求中有源和目的存在。

那么分别分析

源:InputStream Reader

是不是纯文本?是!Reader



设备:键盘。对应的对象是System.in

不是选择Reader吗?System.in对应的不是字节流吗?

为了操作键盘的文本数据方便,转成字符操作是最方便的。

所以既然明确了Reader,那么就将System.in转换成字符流。用了Reader体系中转换流,InputStreamReader isr=new InputStreamReader(System.in);



需要提高效率么?需要!BufferedReader

BufferedReader bufr=new BufferedReader(isr);



目的:OutputStream Writer

是否存在文本?是!Writer

设备:硬盘。一个文件,使用FileWriter.

FileWriter fw=new FileWriter("c.txt");

需要提高效率么?需要

BufferedWriter bufw=new BufferedWriter(fw);

import java.io.*;
class TransStreamDemo{
	public static void main(String[] args)throws IOException{

		//这是键盘录入的最常见写法
		//需求3,把1.java中的数据读到控制台上
		BufferedReader bufr=new BufferedReader(new InputStreamReader(new FileInputStram("1.java")));

		BufferedWriter bufw=new BufferedReader(new OutputStreamWriter(System.out));
		//需求2
		BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in);

		//把输入的文字写到2.txt中
		BufferedWriter bufw=new BufferedReader(new OutputStreamWriter(new FileOutStream("2.txt"));

		String line=null;
		while((Line=bufr.readLine())!=null){
			if("over".equals(line))
			break;
			bufw.write(line.toUpperCase());
			bufw.newLine();
			bufw.flush();
		}
		bufr.close();
	}
}

--------------------------------

扩展:想要把录入的数据按指定的编码表,将数据指定到文件中。转换流的由来,就是因为它里面可以使用编码表。



目的:OutputStream Writer

是否存在文本?是!Writer

设备:硬盘。一个文件,使用FileWriter.

但是FileWriter是使用的默认编码,GBK

但是在存储时,需要加入指定的编码表UTF-8,而指定的编码表只有转换流可以指定。

所以要使用的对象是OutputStreamWriter.

而转换流对象要接收一个字节输出流。而且还可以操作的文件的字节输出流。FileOutputStream



OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("d.txt")."UTF-8");

需要高效么? 需要

BufferedWriter bufw=new BufferedWriter(osw);

特别提醒一下:转换流什么时候使用,字符和字节之间的桥梁,通常,涉及到字符编码转换时。需要用到转换流

代码如下:

import java.io.*;
class TransStreamDemo2{
	public static void main(String[] args)throws IOException{

		//这是键盘录入的最常见写法

		BufferedReader bufr=new BufferedReader(new InputStreamReader(new InputStramReader(System.in)));

		BufferedWriter bufw=new BufferedReader(new OutputStreamWriter(new FileOutputStream("d.txt"),"UTF-8");
		//如上面的文件是uft-8文件,用FFileReader不能能其读取,因为FileReader默认只读取GBK编码。所以这个时候要用InputStreamReader(转换流)来读取。InputStreamReader("d.txt","utf-8")指定编码表

		String line=null;
		while((Line=bufr.readLine())!=null){
			if("over".equals(line))
			break;
			bufw.write(line.toUpperCase());
			bufw.newLine();
			bufw.flush();
		}
		bufr.close();
	}
}

Java基础---Java---IO流-----读取键盘录入、InputStreamReader、转换流、OutputStreamWriter、InputStreamReader的更多相关文章

  1. JAVA之旅(二十七)——字节流的缓冲区,拷贝mp3,自定义字节流缓冲区,读取键盘录入,转换流InputStreamReader,写入转换流,流操作的规律

    JAVA之旅(二十七)--字节流的缓冲区,拷贝mp3,自定义字节流缓冲区,读取键盘录入,转换流InputStreamReader,写入转换流,流操作的规律 我们继续来聊聊I/O 一.字节流的缓冲区 这 ...

  2. Java基础学习-三元运算符和键盘录入的基本步骤和使用

    1.三元运算符的执行流程   package com.denniscui_05; /*  * 三元运算符:  *         关系表达式?表达式1:表达式2  *  * 执行流程:  *      ...

  3. java基础之IO流(二)之字符流

    java基础之IO流(二)之字符流 字符流,顾名思义,它是以字符为数据处理单元的流对象,那么字符流和字节流之间的关系又是如何呢? 字符流可以理解为是字节流+字符编码集额一种封装与抽象,专门设计用来读写 ...

  4. java基础之IO流(一)字节流

    java基础之IO流(一)之字节流 IO流体系太大,涉及到的各种流对象,我觉得很有必要总结一下. 那什么是IO流,IO代表Input.Output,而流就是原始数据源与目标媒介的数据传输的一种抽象.典 ...

  5. Java基础之IO流整理

    Java基础之IO流 Java IO流使用装饰器设计模式,因此如果不能理清其中的关系的话很容易把各种流搞混,此文将简单的几个流进行梳理,后序遇见新的流会继续更新(本文下方还附有xmind文件链接) 抽 ...

  6. 【Java基础】IO 流

    IO 流 File 类 java.io.File 类是文件和文件目录路径的抽象表示形式,与平台无关. File 能新建.删除.重命名文件和目录,但 File 不能访问文件内容本身. 如果需要访问文件内 ...

  7. java基础53 IO流技术(转换流)

    1.转换流 1.输入字节的转换流:InputStreamReader是字节流转为字符流的桥梁,可以把输入字节流转换为输入字符流    2.输出字节流的转换流:OutputStreamWriter是字符 ...

  8. day1 java基础回顾-IO流

    IO流的分类 注:这几个类都是抽象类. IO解决问题: 解决设备与设备之间 的数据传输问题. 比如: 硬盘--->内存 内存----->硬盘 字节流: 输入字节流:---------| I ...

  9. Java基础-Java中23种设计模式之常用的设计模式

    Java基础-Java中23种设计模式之常用的设计模式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一.设计模式分类 设计模式是针对特定场景给出的专家级的解决方案.总的来说设 ...

随机推荐

  1. ●BOZJ 1927 [Sdoi2010]星际竞速

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1927 题解: 显然是个DAG 建图和有向图最小路径覆盖的建图有些相似. 都是拆点为 u u' ...

  2. 【USACO】又买饲料 单调队列dp

    题目描述 约翰开车回家,又准备顺路买点饲料了(咦?为啥要说“又”字?)回家的路程一共有 E 公里, 这一路上会经过 N 家商店,第 i 家店里有 F i 吨饲料,售价为每吨 C i 元.约翰打算买 K ...

  3. hdu 2825 aC自动机+状压dp

    Wireless Password Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  4. bzoj1858[Scoi2010]序列操作 线段树

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 3079  Solved: 1475[Submit][Statu ...

  5. [bzoj省选十连测推广赛2]T2七彩树

    抄自:http://blog.csdn.net/coldef/article/details/61412577 当时看了就不会,看了别人的题解不懂怎么维护,最后抄了个代码....... 给定一棵n个点 ...

  6. 使用JAXB解析xml文件(二)

    前面一章简单演示了JAXB的用法,这个章节主要梳理一下JAXB常见的几个注解 1.@XmlRootElement 用于类级别的注解,对应xml的跟元素,常与 @XmlType 和 @XmlAccess ...

  7. 关于InnoDB的读写锁类型以及加锁方式

    (本文为了方便,英文关键词都都采用小写方式,相关知识点会简单介绍,争取做到可以独立阅读) 文章开始我会先介绍本文需要的知识点如下: innodb的聚簇索引(聚集索引)和非聚簇索引(二级索引.非聚集索引 ...

  8. 谷歌开源的TensorFlow Object Detection API视频物体识别系统实现教程

    视频中的物体识别 摘要 物体识别(Object Recognition)在计算机视觉领域里指的是在一张图像或一组视频序列中找到给定的物体.本文主要是利用谷歌开源TensorFlow Object De ...

  9. C语言程序设计第五次作业——循环结构(1)

    一.改错题 1.题目 输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉.计算公式如下:c = 5×( ...

  10. JavaBean toString方式

    package object; import java.util.Date; public class ReportDataQo implements java.io.Serializable { p ...