java IO

---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------

IO(Input Output)

1       IO流概念

IO流用来处理设备之间的数据传输

Java对数据的操作是通过流的方式

Java用于操作流的类都在IO包中

流按流向分为两种:输入流,输出流。

流按操作类型分为两种:字节流与字符流。  字节流可以操作任何数据,字符流只能操作纯字符数据,比较方便。

2       IO流常用类

字节流的抽象父类:

InputStream OutputStream

字符流的抽象父类:

Reader Writer

由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。

如:InputStream的子类FileInputStream 

如:Reader的子类FileReader

注意: InputStreamReader 是字符流, 可以从字节流中读取字符

 

3   字符流读写文件

读取文件

定义字符流关联指定文件

FileReader reader = new FileReader("Test.txt");

读取一个字符,返回int,该字符的码表值

int ch = reader.read();

关闭流,释放资源

reader.close();

写出文件

定义字符输出流关联指定文件

FileWriter writer = new FileWriter("Test.txt");

写出一个字符,接收int码表值

writer.write(97);

关闭流,释放资源

writer.close();

注意

文件路径

定义文件路径时Windows中的目录符号为“\”,但这个符号在Java中是特殊字符,需要转义。

       可以用“\\”或“/”表示。

读取文件

读取文件时必须保证文件存在,否则将抛出FileNotFoundException

写出文件

写出时文件如不存在时程序会创建新文件,如文件已存在则会清空原文件内容重新写入。

如需追加内容可调用FileWriter构造函数FileWriter(String fileName, boolean append),传入true之后则不会清空原有文件

4   字符流缓冲区读写

自定义缓冲区读写

为什么定义缓冲区

由于单个字符读写需要频繁操作文件,所以效率非常低。

我们可以定义缓冲区将要读取或写出的数据缓存,减少操作文件次数。

缓冲区读取

先定义一个数组,然后调用FileReader读取一个数组的方法。

int read(char[] cbuf)

缓冲区写出

将要写出的数据存放在数组中,调用FileWriter方法,一次写出一个数组。

void write(char[] cbuf, int off, int len)

内置缓冲区的BufferedReaderBufferedWriter

Java提供了带缓冲功能的ReaderWriter类:BufferedReaderBufferedWriter

这两个类都是提供包装功能,需要提供其他流来使用,给其他流增加缓冲功能

当我们调用BufferedReader读取数据时,程序会从文件中一次读取8192个字符用来缓冲

当我们调用BufferedWriter写出数据时,程序会先将数据写出到缓冲数组,直到写满8192个才一次性刷出到文件

5       装饰设计模式(Decorator

什么情况下使用装饰设计模式

当我们需要对一个类的功能进行改进、增强的时候

装饰模式的基本格式。

含有被装饰类的引用

通过构造函数传入被装饰类对象

和被装饰类含有同样的方法,其中调用被装饰类的方法,对其进行改进、增强

和被装饰类继承同一个类或实现同一个接口,可以当做被装饰类来使用

BufferedReaderBufferedWriter的原理。

BufferedReaderBufferedWriter都是装饰类,他们可以装饰一个ReaderWriter,给被装饰的ReaderWriter提供缓冲的功能。

就像我们用BufferedReaderBufferedWriter装饰FileReaderFileWriter,使用的读写功能还是FileReaderFileWriter的,但给这两个类的读写添加了缓冲功能。

  字节流

基本操作与字符流相同

字节流可以操作任意类型数据

 

1       字节流缓冲区读写

1 >自定义缓冲区读写

原理和字符流相同,都是为了提高效率

定义数组缓冲数据,一次读取一个数组,一次写出一个数组,减少操作文件的次数

BufferedInputStreamBufferedOutputStream

BufferedReaderBufferedWriter原理相同,都是包装类

BufferedInputStreamBufferedOutputStream包装InputStreamOutputStream提供缓冲功能

2       转换流

字符流与字节流之间的桥梁

方便了字符流与字节流之间的操作

字节流中的数据都是字符时,转成字符流操作更高效

3   标准输入输出流

System类中的成员变量:inout

它们各代表了系统标准的输入和输出设备。

默认输入设备是键盘,输出设备是显示器。

System.in的类型是InputStream.

System.out的类型是PrintStreamOutputStream的子类FilterOutputStream 的子类.

      小结

流是用来处理数据的。

处理数据时,一定要先明确数据源,或者数据目的地

数据源可以是文件,可以是键盘或者其他设备。

数据目的地可以是文件、显示器或者其他设备。

而流只是在帮助数据进行传输,并对传输的数据进行处理,比如过滤处理、转换处理等。

 

 

 

 

 

  File

 用来将文件或者文件夹路径封装成对象

方便对文件与文件夹进行操作。

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

了解File类中的常用方法。

      1 递归

函数自己调用自己。

注意:递归时一定要明确结束条件。

应用场景:

当某一功能要重复使用时。

      2 IO包中的其他类

1>序列流

SequenceInputStream

可以将多个字节输入流整合成一个流,在使用这个流读取的时候,读到第一个流的末尾时继续读第二个,第二个读到末尾则继续读第三个,以此类推,直到读到最后一个流的末尾返回-1

操作对象

ObjectOutputStream

       可以将实现了Serializable的接口的对象转成字节写出到流中

ObjectInputStream

       可以从流中读取一个ObjectOutputStream流写出的对象

2>打印流

PrintStream PrintWriter

       相比普通的OutputStreamWriter增加了print()println()方法,这两个方法可以输出实参对象的toString()方法返回值

       这两个类还提供自动flush()的功能

操作内存缓冲数组

ByteArrayInputStream:可以从一个字节数组中读取字节。

ByteArrayOutputStream:写出到字节数组(内存)中,可以获取写出的内容装入一个字节数组。通常我们用这个流来缓冲数据。

CharArrayReader:可以从一个字符数组中读取字符。

CharArrayWriter:写出字符到字符数组(内存)中,可以获取写出的内容装入一个字符数组。

3>管道流

PipedInputStream:管道输入流,可以从管道输出流中读取数据

PipedOutputStream:管道输出流,可以向管道输入流中写出数据

操作基本数据类型

DataInputStreamDataOutputStream

       可以按照基本数据类型占用空间大小读写数据

随机访问文件

RandomAccessFile

---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值