黑马程序员_IO

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

IO流:IO流用来处理设备之间的数据传输,IO流按照操作数据分为两种:字节流和字符流

IO流常用基类:字节流的抽象基类:InPutStream,OutPutStream;字符流的抽象基类:Writer,Reader

专门操作文件的Writer子类对象,FileWrite:1、创建一个FileWrite对象,该对象一被初始化,就必须要明确要操作的文件,该文件会被创建在指定的目录下,如果该目录下已经有同名文件,将被覆盖   FileWrite fw=new FileWrite(”demo.txt”),2、调用write方法,将字符串写入到流中3、flush方法,刷新流中的数据,把数据刷新到目的地中(用close方法是关闭流资源,关闭前会刷新一次流中的缓冲数据,将数据刷到目的地中,但是在此方法调用后,流关闭了,不能再使用,但是flush刷新后,还可以继续使用此流)
FileWriter(“demo.txt”,ture),后面加个true,代表着在demo.txt文件后续写
FileReader类中read()方法一次只能读一个字符
字符流的缓冲区:BufferedWriter和BufferedReader
BufferedWriter缓冲区中提供了一个跨平台的换行方法newLine(),关闭BufferedWriter缓冲区,实际上就是关闭FileWriter对象
BufferdeReader缓冲区提供了一个读一行的方法rendLine(),此方法只返回回车符之前的数据,不包含终止符;当读到末尾时返回null
readLine方法的原理:无论是读一行或者读取多个字符,其实最终都是在硬盘上一个一个的读取,所以最终使用的还是read方法一个一个的读装饰设计模式:当想要对已有的对象进行功能增强时,可以定义一个类,将已有对象传入,基于已有对象的功能并提供加强功能,那么自定义的该类就成为装饰类;装饰类通过构造方法接受被装饰的对象,并基于被装饰的对象的功能,提供更强的功能
;装饰模式比继承更加灵活,避免了继承体系臃肿,而且降低了类与类之间的关系,装饰类因为是增强已有对象,具备的功能与已有对象是相同的,只不过是提供了更强的功能,所有装饰类与被装饰类通常都属于一个体系中  继承MyReader//专门用于读取数据的类。
|--MyTextReader
|--MyBufferTextReader
|--MyMediaReader
|--MyBufferMediaReader
|--MyDataReader
|--MyBufferDataReader
  装饰:
MyReader//专门用于读取数据的类。
|--MyTextReader
|--MyMediaReader
|--MyDataReader
|--MyBufferReader
LineNumberReader和BufferedReader一样,就是多了setLineNumber设置行号和getLineNumber获取行号
字节流:InputStream   OutputStream
转换流 InputStreamReader   将字节流转换成字符流     OutputStreamWriter 将字符流转换成字节流
流操作的基本规律:流对象有很多,不知道要用哪一个?通过两个明确来完成:1、明确源和目的(源:输入流,InputStream,Reader目的:输出流,OutputStream,Writer)2、操作的数据是否是纯文本(纯文本用字符流,不是纯文本用字节流)3、当体系明确后,再明确具体使用哪个流对象。通过设备来区分:设备有:内存、硬盘、键盘;目的设备:内存、硬盘、控制台
转换流什么时候用:字符和字节之间的桥梁,通常,涉及到字符编码转换时,需要使用到转换流
IO中的File类:用来将文件或文件夹封装成对象,方便对文件和文件夹的属性信息进行操作,File对象可以作为参数传递给流的构造函数(流只能操作数据,而操作文件和文件夹用File)
Properties是hashTable的子类,也就是说它具有map集合的特点,而且它里面存储的键值都是字符串;是集合和IO技术相结合的集合容器,该集合的特点,可以用于键值对形式的配置文件
IO中的打印流:该流提供了打印方法,可以将各种数据类型的数据原样打印;字节打印流:PrintStrean,构造函数可以接收的参数类型:file对象(File)、字符串路径(String)、字节输出流(outputStream);字符输出流:PrintWriter,构造函数可以接收的参数类型:file对象(File)、字符串路径(String)、字节输出流(outputStream),字符输出流(Writer)
序列流:SequenceInputStream对多个流进行合并
操作对象:ObjectInputStream和ObjectOutputStream,被操作的对象需要实现Serializae(标记接口)注意:标记接口是个空接口,即此接口中没有方法,静态变量不能被序列化(序列化只能针对堆内存中的数据),用transient关键字修饰的变量也不能被序列化
管道流:PipedInputStream和PipedOutputStream,输入和输出可以直接进行连接,通过结合线程使用
RandomAccessFile:随机访问文件,自身具备读写的方法,通过skipBytes(int x),seek(int x)来达到随机访问。该类不算是IO体系中的子类,而是直接继承自Object,但是它是IO包中的一员,因为它具备读取和写功能,内部封装了一个数组,而且通过指针对数组的元素进行操作,可以通过getFilePointer获取指针位置,同时通过seek方法改变指针的位置;其实完成读写的原理就是内部封装了字节输入流和输出流;通过构造函数可以看出,该类只能操作文件,而且操作文件还有模式mode:r、rw等四种;而且该对象的构造函数要操作的文件不存在,会自动创建,如果存在,则不会覆盖;如果模式为r,不会创建文件,会去读取一个已经存在的文件,如果该文件不存在,则会出现异常;如果模式为rw,那么要操作的文件不存在,会自动创建,如果存在,则不会覆盖。

DataInputStream和DataOutputStream:用于操作基本数据类型的流对象

用于操作字节数组的流:ByteArrayInputStream():在构造函数的时候,需要接受数据源,而且数据源是一个字节数组;ByteArrayOutputStream():在构造的时候,不用定义数据目的,因为该对象的内部已经封装了一个字节数组,这就是数据目的地;因为这两个流对象操作的都是数组,并没有使用系统资源,所以不用进行close关闭


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值