黑马程序员__IO流笔记一

来源:互联网 发布:怎么能在淘宝上买东西 编辑:程序博客网 时间:2024/05/17 01:22

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

 

 

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

持久化存储指断电话数据还在

硬盘处理数据慢:寻道

内存处理数据快:寻址

 

只要是操作字符数据,应该优先使用字符流(字节流+编码表)

 

字节流的抽象基类 InputStream输入流()   OutputStream输出流()

字符流的抽象基类 Reader输入流()   Writer输出流()

 

技巧:流体系的子类对象们,都以自己所属体系作为子类后缀名,以功能名称作为前缀名。

比如AudioInputStream音频输入流

 

 

字符流

// 写入硬盘可能发生的异常和处理办法

FileWriter fw = new FileWriter("Z:\\demo.txt",true);

// Z盘根本不存在,会发生异常

// 如果当前目录下有同名文件,该文件会被覆盖

// 如果布尔型为真,则续写,否则覆盖

fw.write("abc" + System.getProperty("line.separator") +"de");

// 文件已经写满,会发生异常

fw.close();

// close方法包含了刷新缓冲区的方法flush();

// 为什么还要用flush呢,是为了防止边读边写的时候,假如电源断电,目的地什么都没有

// 可能产生的异常:windows底层关闭失败

// 资源必须得关闭,就得放在finally代码块中

 

 

FileReader fr = new FileReader("demo.txt");

char[] buf =newchar[1024];

int len = 0;

while ((len = fr.read(buf)) != -1) {

    System.out.println(new String(buf, 0, len));

}

// 如果直接是fr.read();那么返回的int表示的是字符的ASCII

// 如果读取的是字符数组,既fr.read(buf);那么返回的int是表示读取字符的个数

// 可以用(IOException e)日志文件记录发生的异常e.printStackTrace();

 

 

字符串缓冲区对应类BufferedWriter  BufferedReader

该类提供了newLine()方法获取行分隔符

其实就是封装了System.getproperty("line.separator");

缓冲区的关闭其实就是在关闭流

 

// BufferedReader用法示例

FileReader fr = new FileReader("tempfile\\buf.txt");

BufferedReader br = new BufferedReader(fr);

String line = null;

while ((line = br.readLine()) !=null) {

    System.out.println(line);

}

br.close();

 

 

关于装饰设计模式:装饰设计模式就是对原有对象进行功能和职责的增强。装饰类和被装饰类必须属于同一个体系。而虽然通过继承也能解决问题,但是继承会使体系变得臃肿,所以它比继承更为灵活。

例子

通过继承方式:

Writer

    |--TextWriter

       |--BufferedTextWriter

    |--MediaWriter

       |--BufferedMediaWrite

通过装饰设计模式

class BufferedWriterextends Writer{

           private Writer w;

           BufferedWriter(Writer w)

           {

              this.w = w;

           }

       }

 

       Writer

           |--TextWriter

           |--MediaWriter

           |--BufferedWriter //装饰类。

 

 

BufferedReader的子类LineNumberReader有设置和获取行号功能。

 

 

字节流

用字节流演示复制媒体文件

        FileInputStream fis = new FileInputStream("1.jpg");

       FileOutputStream fos = new FileOutputStream("tempfile\\1.jpg");

 

       byte[] buf =newbyte[1024]; //自定义缓冲区数组的方式。

       // byte[]buf = new byte[fis.available()];

//available()方法可以获得文件大小,但是复制文件的时候慎用,因为一下子就要开辟这么大空间,一般只用来获得文件大小

       int len;

       while ((len = fis.read(buf)) != -1) {

           fos.write(buf, 0, len);

       }

       fis.close();

       fos.close();

 

转换流

// 字节流读

FileInputStream fis = new FileInputStream("tempfile//test.txt");

// 字节流作为参数,转换成字符流。InputStreamReader将读到的字节解码为字符

InputStreamReader isr = new InputStreamReader(fis);

 

// 字节流关联的数据都是文本数据时,简化的复制文件的方式

// 如果需要从键盘读入(InputStream)或者显示在屏幕(PrintStream),可以把路径改成System.in或者

 

    BufferedReader br = new BufferedReader(new InputStreamReader(

           new FileInputStream("tempfile\\test.txt")));

    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(

           new FileOutputStream("tempfile\\purpose.txt")));

    String line = null;

    while ((line = br.readLine()) !=null) {

       bw.write(line);

       bw.newLine();

       bw.flush();

    }

    bw.close();

    br.close();

 

 

流操作规律总结:

1.     明确具体体系-à字符流还是字节流

2.     明确是读还是写。读:InputStream Reader;

写:OutputStream Writer

3.     确定数据所在具体设备,既确定具体流对象。比如是用前缀名是File的流对象。还是要从键盘输入System.in或者显示在屏幕上System.out。还是在内存中(数组:StringByteArrayCharArray)。还是到网络上Socket

4.     明确具体对象后,一定要继续明确是否需要额外功能。

1高效。Buffered

2转换编码。InputStreamReader OutputStreamWriter桥梁。

3保证数据值的表示形式。PrintWriter PrintStream

4是否需要多个源合并一个源,SequenceInputStream

5是否是操作对象,将对象序列化或者反序列化,ObjectInputStream ObjectOutputStream

6是否操作基本数据值。DataInputStream DataOutputStream

// 操作流规律应用

    //读取一个已有的默认编码的文本文件,想要将这些数据按照指定的编码UTF-8写到另一个文件中。

// 思路:

    //文本文件,--->字符流

    //有读有写--->ReaderWriter

    //数据都在硬盘上--->FileReaderFileWriter。但是目的是指定编码表,所以不能使用FileWriter

    //需要编码转换。而且是字符到字节(OutputStreamWriter),并且需要高效。

    //该转换流必须要接收一个字节流,而且还要对应的设备是硬盘,所以该对象是FileOutputStream.

 

BufferedReader br = new BufferedReader(new FileReader("a.txt"));

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(

              new FileOutputStream("b.txt"),"UTF-8"));

 

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

原创粉丝点击