Java基础---Java---IO流-----读取键盘录入、InputStreamReader、转换流、OutputStreamWriter、InputStreamReader
字符流:
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的更多相关文章
- JAVA之旅(二十七)——字节流的缓冲区,拷贝mp3,自定义字节流缓冲区,读取键盘录入,转换流InputStreamReader,写入转换流,流操作的规律
JAVA之旅(二十七)--字节流的缓冲区,拷贝mp3,自定义字节流缓冲区,读取键盘录入,转换流InputStreamReader,写入转换流,流操作的规律 我们继续来聊聊I/O 一.字节流的缓冲区 这 ...
- Java基础学习-三元运算符和键盘录入的基本步骤和使用
1.三元运算符的执行流程 package com.denniscui_05; /* * 三元运算符: * 关系表达式?表达式1:表达式2 * * 执行流程: * ...
- java基础之IO流(二)之字符流
java基础之IO流(二)之字符流 字符流,顾名思义,它是以字符为数据处理单元的流对象,那么字符流和字节流之间的关系又是如何呢? 字符流可以理解为是字节流+字符编码集额一种封装与抽象,专门设计用来读写 ...
- java基础之IO流(一)字节流
java基础之IO流(一)之字节流 IO流体系太大,涉及到的各种流对象,我觉得很有必要总结一下. 那什么是IO流,IO代表Input.Output,而流就是原始数据源与目标媒介的数据传输的一种抽象.典 ...
- Java基础之IO流整理
Java基础之IO流 Java IO流使用装饰器设计模式,因此如果不能理清其中的关系的话很容易把各种流搞混,此文将简单的几个流进行梳理,后序遇见新的流会继续更新(本文下方还附有xmind文件链接) 抽 ...
- 【Java基础】IO 流
IO 流 File 类 java.io.File 类是文件和文件目录路径的抽象表示形式,与平台无关. File 能新建.删除.重命名文件和目录,但 File 不能访问文件内容本身. 如果需要访问文件内 ...
- java基础53 IO流技术(转换流)
1.转换流 1.输入字节的转换流:InputStreamReader是字节流转为字符流的桥梁,可以把输入字节流转换为输入字符流 2.输出字节流的转换流:OutputStreamWriter是字符 ...
- day1 java基础回顾-IO流
IO流的分类 注:这几个类都是抽象类. IO解决问题: 解决设备与设备之间 的数据传输问题. 比如: 硬盘--->内存 内存----->硬盘 字节流: 输入字节流:---------| I ...
- Java基础-Java中23种设计模式之常用的设计模式
Java基础-Java中23种设计模式之常用的设计模式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.设计模式分类 设计模式是针对特定场景给出的专家级的解决方案.总的来说设 ...
随机推荐
- 【poj 1087 a plug for UNIX】
在大米饼的帮助下,终于找到了大米饼程序中如同大米饼一般的错误! 考点在问题转化,然后就跑一个你喜欢的最大流算法(二分图可以啵?) 再来一个例子吧: [纯手绘大米饼图片] 其中有的边权是1,否则就是in ...
- Python virtualenv 使用总结篇
一.virtualenv的安装 1.使用pip全局安装virtualenv,建议使用pip 1.3或更高版本,在1.3之前,pip没有通过SSL从PYPI下载. $ [sudo] pip instal ...
- mybatis下使用log4j打印sql语句和执行结果
转载自:https://www.cnblogs.com/jeevan/p/3493972.html 本来以为很简单的问题, 结果自己搞了半天还是不行; 然后google, baidu, 搜出来各种方法 ...
- Echarts 地图添加自定义区域
使用 Echarts 生成地图时,如果需要添加一些自定义区域,该怎么做呢?请看下面示例. 生成原始地图 index.hmtl 引入 Jquery 和 Echart <!DOCTYPE html& ...
- display:none
$("#loadimg").css("display",""); <span id="loadimg" clas ...
- C语言 递归 汉诺塔问题 最大公约数问题
函数不能嵌套定义,但能嵌套调用(在调用一个函数的过程中再调用另一个函数) 函数间接或直接调用自己,称为递归调用 汉诺塔问题 思想:简化为较为简单的问题 n=2 较为复杂的问题,采用数学归纳方法分析 ...
- brew的MAC安装
1.介绍 brew是一个软件包管理工具,类似于centos下的yum或者ubuntu下的apt-get,非常方便,免去了自己手动编译安装的不便 brew 安装目录 /usr/local/Cellar ...
- hive升级遇到的几个小问题
1.hiveserver2正常启动,但是beeline连不上服务. 我的服务是开在本机的,但是用主机名和127好像都不能访问服务了 jdbc:hive2://172.19.1.11:10000> ...
- vue2.0+ 从插件开发到npm发布
vue: V2.5.11 此篇尽量详细,清楚的讲解vue插件的开发到npm的发布,想想将你自己做的东西展示给广大"网民",心里还是有点小激动的...-^_^ 先上一下插件效果图-- ...
- 用tensorlayer导入Slim模型迁移学习
上一篇博客[用tensorflow迁移学习猫狗分类]笔者讲到用tensorlayer的[VGG16模型]迁移学习图像分类,那麽问题来了,tensorlayer没提供的模型怎么办呢?别担心,tensor ...