黑马程序员——Java基础——IO(一)
来源:互联网 发布:php aes对称加密算法 编辑:程序博客网 时间:2024/05/16 15:22
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
一、IO流
要把数据逐一输出到某个设备中,或者从某个设备中逐一读取数据,不管输入输出设备是什么,我们要用统一的方式来完成这些操作,用一种抽象的方式进行描述,这个抽象描述方式起名为IO流。Java对数据的操作是通过流的方式,用于操作流的对象都在IO包中。
流按流向分为:输入流和输出流。
流按操作数据分为两种:
字符流:抽象基类Reader,Writer。字符流只用于处理文字数据,原理是字节流读取文字字节数据后,不直接操作而是先查指定的编码表,获取对应的文字,再对这个文字进行操作。
字节流:抽象基类:InputStream,OutputStream。基本操作与字符流类相同。但它不仅可以操作字符,还可以操作其他媒体文件。
二、字符流
1.字符流的写入
import java.io.FileWriter;import java.io.IOException;public class WriterDemo {public static void main(String[] args) {//创建一个FileWriter对象并指定文件//该目录下有同名文件会被覆盖FileWriter fw = null;try{fw = new FileWriter("demo.txt");//往字符流中写入数据fw.write("java01");}catch(IOException e){e.printStackTrace();}//关闭资源,刷新流中缓冲的数据finally{try{if(fw!=null)fw.close();}catch (IOException e){e.printStackTrace();}}}}
2.字符流的读取
import java.io.FileReader;import java.io.IOException;public class ReaderDemo {public static void main(String[] args) throws IOException {read1();System.out.println("----------");read2();}public static void read1() throws IOException{//创建FileReader对象,指定要读取的文件//如果不存在,会发生FileNotFoundExceptionFileReader fr = new FileReader("demo.txt");//第一种读取方式,使用read()方法//每次读一个字符,并自动向下读取//读取到结尾返回-1int num = 0 ;while((num = fr.read())!=-1){System.out.println((char)num);}fr.close();}public static void read2() throws IOException{//创建FileReader对象,指定要读取的文件//如果不存在,会发生FileNotFoundExceptionFileReader fr = new FileReader("demo.txt");//第二种读取方式,使用int read(char[] cbuf,int off,int len)方法//创建一个字符数组,将读取到的字符先存入数组当中//返回读取的字符数,如果已到达流的末尾,则返回 -1 char [] ch = new char[1024];int num = 0 ;while((num = fr.read(ch))!=-1){System.out.println(new String(ch,0,num));}fr.close();}}
总结练习:复制文本文件
import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class CopyText {public static void main(String[] args) {FileWriter fw = null;FileReader fr = null;try {//创建字符写入流,指定目的地fw = new FileWriter("demo1.txt");//创建字符读取流,关联指定文件fr = new FileReader("./src/test/day4/MapDemo.java");//建立一个字符数组,临时存储读取流读取的数据,并使用写入流写入指定文件char[] ch = new char[1024];int num = 0;while ((num = fr.read(ch)) != -1) {fw.write(ch, 0, num);}} catch (IOException e) {e.printStackTrace();} finally {if (fw != null)try {fw.close();} catch (IOException e) {e.printStackTrace();}if (fr != null)try {fr.close();} catch (IOException e) {e.printStackTrace();}}}}
3.字符流的缓冲区
缓冲区的出现是为了提高流的操作效率而出现的,所以在创建缓冲区之前,必须要先有流对象,作为参数传递给缓冲区的构造函数。
通过缓冲区复制文本文件
import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class BufferedCopy {public static void main(String[] args) {//创建缓冲区,将文本写入字符输出流,缓冲各个字符//创建缓冲区,从字符输入流中读取文本,缓冲各个字符BufferedWriter bfw = null;BufferedReader bfr = null;try {//将需要提高效率的流对象作为参数传递给缓冲区的构造函数bfw = new BufferedWriter(new FileWriter("demo2.txt"));bfr = new BufferedReader(new FileReader("./src/test/day4/MapDemo.java"));//读取一个文本行将其写入流中,再写入一个行分隔符,需要刷新缓冲。String str = null;while((str = bfr.readLine()) != null){bfw.write(str);bfw.newLine();bfw.flush();}} catch (IOException e) {e.printStackTrace();} finally {if (bfw != null)try {bfw.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}if (bfr != null)try {bfr.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
明白了BufferedReader类中特有方法readLine的原理后,可以自定义一个类中包含一个功能和readLine一致的方法来模拟一下BufferedReader
import java.io.FileReader;import java.io.IOException;import java.io.Reader;class MyBuffer extends Reader{private Reader r ;MyBuffer(Reader r){this.r = r ;}//模拟一个readLine方法public String myReadLine() throws IOException{//定义一个临时容量存储读到的每个字符并判断//因为每行结尾是\r\n,读到\r接着往下判断,读到\n就到了结尾StringBuilder sb = new StringBuilder();int num = 0 ;while((num = r.read())!=-1){if(num == '\r')continue;if(num == '\n')return sb.toString();elsesb.append((char)num);}if(sb.length()!=0)return sb.toString();return null;}//覆盖Reader中的抽象方法@Overridepublic int read(char[] cbuf, int off, int len) throws IOException {// TODO Auto-generated method stubreturn r.read(cbuf, off, len);}@Overridepublic void close() throws IOException {// TODO Auto-generated method stubr.close();}}public class MyBufferedReader {public static void main(String[] args) throws IOException {//使用自定义的缓冲区,过程与BufferedReader一样MyBuffer mb = new MyBuffer(new FileReader("./src/test/day4/CollectionDemo.java"));String str = null;while((str = mb.myReadLine()) != null){System.out.println(str);}mb.close();}}
三、装饰设计模式
装饰模式是一种比较常见的模式,动态地给一个对象添加一些额外的职责。是对继承的有力补充,解决类膨胀的问题,降低类与类之间的耦合,具有非常好的扩展性。
//定义人的类,具有一个吃饭的方法class Person{public void eat(){System.out.println("吃饭");}}//定义西方人的类,用装饰的方式增强Person类class Western{private Person p ; Western(Person p){this.p = p;}public void eat(){System.out.println("开胃酒");p.eat();System.out.println("甜点");}}//定义中国人的类,用继承的方式增强Person类class Chinese extends Person{public void eat(){super.eat();System.out.println("喝汤");}}public class DecoratorDemo {public static void main(String[] args) {Person p = new Person();Western w = new Western(p);w.eat();System.out.println("-----------");Chinese c = new Chinese();c.eat();}}
0 0
- 黑马程序员——Java基础——IO(一)
- 黑马程序员——Java基础---IO流(一)
- 黑马程序员——java基础--IO流(篇一)
- 黑马程序员——JAVA基础-IO流(一)
- 黑马程序员——Java基础---IO(一)
- 黑马程序员——java基础-IO(一)
- 黑马程序员——Java基础:IO(一)
- 黑马程序员——Java基础--IO流(一)
- 黑马程序员——Java基础--IO(一)
- 黑马程序员——Java基础---IO(一)
- 黑马程序员——Java基础--------IO流(一)
- 黑马程序员——JAVA基础----IO流(一)
- 黑马程序员——Java基础---IO
- 黑马程序员——java基础--IO
- 黑马程序员——Java基础---IO
- 黑马程序员 Java基础——IO
- 黑马程序员—Java基础—IO
- 黑马程序员——java---IO(一)
- oracle 10g正则表达式REGEXP_LIKE用法
- 数据挖掘学习路线
- Spring MVC学习------------WebApplicationContext
- Source Insight基本使用和快捷键 http://www.cnblogs.com/mengdd/p/3506526.html
- 杭电诡异的楼梯,参考了大神的代码,整理了好久的思路才做出来
- 黑马程序员——Java基础——IO(一)
- Haproxy状态总结
- linux下core文件的调试
- 步步为营(八)常用数据结构(1)STL-List(双端链表)
- Hibernate many2many映射关系
- STP生成树协议实例详解
- Java网络编程基础
- 初级程序员避免错误的14个诀窍
- Android之媒体库(一)