通过问题来掌握Java中的IO关键概念并理解其结构关系

总体概览

Java中的IO,一直是编程中不可忽视的一大块技术组成内容,需要掌握。


下面总体来鸟瞰一下IO中的字符流和字节流,以及相关总体构成类图的组成关系,然后我们在具体看看一些核心概念和内容。

通过问题来掌握Java中的IO关键概念并理解其结构关系

IO存储关系

通过问题来掌握Java中的IO关键概念并理解其结构关系

Java IO类关系图

基础问题

  1. 什么是IO流?

    它是一种数据的流从源头流到目的地。比如文件拷贝,输入流和输出流都包括了。输入流从文件中读取数据存储到进程(process)中,输出流从进程中读取数据然后写入到目标文件。

  2. 字节流和字符流的区别。

    字节流在JDK1.0中就被引进了,用于操作包含ASCII字符的文件。JAVA也支持其他的字符如Unicode,为了读取包含Unicode字符的文件,JAVA语言设计者在JDK1.1中引入了字符流。ASCII作为Unicode的子集,对于英语字符的文件,可以使用字节流也可以使用字符流。

  3. Java中流类的超类主要有那些?

  • java.io.InputStream

  • java.io.OutputStream

  • java.io.Reader

  • java.io.Writer

4.FileInputStream和FileOutputStream是什么?

这是在拷贝文件操作的时候,经常用到的两个类。在处理小文件的时候,它们性能表现还不错,在大文件的时候,最好使用BufferedInputStream (或 BufferedReader) 和 BufferedOutputStream (或 BufferedWriter)。

示例如下:

public class InputAndOutputBuffering{ public static void main(String args[]) throws IOException {FileInputStream fistream = new FileInputStream("myFile.txt");BufferedInputStream bistream = new BufferedInputStream(fistream);FileOutputStream fostream = new FileOutputStream("yourFile.txt");BufferedOutputStream bostream = new BufferedOutputStream(fostream);int temp; while( ( temp = bistream.read() ) != -1 ) {bostream.write(temp);System.out.print((char) temp);}bostream.close();fostream.close();bistream.close();fistream.close();}}

5.字节流和字符流,你更喜欢使用哪一个?

个人来说,更喜欢使用字符流,因为他们更新一些。许多在字符流中存在的特性,字节流中不存在。比如使用BufferedReader而不是BufferedInputStreams或DataInputStream,使用newLine()方法来读取下一行,但是在字节流中我们需要做额外的操作。

6.System.out.println()是什么?

println是PrintStream的一个方法。out是一个静态PrintStream类型的成员变量,System是一个java.lang包中的类,用于和底层的操作系统进行交互。

7.什么是Filter流?

Filter Stream是一种IO流主要作用是用来对存在的流增加一些额外的功能,像给目标文件增加源文件中不存在的行数,或者增加拷贝的性能。

8.有哪些可用的Filter流?

主要由4个可用的filter Stream。两个字节filter stream,两个字符filter stream. 分别是FilterInputStream, FilterOutputStream, FilterReader and FilterWriter.这些类是抽象类,不能被实例化的。

9.在字节流的读取端Filter流的子类?

  • LineNumberInputStream 给目标文件增加行号

  • DataInputStream 有些特殊的方法如readInt(),和等可以读取一个 int, double和一个string一次性的,

  • BufferedInputStream 增加性能

  • PushbackInputStream 推送要求的字节到系统中

10.SequenceInputStream的作用?

在拷贝多个文件到一个目标文件的时候是非常有用的。可以使用很少的代码实现。示例如下:

public class CopyTwoFiles { public static void main(String args[]) throws IOException {FileInputStream fistream1 = new FileInputStream("D:\source\src\A.txt"); // 第一个源文件FileInputStream fistream2 = new FileInputStream("E:\source\src\B.txt"); //第二个源文件SequenceInputStream sistream = new SequenceInputStream(fistream1, fistream2);FileOutputStream fostream = new FileOutputStream("C.txt"); // 目标文件int temp; while( ( temp = sistream.read() ) != -1) {System.out.print( (char) temp ); // 控制台输出fostream.write(temp); // 写入文件}fostream.close();sistream.close();fistream1.close();fistream2.close();}}

11.说说PrintStream和PrintWriter

他们两个的功能相同,但是属于不同的分类。字节流和字符流。他们都有println()方法。

12.在文件拷贝的时候,那一种流可以提升更多的性能?

在字节流的时候,使用BufferedInputStream和BufferedOutputStream。在字符流的时候,使用BufferedReader 和 BufferedWriter

13.说说管道流(Piped Stream)

有四种管道流, PipedInputStream, PipedOutputStream, PipedReader 和 PipedWriter.在多个线程或进程中传递数据的时候管道流非常有用。

14.说说File类

它不属于 IO流,也不是用于文件操作的,它主要用于知道一个文件的属性,读写权限,大小等信息。

15.说说RandomAccessFile?

它在java.io包中是一个特殊的类,既不是输入流也不是输出流,它两者都可以做到。他是Object的直接子类。通常来说,一个流只有一个功能,要么读,要么写。但是RandomAccessFile既可以读文件,也可以写文件。 DataInputStream 和 DataOutStream有的方法,在RandomAccessFile中都存在。


文末提示

如果有兴趣,您可以在补充一些关于Java有关IO的内容。这里就简单说这些了。

原文为英文:https://way2java.com/java-questions/io-streams/

通过问题来掌握Java中的IO关键概念并理解其结构关系


分享到:


相關文章: