黑马程序员_IO输入与输出

来源:互联网 发布:米尼步枪图片数据 编辑:程序博客网 时间:2024/05/24 15:42

 

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

今天刚收到基础测试通过的邮件,所以把前两天写的笔记汇总都贴上来。在java程序中,对于数据的输入和输出操作都以“流”(stream)方式进行;J2SDK提供了各种各样的“流”类,用以获取不同种类的数据。

1.File类

  File 类是IO包中唯一代表磁盘文件本身信息的类,而不是文件中的内容。

  File类定义了一些与平台无关额方法来操纵文件,例如,创建、删除文件和重命名文件。

  Java中的目录被当作一种特殊的文件使用,list方法可以返回目录中的所有子目录和文件名。

  在Unix下的路径分隔符为/,在Dos下的路径分隔符为/,Java可以正确处理Unix和Dos路径的分隔符。



  获取文件的各种属性的方法:

    list()返回所有子目录和文件名
    exists() 判断是否存在
    delete()删除
    creatNewFile() 创建新文件
    getPath()获取路径
    getParent()获取文件父目录
    getAbsolutePath()获取文件的绝对路径
    getName()获取文件名
    canRead()判断文件是否可读
    isDirectory()是否是父目录
    laseModified() 修改时间 返回long型时间值 // new Date(file.lastModified()

2.RandomAccessFile类

1)RandomAccessFile类提供了众多的文件访问方式。
2)RandomAccessFile类支持“随机访问”方式。应用:多线程下载。每个线程下载的文件大小不同,且同时读取,从文件的不同位置开始读。
3)RandomAccessFile类在随机(相对顺序而言)读写等长记录格式(文件存储的信息是一条一条的记录,例如:日志文件、员工信息单等)的文件时有很大的优势。
4)RandomAccessFile类仅限于操作文件,不能访问其他IO设备,如网络,内存映像等。

5)两种构造方法:
new RandomAccessFile(f, “nw”); //读写方式
new RandomAccessFile(f, “r”); //只读方式


方法:
skipBytes(字节数)跳到对应字节数

read(字节数)——返回值int类型

seek(字节数)绝对定位,定位到文章到第几个字节处

seekbyte(字节数)在原有定位字节基础上,跳转到对应的位置

close()关闭文件对象

read()读取数据

3.流的概念:

 

 字节流 字符流输入流InputStreamReader输出流OutputStreamWriter


一、InputStream类:用于向程序中输入数据,数据单位(8bit)

    InputStream类的方法:

    int read() ——用于获取读到的字节数遇到流的结束,返回值-1,如果读不到数据会发生阻塞

    int read(byte[] b)

    int read(byte[] b,int off,int len)

    long skip(long n)——用于包装类的流的跳转

    int available()——返回当前输入流中可读的字节数,一般用于检查流中是否有数据可读取,

                       同时也可以避免流发生阻塞 (read()方法如果未读到数据则会发生阻塞)。

    void mark(int readlimit)——在输入流中建立标记,在建立标记的位置开始计算最多还能读取多少字节的内容。

    void reset()——和mark()方法配合使用,让其指针回到以前的标记处

    boolean markSupported()—— 返回当前的流对象是否支持mark()和reset()操作

    void close()——关闭流,释放与流相关的资源



    有了垃圾回收器,为什么还要调用close方法:
       垃圾回收期只能产生类对象,而InputStream在实例化后多产生系统的类。

 



二、OutputStream类也是抽象类,也没有对应到具体的流设备,只是描述流设备输出时的共性。


    OutputStream类的方法:
    void write(int b)——将整数字节最低字节流的内容写到数据当中

    void write(byte[] b)

    void write(byte[] b.int off,int len)

    void flush()——用于将内存缓冲器的内容彻底的清空,并输出到目标IO设备当中

    void close()——关闭输出流对象


三、FileInputStream类
    创建的两种方式:
    1)FileInputStream One = new FileInputStream("路径")

    2)File f=new File("路径");FileInputStream Two = new FileInputStream(f);

    FielOutputStream类——若文件已存在,则内容会覆盖。

    PipedInputStream类PipedOutputStream类
    用于在应用程序中创建通信管道通信。主要完成线程之间的通信。

    ByteArrayInputStream与ByteArrayOutputStream类
    用于以IO流的方式来完成对字节数组内容的读写

    1、Sytstem.in 链接到键盘,是InputStream类型的实例对象。System.out 链接到显示器,是PrintStream类的实例对象。
    2、不管各种底层屋里设备用什么方式实现数据的终止点,InputStream的read方法总是返回-1来表述输入流的结束

   字符编码:
          ASCII美国标准信息交换码 一个字节 说这些数字都在0-127之间。

        unicode编码
            ISO符号统一编码,称为unicode编码
           占用两个字节,还保留两千多个数值没有用于字符编码

        utf-8编码ascii码保持原样,仍然只占用一个字节,对于其他国家的字符,utf-8使用两个或三个字节来表示。
        一字节表示:0xxxxxxx
        二字节表示:110xxxxx 10xxxxxx
        三字节表示:1110xxxx 10xxxxxx 10xxxxxx


优点:
1不出现ox00字节
2便于应用程序检测数据在传输过程中是否发生错误
3直接处理使用ascii码的英文文档
缺点:
某些字符用了三字符


utf-16编码
utf-16编码在unicode基础上进行了细节的扩充,增加了对unicode编码没有包括的字符的表示方式。
一个使用unicode编码的字符就是utf-16格式的
utf-16扩充的字符 占用四字节


处理流


1.数据流
DateOutputStream和DataInputStream提供往各种输出流对象中写入各种原始类型数据的方法。

2.缓冲流
bufferedInputStream和bufferedOutputStream
为I/O增加了内存缓冲区,具有两个目的:
1)允许java程序依次不只操作一个字节,提高的程序性能。2)有了缓冲区,使得流在执行上skip、mark、reset方法都成为可能。

BufferedReader和BufferedWrite类

BufferedReader的readLine方法依次读取一行文本

BufferedWrite的newLine方法可以想字符流中写入不同操作系统下的换行符

程序——》DataOutputStream——》BufferedOutputStream——》FileOutStream——》文件
程序《——DataInputStream《——BufferedInputStream《——FileInputStream《——文件

关闭流栈中的最上层流对象,将会自动关闭流栈中所有底层的流对象。

3.Print 输出流:
1)包括PrintStream 和PrintWriter
2)PrintStream 永远不会抛出 IOException
3)自动flush功能

setout():重新分配“标准”输出流。


4.ObjectInputStream类与ObjectOutputStream类
  直接将Object写入或者写出,其读写的对象必须实现了Serializable接口(序列化)。对象中的transient和static类型的成员变量不会被读取和写入。
1)transient:透明的 可修饰成员变量 ,在序列化的时候不考虑 transient int k = 15
2)Serializable:标记型接口,如果想把某个类的对象序列化,必须实现Serializbale接口。

……

class T implement Serializable{

  int i = 9;

 double d = 2.3;

transirent int k = 15;

}

……

 5.转换流 InputStreamReader和OutputStreamWriter,是用于将字节流转换成字符流来读写的两个类.避免频繁的在字节间进行转换,最好不要直接使用inputstreamreader和outputStreamWriter读写数据,应尽量使用BufferedReader类包装inputstreamreader,用BufferedWriter类包装outputStreamWriter.


---------------------- android培训、java培训、期待与您交流! ---------------------- 详细请查看:http://edu.csdn.net/heima