黑马程序员——IO流(二)

来源:互联网 发布:淘宝网首页电脑版 编辑:程序博客网 时间:2024/06/15 00:31

------- android培训、java培训、iOS培训、.Net培训期待与您交流! ----------


装饰设计模式:

当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有对象的功能,并提供加强功能,那么自定义的该类称为装饰类

装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能

例如:

class Person{public void chifan(){System.out.println("吃饭");}}class SuperPerson{private Person p;SuperPerson(Person p){this.p=p;}public void superChifan(){System.out.println("开胃酒");p.chifan();System.out.println("甜点");System.out.println("来一根");}}class  PersonDemo{public static void main(String[] args) {Person p=new Person();//p.chifan();SuperPerson sp=new SuperPerson(p);sp.superChifan();}}


装饰与继承的区别

装饰模式比继承要灵活,避免了继承体系臃肿,而且降低了类与类之间的关系

装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能,所以装饰类和被装饰类通常都属于一个体系中的

 

读取键盘录入

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

System.in:对应的是标准输入设备,键盘

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

import java.io.*;class  ReadIn1{public static void main(String[] args) throws IOException{InputStream in=System.in;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());//清空缓冲区}elsesb.append((char)ch);}}}


 

流操作的基本规律

通过三个明确来完成。

1:明确源和目的。

源:输入流。InputStream  Reader

目的:输出流。OutputStream  Writer

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

是:字符流。

不是:字节流。

3:当体系明确后,在明确要使用哪个具体的对象。

通过设备来进行区分:

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

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

 

File

用来将文件或者文件夹封装成对象,方便对文件与文件夹的属性信息进行操作

File对象可以作为参数传递给流的构造函数

File类常见方法

1创建

boolean createNewFile()

在指定位置创建文件,如果该文件已经存在,则不创建,返回false,和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会覆盖。

boolean mkdir():创建文件夹。

boolean mkdirs():创建多级文件夹。

2删除

boolean delete():删除失败返回false。如果文件正在被使用,则删除不了返回falsel

void deleteOnExit();在程序退出时删除指定文件。

3判断

boolean exists() :文件是否存在.

isFile()isDirectory()isHidden()isAbsolute()

4获取信息

getName()getPath()getParent()getAbsolutePath() long lastModified() long length() 

 

Propertieshashtable的子类。是集合中和IO技术相结合的集合容器。

也就是说它具备map集合的特点。而且它里面存储的键值对都是字符串。

该对象的特点:可以用于键值对形式的配置文件。那么在加载数据时,需要数据有固定格式:键=值。

 

IO包中的其它类

打印流PrintWriterPrintStream,可以直接操作输入流和文件

该流提供了打印方法,可以将各种数据类型的数据都原样打印

字符打印流:PrintWriter

构造函数可以接收的参数类型:

1file对象。File

2、字符串路径。String

3、字节输出流。OutputStream

4、字符输出流,Writer

字节打印流:PrintStream

构造函数可以接收的参数类型:

1file对象。File

2、字符串路径。String

3、字节输出流。OutputStream

 

import java.io.*;class  PrintStreamDemo{public static void main(String[] args) throws IOException{BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));//PrintWriter out=new PrintWriter(System.out,true);//System.out为字节输出流,打印在控制台上//true代表自动刷新(有换行标记),没有标记的方法不能刷//把数据存到文件里PrintWriter out=new PrintWriter(new FileWriter("a.txt"),true);//刷新只对流而言String line=null;while((line=bufr.readLine())!=null){if("over".equals(line))break;//out.write(line.toUpperCase());//写在缓冲区里了,没有刷新//out.flush();//没有换行//打印流直接有打印方法println,带换行out.println(line.toUpperCase());//out.flush();}out.close();//最后一次(关闭时)刷新一次bufr.close();}}



序列流SequenceInputStream,对多个流进行合并

管道流PipedInputStreamPipedOutputStream,输入输出可以直接进行连接,通过结合线程使用

RandomAccessFile随机访问文件,自身具备读写的方法

该类不算是IO体系中子类,而是直接继承自Object。但是它是IO包中成员,因为它具备读和写功能。

内部封装了一个数组,而且通过指针对数组的元素进行操作。

可以通过getFilePointer获取指针位置,同时可以通过seek改变指针的位置。

其实完成读写的原理就是内部封装了字节输入流和输出流。

 

通过构造函数可以看出,该类只能操作文件。而且操作文件还有模式:只读r,,读写rw等。

如果模式为只读 r。不会创建文件。会去读取一个已存在文件,如果该文件不存在,则会出现异常。如果模式rw。操作的文件不存在,会自动创建。如果存则不会覆盖。

操作基本数据类型的:DataInputStreamDataOutputStream

操作字节数组的:

ByteArrayInputStream :在构造的时候,需要接收数据源,而且数据源是一个字节数组。

ByteArrayOutputStream: 在构造的时候,不用定义数据目的,因为该对象中已经内部封装了可变长度的字节数组,这就是数据目的地。

因为这两个流对象都操作的数组,并没有使用系统资源,所以,不用进行close关闭。

 

字符编码

常见的编码表:ASCIIGBKUnicodeUTF-8

字符流的出现是为了方便操作字符,更重要的是加入了编码转换

通过子类转换流来完成:InputStreamReaderOutputStreamWriter

通常涉及到字符编码转换时,需要用到转换流

转换流的编码应用:

可以将字符以指定编码格式存储、可以对文本数据指定编码格式来解读、指定编码表的动作由构造函数完成

在两个对象进行构造的时候可以加入字符集

编码:字符串变成字节数组   String-->byte[]  :  str.getBytes(charsetName);

解码:字节数组变成字符串   byte[]-->String  :  new String(byte[],charsetName);

import java.util.*;class  EncodeDemo{public static void main(String[] args) throws Exception{String s="你好";//byte[] b1=s.getBytes();//字符串变成字节数组,编码byte[] b1=s.getBytes("GBK");//GBK默认编码System.out.println(Arrays.toString(b1));//把数组b1变成字符串打印//String s1=new String(b1,"ISO8859-1");String s1=new String(b1,"UTF-8");System.out.println(s1);//对s1进行iso8859-1编码//byte[] b2=s1.getBytes("iso8859-1");//不识别中文byte[] b2=s1.getBytes("UTF-8");    //都识别中文造成的System.out.println(Arrays.toString(b2));String s2=new String(b2,"GBK");System.out.println(s2);}}


 

 


0 0
原创粉丝点击