IO流

来源:互联网 发布:淘宝云客服在哪里找 编辑:程序博客网 时间:2024/06/05 03:12

1.IO流的类全在IO包中。

按方向:分为输入流和输出流。

按操作的数据:分为字节流和字符流。

字符流:字节流读取文字字节后,不直接操作而是先查指定的码表,获取对应的文字,再对这个文字进行操作,字符流=字节流+指定码表。

字节流顶层类:InputStream OutputStream(都是抽象类)

字符流顶层类:Reader Writer(都是抽象类)


2.需求:将内存中一些文字数据存储到硬盘上;

⒈创建一个可以往文件中写入数据的字符输出流对象,既然是往文件中写入数据,那么在创建输出流对象时,就要明确该文件(用于存储数据的目的地, new FileWriter("c:\\da.txt");如果该文件存在,则覆盖该文件,如果该文件不存在则创建该文件。)

⒉调用write(str)写入数据。 注:这时的数据写入到了临时存储缓冲区中,并没有直接写入文件。

⒊flush();刷新缓冲区,将缓冲区中的数据刷新到目的地。 注:字符流必须写入后刷新数据,字节流则不需要。

⒋close();写完数据后,关闭流。注在关闭之前应调用flush()刷新数据到目的地。


3.FileWriter的续写:用构造函数 new FileWriter(String fileName,boolean append)

若append为true,若该文件存在,则写入的数据到文件的末尾处,为flase则相当于默认操作。


4.字节流:字节流和字符流的操作基本一致,但字节流的写入不需要刷新,顶层父类的flush()方法由其他类来实现,而FileOutputStream也没有重写这个方法。


FileInutStream能进行文件的读取,读取的最小单元为byte或byte[],InputStream类有available():返回的是调用此方法的对象相关联的文件的字节数。

InputStream   OuputStream 也有缓冲区,字符流只能操作字符数据,字节流可以操作任意数据。


5.键盘录入和读取:

⒈System.in  是一个InputStream标准的读取流,接受来自于键盘输入或者主机环境或用户指定的另一输入源,返回的是InputStream对象,利用其read()将录入的数据进行读取;注:当read()没有读取到数据时,此方法会一直阻塞(被称为阻塞方法),System.in创建的对象只有一个,随着jvm的关闭而自动关闭,是默认的输入设备,不要使用close()关闭,一旦关闭,该程序将不能再开启一个System.in的流对象,因为此对象是唯一的。

⒉System.out 是标准输出流,返回一个PrintStream对象,她是OutputStream的一个子类,目的地是控制台,利用write()方法向控制台输出。


6.两个转换流: InputStreamReader:将字节输入流转化为字符流,也可以指定码表。

 OutputStreamWriter:将字节输出流转化为字符流,也可以指定码表。

虽然流的种类转化了,但指向的目的地并没有改变。


7.IO异常的处理方式:因为FileWriter中的构造方法都会抛出异常,但关闭资源的操作是必须执行的,可以把close()操作放到finally代码块中执行。其他的用try catch包围,而FileWriter的引用变量在try中,是一个局部变量,finally不能使用到这个变量,所以应把这个变量定义到try catch外。


8.FileReader是读取硬盘上的数据,用read()读取,read(char []ch)将关联的文件读取到字符数组上,返回每次读取的字符长度,如果达到文件末尾则返回-1.


9.缓冲流:效率高。

⒈BufferedReader: 特有方法readLine()读取一行。实现原理:使用了读取缓冲区的read(char ch[]),将读取到的字符进行缓存并判断换行标记,将标记前的缓冲数据变成字符串返回。当读取到的数据为null时,返回null,到文件末尾也返回null.

⒉BufferWriter:特有方法 newLine();换行。


10.装饰设计模式:对一组对象的功能进行增强,缓冲流就是装饰设计模式的一个例子。

特点:装饰类和被装饰类都必须同属接口或父类。


11.BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))

      BufferedWriter writer  = new BufferedWriter( new OutputStreamWriter(System.out))

两个简单写法。


12.FileWriter是OutputStreamWriter的子类,其实就是转换流加指定本机默认码表的体现,简单说:FileWriter就是操作文件的字节流+本机默认码表,可以方便操作文本文件。


13.转换流的编码解码:

用转换流可以指定编码表进行编码解码。

Reader read = new InputStreamReader( new FileInputStream(),"GBK");

若不传入码表时,中国机器默认本机环境编码是GBK。


什么时候使用转换流:⒈当流需要使用指定码表时,必须使用转换流。

     ⒉源或者目的地对应的设备是字节流,但操作的数据是字符数据,可以使用转换流。


14.Properties类:Properties类是HashTable的子类,也就是Map的子类。

特点:⒈该集合中的键和值都是字符串类型的,所以不需要指定泛型。

   ⒉集合中的数据可以保存到流中,也可以从流中获取数据。

   ⒊Properties类表示的是一个持久的属性集。

   ⒋通常该集合用于操作以键值对形式存在的配置文件。

Properties类的基本操作:

⒈存储元素: setProperty(key , value);

⒉取出元素:getProperties(key);

StringPropertyNames();返回一个Set<String>类型的集合,存储的是键。功能其实和keySet()一样。

⒊Properties集合和流对象结合的功能:

list(PrintStream ps);将属性列表输出到指定的输出流。(字节)

list(PrintWriter);将属性列表输出到指定的输出流。(字符)


load(InputStream is);将输入流的数据存入到该集合中。

load(Reader read);将输入流的数据存入到该集合中。


store(OuputStream os,String comments):将Properties集合中的键值对写入输出流的指定目的地去,comments是一个描述信息,由自己定义,这个信息使用的是ISO8859-1编码输出。


15.打印流(就是一个输出流):PrintWriter Writer的子类。

    PrintStream  InputStream的子类。

PrintStream:字节打印流,提供了打印方法,可以对多种基本数据类型值进行打印,并保持数据的变现形式,不抛IO异常。 

构造函数接收:字符串路劲,File对象,字节输出流


PrintWriter:字符打印流,实现了PrintStream中所有的print()方法,不包括写入原始字节的方法,与PrintStream类不同,如果是输出流+true,调用print() println() format()时会自动刷新。

构造函数接收:字符串路劲,File对象,输出流(字符字节都可以),输出流+true(拥有自动刷新的方法)

0 0
原创粉丝点击