美文网首页
Java入门:IO

Java入门:IO

作者: 我的袜子都是洞 | 来源:发表于2018-12-14 18:10 被阅读3次

    IO

    I(Input)指从设备上输入数据到程序中;
    O(Output)指从程序中向设备中输出数据;
    IO是相对于程序而言的。

    File类

    操作文档和目录。FIle类以一种与平台无关的方式描述一个文件或目录对象的属性。

    File类功能

    • 获取文件或目录的各种属性信息
    • 创建目录
    • 对文件或目录改名
    • 列出一个目录下所有的文件和子目录

    创建File类的方式

    • File(String pathname):根据文件名创建一个File类对象
    • File(File parent,String child):根据parent目录和child文件名构建一个File对象
    • File(String parent,String child):根据字符串parent目录和child文件名构建一个File对象
    • File(URI uri):根据uri创建一个File对象

    Windows和Linux存在路径表示方式的区别,Windows下用\分割路径,所以pathname里需要用\\分割路径,第一个\是转义字符。Linux是/没有问题。

    File类常用方法

    • boolean createNewFile():根据文件路径(构造方法传进来的路径),创建一个文件。如果文件存在会创建失败。
    • boolean mkdirs():创建目录
    • boolean delete():删除文件
    • boolean exists():判断是否已经存在该文件或文件夹
    • File[] list():列出目录中的所有文件和文件夹,可以接受FilenameFilter参数,该参数可以只列出符合条件的文件。在FilenameFilter接口里包含一个accpet(File dir,String name)方法,该方法将依次对指定File的所有子目录,子文件进行迭代。

    来个新鲜的栗子:列出指定目录下名称包含java的文件或文件夹
    过滤文件名称的类Java_Filter.java

    Java_Filter.java

    包含当前main类listFiles.java

    listFiles.java

    流是Java中输入/输出的抽象表述。
    程序想要访问内存、硬盘、网络等IO目的地,全部通过IO流的方法就可以完成,统一了访问方法。
    根据数据流方向的不同,可以将数据分为输入流和输出流。
    输入流只能从中读取数据,而不能向其写数据;输出流只能向其写出数据,而不能从中读取数据。

    字节流
    假设硬盘中有数据a中bcd,其中a用一个字节表示,字用两个字节表示,bcd分别都用一个字节表示,字节输入流,一次只从硬盘上读取一个字节,遇到字需要读取两次,数据a中bcd一个6个字节,需要读6次。
    字节流传送的是字节数据(byte)。

    字符流
    而字符输入流,一次读取一个字符,字也是一个字符,使用字符输入流,则之需要读取5次。
    字符流传送的是字符数据(char)。

    流是一个逻辑概念,它把各种都写操作统一起来。一个字节输入流指向一个字节序列,可从中一次读出字节,用户不必关心它的内部结构、来源。一个字节输出流,可向其依次写入字节,它的去向和内部结构用户同样不必关心。

    字节输入流

    • FileInputStream:表示指向文件的字节输入流
    • ByteArrayInputStream:表示指向内存中的byte数组的字节流
    • ObjectInputStream:用于读取对象
    • FilterInputStream:表示过滤器流
    • DataInputSteam:用于从流中读取基本类型的数据
    • BufferedStream:用于给流增加缓冲的功能

    InputStream是字节输入流的顶层父类。
    InputStream提供的三个基本的read方法:

    • int read():读取一个字节
    • int read(byte[] buffer):读取数据到buffer数组中
    • int read(byte[] buffer,int offset,int length):读取数据到buffer数组中的指定位置。

    字节输出流

    OutputStream为字节输出流的顶层父类。

    • FileOutputStream:表示输出到文件的字节输出流
    • ByteArrayOutputStream:表示输出到内存的byte数组的字节流
    • ObjectOutputStream:表示对象输出流,用于将对象写入到流中
    • FilterOutputStream:表示过滤器输出流
    • DataOutputStream:用于向流中写入基本类型的数据
    • BufferedOutputStream:用于给流增加缓冲的功能

    字节输出流OutputStream,用来向流中写入数据。OutputStream是所有字节输出流的顶层父类。
    OutputStream类提供的三个基本write方法:

    • void write(int c)
    • void write(byte[] buffer)
    • void write(byte[] buffer,int offset,int length)

    其他方法:

    • void close():关闭流
    • void flush():将流中的数据输出

    下面一个例子,实现了文件复制功能,综合了输入流输出流和缓存流的知识:


    小栗子

    序列化
    Java中,很多数据是以对象的方式存在,程序运行后,希望将这些数据储存,以供下次使用,可以使用ObjectInputStream、ObjectOutputStream来做到。将对象写入流中,这个过程称为序列化,写入流中的对象必须要实现接口Serializable,才能对象序列化。

    ObjectOutputStream主要方法:

    • writeObject(Object obj):将对象写入流中
    • flush():将缓冲输出
    • close():关闭流

    ObjectInputStream主要方法:

    • readObject():从流中读取一个对象
    • close():关闭流

    字节流

    字节流一次读取一个字节的数据,而字符流一次读取一个字符的数据。比如中文,一个字符占用两个字节,使用字节流读取,就会成乱码,而用字符流就可以正常显示。

    字符输入流的类
    Reader类为字符输入流的顶层父类,子类如下:

    • StringReader:表示从内存中的String对象中读取数据的字符输入流
    • CharArrayReader:表示从内存中的一个Char数组中读取的字符输入流
    • InputStreamReader:表示一个字节流转换为字符流的工具流
    • FileRead:表示指向文件的字符输入流
    • BufferedReader:表示给字符输入流增加缓冲功能的字符流

    Reader类的三个基本方法:

    • int read():读取一个字符的数据
    • int read(char[] cbuf):将字符数据读取到cbuf数组中
    • int read(char[] cbuf,int offset,int length):将字符数据读取到cbuf数组中从offset处开始写入,写length个字符

    Reader的其他方法:

    • void close():关闭流
    • boolean ready():判断流是否就绪可用
    • skip(long n):从当前位置跳过n个字符不读
    • void reset():关闭流

    使用Reader的栗子:


    Reader的栗子

    相关文章

      网友评论

          本文标题:Java入门:IO

          本文链接:https://www.haomeiwen.com/subject/huzghqtx.html