Java-I/O学习(1)

Java-I/O学习(1)

Java IO是java中的相关API,主要目的为读数据与写数据(input 和 output)。大部分的应用都需要处理一些输入数据,并且根据输入数据生成一些输出数据,比如说从文件或网络读取数据,然后写回文件或通过网络响应数据。

Java的IO包本身的主要关注点在于,从一个地方读取原始数据和向目的地写入数据。最典型的数据来源和目的地主要有:

  • 文件(File)

  • 管道(Pipes)

  • 网络连接(Network Connections)

  • 内存缓冲区,比如数组(In-memory Buffers)

  • System.in, System.out, System.error

图示一个程序从一个地方读数据并且写数据到目的地:

图1.png

IO流是Java IO的核心概念。流是一个概念上的无休止的数据流。你既可以从一个流读取数据也可以写入到一个流。流用来连接数据源与目标地。Java IO流基于字节流和字符流。

InputStream, OutputStream, Reader and Writer

一个程序从数据源读取数据的时候,需要 InputStream或者Reader。程序写数据的时候,就需要OutputStream或Writer

图示:

图2.png

InputStream和Reader连接到数据来源。OutputStream和Writer连接到目的地

Java IO的目的和特性

Java IO中有很多InputStream, OutputStream, Reader和Writer的子类,这些子类会用来处理不同的需求。这就是为什么有这么多类的原因。具体的用法主要有以下一些场景:

  • 文件

  • 网络流

  • 内存缓冲区

  • 管道

  • 缓冲

  • 过滤

  • 解析

  • 读写文本

  • 读写原始类型的数据(long等等)

  • 读写对

字节输入流 Output 字符输入流 Output
Basic InputStream OutputStream Reader/InputStreamReader Writer/OutputStreamWriter
Arrays ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter
Files FileInputStream/RandomAccessFile FileOutputStream/RandomAccessFile FileReader FileWriter
Pipes PipedInputStream PipedOutputStream PipedReader PipedWriter
Buffer BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter
Filter FilterInputStream FilterOutputStream FilterReader FilterWriter
Parsing PushbackInputStream/StreamTokenizer PushbackReader/LineNumberReader
String StringReader StringWriter
Data DataInputStream DataOutputStream
Data - Formatted PrintStream PrintWriter
Objects ObjectInputStream ObjectOutputStream
Utilities SequenceInputStream

文件

Java IO读取文件

如果你想从一端读取一个文件到另一端,你可以用FileInputStream或者FileReader,这取决于你是想把文件读取成字节还是字符。这两个类每次读取一个字节或者一个字符来处理整个文件,或者将字节或字符放入到字节数组或字符数组中。你没有必要读取整个文件,只需要有序的读取文件中的字符或字节就可以。
如果你需要读取文件中随机位置的部分,你可以使用RandomAccessFile。

Java IO写文件

如果你想从一端读取一个文件到另一端,你可以用FileOutputStream或者FileWriter,这取决于你是想根据字节还是字符来写。这两个类每次写入一个字节或者一个字符来写完整个文件,或者将字节或字符放入到字节数组或字符数组中来写。数据会按顺序存储到文件当中。
如果你需要在文件中随机的位置来写,你可以使用RandomAccessFile。

Java IO随机访问文件

利用RandomAccessFile来随机访问文件。
随机的意思并是不真正意义上的随机访问文件地址,它紧紧是意味着你可以根据你的需要来访问文件的某个位置。没有一个强制的顺序让你访问文件。这就让处理已经存在的文件的某部分称为了可能,去增加内容,从中删除内容,当然了也包括去读取任何内容。

Byte & Char Arrays

在一个Java应用中,字节数组和字符数组经常用来在程序内部临时存储数据。它们也是常规的数据源或数据目的地。如果你需要在程序运行的时候访问文件内容,也可以把文件加载到数组中。当然,你可以通过数组的下标来访问文件的内容。如果你设计一个组件用来从InputStream或Reader读取特定的数据并且不用数组,那该怎么办?

通过InputStream或Reader读数组

需要用ByteArrayInputStream或CharArrayReader包装一下字节或字符数组。这样,数组中的字节或字符就可以通过包装的stream或reader来读取了:


public class Demo {


    public static void main(String[] args) throws IOException {

        String s = "abcdefghijklmn";

        byte[] bytes = s.getBytes();

        InputStream input = new ByteArrayInputStream(bytes);

        int data = input.read();

        while (data != -1) {
            System.out.println(data);

            data = input.read();
        }

    }
}


针对字符数组。利用CharArrayReader


public class Demo2 {


    public static void main(String[] args) throws IOException {

        String s = "abcdefghijklmn";

        char[] chars = s.toCharArray();

        Reader reader = new CharArrayReader(chars);

        int data = reader.read();

        while (data != -1) {

            System.out.println(data);

            data = reader.read();

        }
        
    }
}



通过OutputStream或Writer写入到数组

同样的去写数据,可以用ByteArrayOutputStream或CharArrayWriter。你需要做的事情就是创建一个ByteArrayOutputStream或CharArrayWriter,然后向这里面写数据,就像你用其他的stream或writer一样。当所有数据写完的时候,只是简单的调用oByteArray()或toCharArray方法,所有的数据就可以以数组的形式返回。


public class T1 {


    public static void main(String[] args) throws IOException {

        ByteArrayOutputStream output = new ByteArrayOutputStream();

        output.write("hdhdsjdhsjdhsjdhsj".getBytes("UTF-8"));

        byte[] bytes = output.toByteArray();

        for (byte b : bytes) {
            System.out.println(b);
        }
        
    }
}


针对字符数组。利用CharArrayWriter


public class T2 {


    public static void main(String[] args) throws IOException {

        CharArrayWriter writer = new CharArrayWriter();

        writer.write("abcghdh");

        char[] chars = writer.toCharArray();

        for (char c : chars) {
            System.out.println(c);
        }


    }
}

Readers and Writers

Java IO中的java.io.Reader和java.io.Writer的工作原理很像InputStream和OutputStream,但不同的是reader和writer是基于字符的,他们是用来用些文本数据的

Reader

Java Reader是所有java reader相关类的基类。子类包括有BufferedReader、PushbackReader、InputStreamReader、StringReader和一些其他的类

使用:


public class T1 {


    public static void main(String[] args) throws IOException {


        Reader reader = new FileReader("E:\\learn-java\\Learning-Java\\MyNotes\\better_write\\Java_IO\\bb.txt");

        int data = reader.read();

        while ( data != -1) {

            System.out.println((char)data);

            data = reader.read();
        }
        
    }
}


当InputStream每次返回一个字节的时候,这个字节是 0 到 255 直接的值(-1代表没有数据了),Reader每次返回一个字符,意味着返回 0 到 65535 (-1代码数据已经读完)。这并不意味着Reader从已连接的数据源一次读取两个字节,它每次可以一次读取一或多个字节。这取决于文本数据的编码格式。

Writer

Java IO API中Writer是所有writer的基类。子类主要包括BufferedWriter和PrintWriter等一些其他的类


public class T2 {


    public static void main(String[] args) throws IOException {

        Writer writer = new FileWriter("E:\\learn-java\\Learning-Java\\MyNotes\\better_write\\Java_IO\\bb.txt");

        writer.write("123456789");

        writer.close();


    }
}

I/O类库图

图示:

图3.png

图4.png

参考文章

https://www.jianshu.com/p/5086f354b517

发布了229 篇原创文章 · 获赞 62 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/Coder_py/article/details/105178601
今日推荐