java中IO的面试题

#什么是IO流?

IO流通俗的讲其实就是数据从原始位置转移到指定的目的地叫做流,比如文件拷贝,其中就用到输入流与输出流。输入流是从文件中读取数据存储到指定的进程中去,输出流是从指定的进程中读取数据写入到文件中去,IO流中包含了两种流,一种是字节流,另一种是字符流。

#什么是字节流?

Java中的字节流处理的最基本单位为单个字节,它通常用来处理二进制数据

java中最基本的两个字节流是 InputStream OntputStream 分别代表的是输入字节流和输出字节流

InputStream类与OutputStream类均为抽象类,我们在实际使用中通常使用Java类库中提供的它们的一系列子类。下面我们以InputStream类为例,来介绍下Java中的字节流。

#什么是字符流?

Java中的字符流处理的最基本的单元是Unicode码元(大小2字节),它通常用来处理文本数据。所谓Unicode码元,也就是一个Unicode代码单元,范围是0x0000~0xFFFF。在以上范围内的每个数字都与一个字符相对应,Java中的String类型默认就把字符以Unicode规则编码而后存储在内存中。然而与存储在内存中不同,存储在磁盘上的数据通常有着各种各样的编码方式。使用不同的编码方式,相同的字符会有不同的二进制表示。实际上字符流是这样工作的:

#字节流和字符流的区别

经过以上的描述,我们可以知道字节流与字符流之间主要的区别体现在以下几个方面:

  • 字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。
  • 字节流默认不使用缓冲区;字符流使用缓冲区。
  • 字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元;字符流通常处理文本数据,它支持写入及读取Unicode码元。

    

#java中流类的超类分别有哪些?

  • java.io.InputStream
  • java.io.OutputStream
  • java.io.Reader
  • java.io.Writer

#FileInputStream和OntputStream分别是什么?

  1. 这是在拷贝文件操作的时候,经常用到的两个类。在处理小文件的时候,它们性能表现还不错,在大文件的时候,最好使用BufferedInputStream (或 BufferedReader) 和 BufferedOutputStream (或 BufferedWriter)
  2. 案例如下:
    public class InputAndOutputBuffering
    {
      public static void main(String args[]) throws IOException
      {                     
    
        FileInputStream fistream = new FileInputStream("pqr.txt");     BufferedInputStream bistream = new BufferedInputStream(fistream); 
    
        FileOutputStream fostream = new FileOutputStream("xyz.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();
      }
    }
    wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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

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

#什么是Filter流?

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

#有哪些可用的Filter流?

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

#有哪些Filter流的子类

  • LineNumberInputStream 给目标文件增加行号
    - DataInputStream 有些特殊的方法如readInt()readDouble()readLine() 等可以读取一个 int, double和一个string一次性的,
  • BufferedInputStream 增加性能
  • PushbackInputStream 推送要求的字节到系统中

#SequenceInputStream的作用?

  1. 在拷贝多个文件到一个目标文件的时候是非常有用的。可以使用很少的代码实现
  2. 案例如下:
    public class TwoFiles {
        public static void main(String args[]) throws IOException
        {
            FileInputStream fistream1 = new FileInputStream("/Users/aihe/Desktop/Songshu/code/java8source/src/main/resources/A.txt");  // first source file
            FileInputStream fistream2 = new FileInputStream("/Users/aihe/Desktop/Songshu/code/java8source/src/main/resources/B.txt");  //second source file
    
            SequenceInputStream sistream = new SequenceInputStream(fistream1, fistream2);
            FileOutputStream fostream = new FileOutputStream("C.txt");        // destination file
    
            int temp;
            while( ( temp = sistream.read() ) != -1)
            {
                System.out.print( (char) temp ); // to print at DOS prompt
                fostream.write(temp);   // to write to file
            }
            fostream.close();
            sistream.close();
            fistream1.close();
            fistream2.close();
        }
    }

#说说PrintStream和PrintWriter

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

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

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

#说说管道流(Piped Stream)

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

#说说File类

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

#说说RandomAccessFile?

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

最后

这篇文章是我转载的,只是想与大家一起分享好的文章,提升自己的技术。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值