Java-I/O学习(1)

作者: Cool_Pomelo | 来源:发表于2020-03-29 16:39 被阅读0次

    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

    相关文章

      网友评论

        本文标题:Java-I/O学习(1)

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