黑马程序员_java基础_Day2(下)

来源:互联网 发布:企业数据库的数据来源 编辑:程序博客网 时间:2024/05/22 06:33

 

 

 ----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------    

 

                                                                   黑马程序员_java基础_Day2下)


今天是2013年11月20日,为进黑马的第三篇博客!自己给自己加油!

主题:IO

 

IO的三个知识点:

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

2java对数据的操作是通过流方式实现的

3,用于操作流的对象都在IO

 

按流的方向可以分为两种:

1,输出流 2,输入流

按流的数据可以分为两种:

1,字节流 2,字符流

 

为什么要引入字符流?

无论什么数据都是二进制表示的,字节流完全可以搞定,但是其中有一部文本数据用字符流更加方便。

 

由于文本通过不同编码后,直接用字节流读文本可能会出现乱码,但是当我们用字符流时,他可以判断我们到底用的是何种编码,这里就避免读取时出现乱码。一句话就是字符流读取里面融合了编码表!

 

 

 

 

IO中的四个基类

字节流:

InputStream(读入),OutputStream(写出) 都是抽象类

字符流:

Reader(读入)   Writer(写出)

 

由这四个类产生的子类

FileInputStreamFileReaderFileOutputStream

FileWriter

 

 

flush(),close()的详解

 

Flush就是刷新内存中的内容,将其输出到文本,打个比方就是我们一般抽水,水是从管道里面到缸里的,out.flush()的作用就是将管道里的水放到缸里去。我们先将水放到管道里,再放到缸里,这样可以提高效率。如果我们拿一点水就放到缸里,这样效率就不高。

但是要注意没有reader.flush(),reader是将文本的内容写入内存,不需要再刷新内存。

 

Closeoutreader都有Close,注意凡是开启流的,都要将其关闭,

但是两者的close也有区别,outclose关闭资源前,先刷新内存。

但是reader关闭前不刷新内存,由于out写操作是临时存起来在缓冲区的。

 

 

Close的“来由”,在我们执行out.write时,java其实会调用系统的写入文件,java本身是不能执行写入文件操作的,因为windowlinux的写方式不一样,java其实会调用系统的写入文件。

 

 

 

 

IO中的小细节

 

如下:

1,

Out.write(“abc”);

Out.flush();

out.write(“de”);

Out.flush();

 

 

2,

 

Out.write(“abc”);

Out.close();

out.write(“de”);

 

 

1,没有错,最后写入的是abcde2,会出现异常,报错,因为当我们out.write(“de”);时,流已经关闭。

 


 

IO异常处理

 

1,当我们新建对象时

 

FileWrite fw=new FileWrite (“demo.txt”);

 

初始化同样调用系统资源,如在磁盘上新建文件,如果在新建过程中遇到异常,那么创建文件失败。

 

2,下面语句分析

Try

{

   Fw.write(“abc”);

}

Finally{  fw.close(); }

当 Fw.write(“abc”);发生异常时,fw.close(); 就没有意义了。

 

为了避免这种情况,我们可以这样

Finally{  

        If(fw!=null)

        fw.close(); 

       }

 

 

细读文件的读与写

 

以前写过一篇关于java的读与写的博客,这里就不详述了,只是把其中新的理解写出来。


 

博客地址:http://blog.csdn.net/wohenai791515672/article/details/9180725

 

在读取的过程中,我们为什么要定义一个读取的字符。

如下:char[] buf=new char[3]

 

Int num=reader.read(buf);//注意这里每次读取3个字符出来。

 

当我们把它装为字符串时,new String(buf,0,num);

 

举一个例子:

假设文本中有“abcdefg

 

每次读取三个字符放到buf中,

第一次读取了Int num=reader.read(buf);System.out.print(new String(buf,0,num));输出的是abc

 

第二次读取了Int num=reader.read(buf);System.out.print(new String(buf,0,num));输出的是def。那么buf中就是def代替了abc

 

第三次读取了Int num=reader.read(buf);System.out.print(new String(buf,0,num));这时num=1,就剩一个字符g,把g放到buf[0]中,这时读取结束,但buf[1],buf[2]还在。输出结果是gef

 

 

 ----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------