• Java io概述


    内容来源:http://ifeve.com/java-io/

    Java IO 概述

    输入流可以理解为向内存输入,输出流可以理解为从内存输出

    Java的IO包主要关注的是从原始数据源的读取以及输出原始数据到目标媒介。以下是最典型的数据源和目标媒介:

    • 文件
    • 管道
    • 网络连接
    • 内存缓存
    • System.in, System.out, System.error(注:Java标准输入、输出、错误输出)

    Java IO的用途和特征

    Java IO中包含了许多InputStream、OutputStream、Reader、Writer的子类。这样设计的原因是让每一个类都负责不同的功能。这也就是为什么IO包中有这么多不同的类的缘故。各类用途汇总如下:

    • 文件访问
    • 网络访问
    • 内存缓存访问
    • 线程内部通信(管道)
    • 缓冲
    • 过滤
    • 解析
    • 读写文本 (Readers / Writers)
    • 读写基本类型数据 (long, int etc.)
    • 读写对象

    Java IO类概述表

     

    Java IO: InputStream

    read()

    read()方法返回从InputStream流内读取到的一个字节内容

    InputStream包含了2个从InputStream中读取数据并将数据存储到缓冲数组中的read()方法,他们分别是:

    • int read(byte[])
    • int read(byte, int offset, int length)

    一次性读取一个字节数组的方式,比一次性读取一个字节的方式快的多,所以,尽可能使用这两个方法代替read()方法。

    Java IO: OutputStream

    Write(byte)

    write(byte)方法用于把单个字节写入到输出流中。

    write(byte[])

    OutputStream同样包含了将字节数据中全部或者部分数据写入到输出流中的方法,分别是write(byte[])和write(byte[], int offset, int length)。

    write(byte[])把字节数组中所有数据写入到输出流中。

    write(byte[], int offset, int length)把字节数据中从offset位置开始,length个字节的数据写入到输出流。

    flush()

    OutputStream的flush()方法将所有写入到OutputStream的数据冲刷到相应的目标媒介中。比如,如果输出流是FileOutputStream,那么写入到其中的数据可能并没有真正写入到磁盘中。即使所有数据都写入到了FileOutputStream,这些数据还是有可能保留在内存的缓冲区中。通过调用flush()方法,可以把缓冲区内的数据刷新到磁盘(或者网络,以及其他任何形式的目标媒介)中。

    Java IO: FileInputStream

    FileInputStream可以以字节流的形式读取文件内容。

    // FileInputStream是InputStream的子类,这意味着你可以把FileInputStream当做InputStream使用(FileInputStream与InputStream的行为类似)。
    InputStream input = new FileInputStream("c:\data\input-text.txt");
    File file = new File("c:\data\input-text.txt");
    // 其中一个FileInputStream构造函数取一个File对象替代String对象作为参数。这里是一个使用该构造函数的例子:
    InputStream input = new FileInputStream(file);

    Java IO: FileOutputStream

    FileOutputStream可以往文件里写入字节流

    文件内容的覆盖Override VS追加Appending

    当你创建了一个指向已存在文件的FileOutputStream,你可以选择覆盖整个文件,或者在文件末尾追加内容。通过使用不同的构造函数可以实现不同的目的。

    // 其中一个构造函数取文件名作为参数,会覆盖任何此文件名指向的文件。
    OutputStream output = new FileOutputStream("c:\data\output-text.txt");
    // 另外一个构造函数取2个参数:文件名和一个布尔值,布尔值表明你是否需要覆盖文件。这是构造函数的例子:
    OutputStream output = new FileOutputStream("c:\data\output-text.txt", true); //appends to file
    OutputStream output = new FileOutputStream("c:\data\output-text.txt", false); //overwrites file

    Java IO: Reader And Writer

    Java IO的Reader和Writer除了基于字符之外,其他方面都与InputStream和OutputStream非常类似。他们被用于读写文本。

    Reader类是Java IO中所有Reader的基类。子类包括BufferedReader,PushbackReader,InputStreamReader,StringReader和其他Reader。

    Reader reader = new FileReader("c:\data\myfile.txt");

    Writer类是Java IO中所有Writer的基类。子类包括BufferedWriter和PrintWriter等等。

    Writer writer = new FileWriter("c:\data\file-output.txt"); 

    整合Reader与InputStream

    一个Reader可以和一个InputStream相结合。如果你有一个InputStream输入流,并且想从其中读取字符,可以把这个InputStream包装到InputStreamReader中。

    // InputStream传递到InputStreamReader的构造函数中:
    Reader reader = new InputStreamReader(inputStream);

    整合Writer和OutputStream

    与Reader和InputStream类似,一个Writer可以和一个OutputStream相结合。把OutputStream包装到OutputStreamWriter中,所有写入到OutputStreamWriter的字符都将会传递给OutputStream。

    Writer writer = new OutputStreamWriter(outputStream);

    整合Reader和Writer

    和字节流一样,Reader和Writer可以相互结合实现更多更有趣的IO,工作原理和把Reader与InputStream或者Writer与OutputStream相结合类似。举个栗子,可以通过将Reader包装到BufferedReader、Writer包装到BufferedWriter中实现缓冲。

    Reader reader = new BufferedReader(new FileReader(...));
    Writer writer = new BufferedWriter(new FileWriter(...));

    Java IO: RandomAccessFile

    创建一个RandomAccessFile

    // 在使用RandomAccessFile之前,必须初始化它。这是例子:
    RandomAccessFile file = new RandomAccessFile("c:\data\file.txt", "rw");
    // 请注意构造函数的第二个参数:“rw”,表明你以读写方式打开文件。请查阅Java文档获知你需要以何种方式构造RandomAccessFile。

    在RandomAccessFile中来回读写

    在RandomAccessFile的某个位置读写之前,必须把文件指针指向该位置。通过seek()方法可以达到这一目标。可以通过调用getFilePointer()获得当前文件指针的位置。

    RandomAccessFile file = new RandomAccessFile("c:\data\file.txt", "rw");
    file.seek(200);
    long pointer = file.getFilePointer();
    file.close();

    RandomAccessFile中的任何一个read()方法都可以读取RandomAccessFile的数据。

    RandomAccessFile中的任何一个write()方法都可以往RandomAccessFile中写入数据。

  • 相关阅读:
    enumerate()
    列表
    pycharm下getpass.getpass()卡住
    字符编码
    while_else
    guess_age
    数据类型
    python发展史
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:JSP的基本原理
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Web应用和web.xml文件
  • 原文地址:https://www.cnblogs.com/ooo0/p/7592399.html
Copyright © 2020-2023  润新知