




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
IO流之字节流和字符流详解IO(Input output)流,分为两种:字节流和字符流字节流的两个基类:InputStream(读)OutStream(写)字符流的两个基类:Reader(读) Writer(写)字符流写(FileWriter)和读(FileReader)写(FileWriter)我们知道既然IO流是用于操作数据的,那么数据的最常见的体现形式是:文件我们使用一个操作文件的Writer子类是FileWriter。我们要查Writer API时注意:后缀名是父类名,前缀名是是该流对象的功能。我们来首先来看看Writer基类的几种常用方法:a)public void write(String str) throws IOException: 写入字符串b)public abstract void flush()throws IOException:刷新该流的缓冲c)public abstract void close()throws IOException:关闭该流,但先刷新对于如何创建一个字符Writer流,我们来详细看看如下代码:import java.io.*;class FileWriterDemopublic static void main(String args) throws IOException/创建一个FileWriter对象,/该对象一旦被创建就必须明确要被操作的文件/而且该文件会被创建到指定目录下/如果该目录下已有同名文件,将被覆盖/其实改不就是在明确数据要存放的目的地FileWriter fw=new FileWriter(demo.txt); /调用write方法,将字符串写入到流中fw.write(abcde);/刷新流对象中的缓冲中数据/将数据刷到目的地中,即将数据保存到目的地/fw.flush();/关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据/将数据刷到目的地中/和flush区别:flush刷新后,流可以继续使用,close刷新后,流会关闭fw.close();IO异常(IOException)的处理方式:我们对与Io出现的异常不能抛,我们要自己解决,我们如何去处理一个IO异常呢?我们用代码演示一遍:import java.io.*;class IOExceptionDemo public static void main(String args) /我们首先创建类型的变量并作用于整个域FileWriter fw=null;tryfw=new FileWriter(k:/demo.txt);fw.write(xixi);catch(IOException e)/此处是对异常的处理System.out.println(catch:+e);finallytry/我们要首先判断对象是否为空,/此处对象异常不能让用户看到if(fw!=null)/close方法必须要单独try,且放在Finally语句中fw.close();catch(IOException e)我们如何对数据进行续写?我们就要使用到FileWriter的另一个构造方法。FileWriter(String fileName, boolean append):根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。创建的时候即new FileWriter(“数据目的地”,“true”); 读(FileReader)Reader有哪些常用的方法:a)public int read()throws IOException:读取单个字符b)public int read(char cbuf) throws IOException:将字符读入数组。c)public abstract void close()throws IOException:关闭该流并释放与之关联的所有资源,此处没有刷新。IO中Reader有两种方式读取:第一种:使用第一种read方法读取单个字符import java.io.*;class ReaderDemo public static void main(String args) throws IOException/创建一个文件读取流对象,和指定名称的文件相关联/要保证该文件是已经存在的。/如果不存在,会发生FileNotFoundExceptionFileReader fr=new FileReader(demo.txt);/调用读取对象的read方法/read():一次读一个字符,而且会自动往下读。/fr.read()int ch=0;while(ch=fr.read()!=-1) System.out.print(char)ch);/强制转换把int转成字符型char。fr.close();第二种:使用重载的read(char c)方法,读取数组长度的数据import java.io.*;class ReaderDemo2public static void main(String args) throws IOExceptionFileReader fr=new FileReader(demo.txt);/定义一个字符数组。用于存储读到字符/该read(char)返回的是读到字符个数char buf=new char1024;/此处最好设1024int num=0;while(num=fr.read(buf)!=-1)System.out.println(num:+num+:+new String(buf,0,num);fr.close();IO读写交互复制IO流经常涉及到文本复制动作,即读写动作,重点掌握,我们演示下两种文本复制方法:import java.io.*;class CopyOfIOpublic static void main(String args) throws IOException/copy_1();copy_2();public static void copy_1() throws IOException /第一种读写FileWriter fw=new FileWriter(D:ReaderDemo_copy.txt);FileReader fr=new FileReader(ReaderDemo.java);int num=0;while(num=fr.read()!=-1)fw.write(num);fw.close();fr.close();public static void copy_2() /第二种读写FileWriter fw=null;FileReader fr=null;tryfw=new FileWriter(D:ReaderDemo_copy2.txt);fr=new FileReader(ReaderDemo2.java);char c=new char1024;int num=0;while(num=fr.read()!=-1)fw.write(num);catch(IOException e)throw new RuntimeException(读写失败);finallyif (fw!=null)tryfw.close();catch(IOException e)if (fr!=null)tryfr.close();catch(IOException e)缓冲区读与写IO流的缓冲区的出现是为了提高流的操作效率而出现的。所以在创建缓冲区之前,必须要现有流对象写(BufferedWrite)BufferedWrite提供了一个跨平台的换行符方法:newLine();我们结合此方法看看BufferedWriter的代码的演示。import java.io.*;class BufferedWriterDemopublic static void main(String args) throws IOException/创建一个字符写入流FileWriter fw=new FileWriter(BufferedWriterDemo.txt);/将字符写入流的对象存入到缓冲区中构造方法中/缓冲去是存储文件一种效率的方式BufferedWriter bw=new BufferedWriter(fw);for(int i=0;i0)byte b=bufpos;count-;pos+;return b&0xff;return -1;public void myClose()throws IOExceptionis.close();字节流与字符流的交互读取转换流我们使用字节流的读取来读取键盘的录入,这里我们涉及到System的输入输出情况a) System.out:对应的是标准的输出设备,控制台。b) System.in:对应的标准输入设计。那么我们根据System这两种来看看IO流的读取键盘录入的两种方法:第一种:import java.io.*;class ReadIn public static void main(String args) throws IOExceptionInputStream is=System.in;StringBuilder sb=new StringBuilder();/使用可变的容器,来存放输入的字符while(true)int ch=is.read();/键盘输入读取的字节赋给chif(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();/读取完以后我们清空一次StringBuffer。elsesb.append(char)ch);第二种:我们使用的是字符流中的InputStreamReader将字节流转换成字符流,再使用装饰缓冲BufferedReader类里的readLine方法来读取键盘的输入。如:import java.io.*;class ReadIn2 public static void main(String args) throws IOExceptionInputStream is=System.in;InputStreamReader isr=new InputStreamReader(is);/将字节流转换为字符流BufferedReader br=new BufferedReader(isr);String s=null;while(s=br.readLine()!=null)if(over.equals(s)/自定义退出标签break;System.out.println(s.toUpperCase();/将输入的字符转换为大写上面的蓝色字体我们以后可以简写为:BufferedReader br=new BufferedReader(new InputStreamReader(System.in);这段代码以后是我们经常使用键盘录入的一段代码,要记熟输出转换流在字节流输出转换为字符流输出,我们就要用到OutputStreamWriter类来转换import java.io.*;class ReadIn2 public static void main(String args) throws IOException/*键盘录入*/InputStream is=System.in;InputStreamReader isr=new InputStreamReader(is);/将字节流转换为字符流BufferedReader br=new BufferedReader(isr);/*录入输出*/OutputStream os=System.out;OutputStreamWriter osw=new OutputStreamWriter(os);BufferedWriter bw=new BufferedWriter(osw);String s=null;while(s=br.readLine()!=null)if(over.equals(s)/自定义退出标签break;/System.out.println(s.toUpperCase();/将输入的字符转换为大写bw.write(s.toUpperCase();/将读取到字符的输出到控制台上bw.newLine();/换行bw.flush();/必须刷新,否则无法看不到控制台上输出的字符我们也可以将上面蓝色字体简写为:BufferedWriter bw=new BufferedWriter(new OutStreamWriter(System.in);流操作的基本规律我们常常很痛苦就是流对象有很多,不知道该用哪一个?那么我们可以通过三个明确来完成a) 明确源和目的。源:输入流。 InputStream Reader目的:输出流。Outpustream Writerb) 操作的数据是否是纯文本。i. 是:字符流ii. 不是:字节流 c) 当体系明确后,再明确要使用哪个具体的对象。通过设备来进行区分:i. 源设备:内存,硬盘,键盘ii. 目的设备:内存,硬盘,控制台举一个例子,比如我们将一个文本文件中数据存储到另一个文件中,即复制文件。源:因为是源,所以使用读取流。InputStream Reader,是不是操作文本文件呢?我们是操作文本文件的,那么我们就可以选择Reader,这样体系就明确了。接下来我们要明确要使用该体系中的哪个对象?明确设备是硬盘上的一个文本文件,Reader体系中可以操作文件的对象是FileReader。即FileReader fr =new FileReader(“a.txt”);是否提高效率,是的话我们加入Reader体系中缓冲区BufferedReader,即BufferedReader br=new BufferedReader(fr);目的:OutputStream Writer,是不是纯文本?是的话我们就使用writer,设备是什么?也是硬盘上的一个文件,那么Writer体系中可以操作文件的对象FileWriter。即FileWriter fw=newFileWriter(“a_copy.txt”);是否需要提高效率呢?是的话,我们加入Writer体系中缓冲区BufferedWriter,即BufferedWriter bw=new BufferedWriter(fw);注意:a) 当源设备是键盘录入的时候,它所对应的对象是System.in,而该对象对应的却是字节流,我们常常为了键盘的文本数据方便要转成字符流,所以我们就要用到Reader体系中的转换流,InputStreamReader,即InputStreamReader isr=new InputStreamReader(System.in),同时我们需要提高效率的话,就用BufferedReader fr=new BufferedReader(isr);b) 同样的,当我们目的设备是控制台输出的话,就使用的是对象是System.out,它所对应的字节流也需要进行转换,这时我们也要用到转换流OutputStreamWriter,即OutputStreamWriter osw=new OutputStreamWriter(System.out);同时我们需要提高效率的话就使用BufferedWriter bw=new BufferedWriter(osw);c) 还有一种特殊的情况就是当涉及到字符编码转换的时,我们就要使用到转换流,即字符和字节之间的桥梁。因为只有转换流才有指定的编码格式,。即OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream(“d.txt”),如果需要高效的话,就需要使用BufferedWriter bw=newBufferedWriter(osw);我们演示下编码转换的代码:import java.io.*;class Testpublic static void main(String args) throws IOException/我们要把键盘输入的对应字节流转换为字符流BufferedReader br=new BufferedReader(new InputStreamReader(System.in);/我们把涉及到的字符编码使用转换流来指定编码格式BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(d1.txt),UTF-8);String s=null;while(s=br.readLine()!=null)if(over.equals(s)break;bw.write(s.toUpperCase();bw.newLine();bw.flush();总结:对于流的源和目的我们基本了解如下源设备:a) 键盘:System.inb) 硬盘:FileStreamc) 内存:ArrayStream(后面ArrayStream功能讲解)目的:a) 控制台:System.outb) 硬盘:FileStreamc) 内存:ArrayStream(后面ArrayStream功能讲解)字节流和字符流的扩展应用第一个应用:我们之前学的字节流和字符流复制文本,现在我们使用System类的两个方法来达到复制文本的效果;a) public static void setIn(InputStream in): 重新分配“标准”输入流。b) public static void setOut(PrintStream out): 重新分配“标准”输出流。我们根据这两种方法来演示下复制文本的效果:import java.io.*;class Testpublic static void main(String args) throws IOExceptionSystem.setIn(new FileInputStream(ReadIn.java);/指定源文件System.setOut(new PrintStream(ReadIn_copy.txt);/指定目的文件。即要复制/我们要把键盘输入的对应字节流转换为字符流BufferedReader br=new BufferedReader(new InputStreamReader(System.in);/我们要把控制台输出的对应字节流转换为字符流BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out);String s=null;while(s=br.readLine()!=null)if(over.equals(s)break;bw.write(s.toUpperCase();bw.newLine();bw.flush();第二个应用是将异常信息日志保存到文本文件中,并且添加出现异常的时间:这里我们就要使用到异常打印信息设计IO流的方法;public void printStackTrace(PrintStream s):将此 throwable 及其追踪输出到指定的 PrintWriter。 而PrintStream有一个构造函数是public PrintStream(String fileName) throws FileNotFoundException:创建具有指定文件名称且不带自动行刷新的新打印流以及一个打印到给定文件的方法:public void
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 18910.64-2025液晶显示器件第6-4部分:测试方法带动态背光的液晶显示模块
- 计算机自动化技术试题及答案
- 材料疲劳寿命评估误差分析重点基础知识点
- 行政法学案例探讨与答案发布
- 社区火灾应急预案论文(3篇)
- 技术员考试准备试题与答案
- 森林火灾瞬间应急预案范文(3篇)
- 行政法学动态研究试题及答案
- 风险管理在企业优化决策中的应用试题及答案
- 《环保与生活》课件-第十三篇
- 项目总工程师技术负责人绩效考核表
- 2023春国开农业经济基础单元自测1-16试题及答案
- 火车广播词范本范文
- 国家电网(公共与行业知识)考试高分通关题库资料800题(附答案)
- 保卫干事事迹材料
- GB/T 6913-2023锅炉用水和冷却水分析方法磷酸盐的测定
- 精神科药物的合理使用演示
- 矿井巷道断面图册
- 热风炉安装使用说明书
- 集团公司全员安全生产职责清单(含目录)
- 分布式光伏发电项目安装验收表
评论
0/150
提交评论