• Java I/O系统


    File 类

    File file = new File("./"); 表示当前路径,“/”可以省略

    File fille = new File("../");表示上级路径,“/”不可省略

    list() ,list(FilenameFilter ff),listFiles(),listFiles(FilenameFilter) 前两个返回Sting,后两个返回File对象

    输入和输出

    输入输出字节流

    InputStream 抽象类

      ByteArrayInputStream

      ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪 read 方法要提供的下一个字节。

      关闭 ByteArrayInputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException

      构造方法:ByteArrayInputStream(Byte [] bytes);

      可以一次性读取一个字节,也可以读取一个字节数组

      FileInputStream 文件读入字节流

      FileInputStream 从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。

      FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader

      构造方法可以传入文件名或者文件对象

      ObjectInputStream

      ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化

      FilterInputStream

        DataInputStream

        BufferedInputStream 

        BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 markreset 方法的能力。在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,  

        可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。mark 操作记录输入流中的某个点,reset 操作使得在从包含的输入流中获取新字节之前,再次读取自最后一次 mark 操作后读取

        的所有字节。

    OutputStream

      ByteArrayOutputStream

      此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray()toString() 获取数据。

      关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException

      构造方法:ByteArrayOutputStream(int size) 可以通过size指定初始大小,也可以不指定

      FileOutputStream 文件输出字节流

      文件输出流是用于将数据写入 FileFileDescriptor 的输出流。文件是否可用或能否可以被创建取决于基础平台。特别是某些平台一次只允许一个 FileOutputStream(或其他文件写入对象)打开文件      

      进行写入。在这种情况下,如果所涉及的文件已经打开,则此类中的构造方法将失败。

      FileOutputStream 用于写入诸如图像数据之类的原始字节的流。要写入字符流,请考虑使用 FileWriter

      ObjectOutputStream 

      ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream,要求被写入对象必须实现Serializable接口

      构造方法中需提供一个OutputStream子类对象

      FilterOutputStream

        DataOutputStream

        BufferOutputStream

        PrintStream 

        1.可以文件对象为参数,但是不会自动刷新(自动刷新是指调用 printlnprintfformat 的其中一个方法时或者遇到' '时,注意printWriter只有前三个方法会触发自动刷新),需调用flush()手动刷  

        新,且不可以指定字符集

        2.以OutputStream为参数,可以设置自动刷新,也可以指定字符集

    输入输出字符流  (用InputStreamReader OutputStreamWriter 指定字符集)

    Reader 可以read字符到指定字符数组

      BufferedReader  传入Reader子对象,可读取一个字符或者一行

      InputStreamReader 只能接受Inputstream 对象

        FileReader 构造方法传入文件对象或者文件名,不能指定字符编码,使用默认编码

      StringReader 不知何用……

    Writer 可以write String

      BufferedWriter 可写入单个字符或者字符数组的一部分或则字符串的一部分

      OutputStreamWriter 只能接受Outputstream 对象

        FileWriter  构造方法传入文件对象或者文件名,不能指定字符编码,使用默认编码(也许是为了方便)

      StringWriter

      PrintWriter 和PrintStream差不多,不过是以字符为基本单位(两个字节,uniocde字符),不过其write方法可以直接写入字符串,然而并没有什么卵用,print写啥都可以……

    有关于flush()方法:调用flush()表示将流中的数据写入或读取到目表位置,在close()流之前会自动调用一次flush()

    重定向标准输入输出流:setIn(InputStream in) setOut(PrintStream out);

    New I/O (nio)

    速度比io更快  通过通道和缓冲器协调工作  缓冲器是中间代理 可以从通道取得数据或者向通道发送数据

    缓冲器 Buffer

    三个关键词:容量,限制,位置

    缓冲区的容量 是它所包含的元素的数量。缓冲区的容量不能为负并且不能更改。

    缓冲区的限制 是第一个不应该读取或写入的元素的索引。缓冲区的限制不能为负,并且不能大于其容量。

    缓冲区的位置 是下一个要读取或写入的元素的索引。缓冲区的位置不能为负,并且不能大于其限制。

    易混淆方法:clear()  flip()  rewind()

    • clear() 使缓冲区为一系列新的通道读取或相对放置 操作做好准备:它将限制设置为容量大小,将位置设置为 0。

    • flip() 使缓冲区为一系列新的通道写入或相对获取 操作做好准备:它将限制设置为当前位置,然后将位置设置为 0。

    • rewind() 使缓冲区为重新读取已包含的数据做好准备:它使限制保持不变,将位置设置为 0。

     将数据put进buffer后,position为数据长度,limit为容量

    在write前需将position置为0,limit置为数据长度,所以调用flip()

    write后position和limit均为数据长度

    在read前需将position置为0,limit置为容量,所以调用clear()

    read后position为数据长度,limit为容量!!!!

     !!!在read数据到buffer后调用flip以读取其中数据  buffer中数据write到channel后调用clear以供下次数据读入

    基础缓冲器 ByteBuffer Buffer的子类   抽象类

    可以通过static方法allocate(int size)方法(读入),或者通过static方法wrap(byte [] bytes)将已存在字节数组包装到Buffer中(写出)来取得Buffer的实现

    通道 Channel 接口

    对于文件操作使用FileChannle ,通过FileInputStream(读入),FileOutputStream(写出),RadomAccessFile(修改)的getChannel()方法取得实例

    Fis channel.read(ByteBuffer bb) 从channel中读取数据到bb中,可以指定开始位置

    Fos channel.write(ByteBuffer bb)将bb中的数据写入channel中

    Raf channel.position() 可以返回文件位置或者设置其当前位置

    in.transferTo(0,in.size(),out) 或 out.transferFrom(in,0,in.size()) 可以很方便的将一个文件中的内容写出到另一个文件中

    数据的转换

    不能直接将buffer.asCharBuffer()将字节缓冲转换为字符缓冲;将字节转换成字符前编码,在将其在缓冲器输出时解码;可以通过Charset类实现

    ByteBuffer bb = ByteBuffer.allocate(20);
            Charset cs = Charset.forName("utf-8");
                FileChannel out = new FileOutputStream(new File("xiao.txt")).getChannel();
                FileChannel in = new FileInputStream(new File("xiao.txt")).getChannel();
                out.write(cs.encode("我事先哦"));
    
                in.read(bb);
                bb.flip();
                System.out.println(cs.decode(bb).toString() + "tail");

    通过Charset.forName("charsetName")得到Charset对象,然后调用其decode(ByteBuffer bb)或encode(String str)方法进行解码或编码,解码得到CharBuffer,编码得到ByteBuffer

    如果直接用buffer.array()取得数组的话会将buffer中未填充满的空字节取出来,可以利用buffer的remaining()方法判断position与limit间有多少字节(一定要在read后面调用),再这些字节取出来,这样就没有空白字节,比如get(byte [])就很就很方便

    文件的压缩  GZIP 和 ZIP 压缩都是以字节为单位

    GZIP  适用于对单个文件的压缩

    使用GZIP来包装一个OutputStream或者InputStream来实现文件的压缩或者解压

    ZIP  适用于对文件夹等多个文件的压缩

  • 相关阅读:
    Codeforces D
    Codeforces 899E
    Codeforces 898F
    算法笔记--字符串hash
    算法笔记--归并排序
    Codeforces D
    Codeforces 101628A
    牛客练习赛7 E 珂朵莉的数列
    算法笔记--树的直径 && 树形dp && 虚树 && 树分治 && 树上差分 && 树链剖分
    Codeforces 895C
  • 原文地址:https://www.cnblogs.com/xiao-ji-xiang/p/9768378.html
Copyright © 2020-2023  润新知