Java的Io流知识面试题(收录全网总结最全面的面试题)

81 阅读4分钟

1.为什么图片、视频、音乐、文件等 都是要字节流来读取

因为计算机存储文件是按字节来算的

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

字节流的操作不会经过缓冲区而是直接操作文件,字符流的操作会经过缓冲区然后通过缓冲区再操作文件。

字节流以字节为单位输入输出数据,字节流按照8位传输,字符流以字符为单位输入输出数据,字符流按照16位传输。

Java中一切都是字节流,没有字符流。字符流是有Java虚拟机得到的,音频、视频等媒体文件用字节流比较好,涉及到字符的话使用字符流比较好。

3.节点流和处理流的区别:

按照流是否直接与特定的地方(如磁盘、内存、设备等)相连,分成节点流和处理流

节点流:可以从一个特定的地方读写数据 如FileReader

处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferReader处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的连接。

常用的节点流:

文 件 FileInputStream FileOutputStrean FileReader FileWriter 文件进行处理的节点流。

字符串 StringReader StringWriter 对字符串进行处理的节点流。

数 组 ByteArrayInputStream ByteArrayOutputStreamCharArrayReader CharArrayWriter 对数组进行处理的节点流(对应的不再是文件,而是内存中的一个数组)。

管 道 PipedInputStream PipedOutputStream PipedReaderPipedWriter对管道进行处理的节点流。

常用处理流:

缓冲流:BufferedInputStrean BufferedOutputStream BufferedReader BufferedWriter 增加缓冲功能,避免频繁读写硬盘。

转换流:InputStreamReader OutputStreamReader 实现字节流和字符流之间的转换。

数据流 DataInputStream DataOutputStream 等提供将基础数据类型写入到文件中,或者读取出来

4.IO流的常用类和使用

javaIo流的常用类.webp

5.流的常用操作

字节文件流

FileOutputStream不使用任何缓冲区,因此flush方法为空。是否调用它不会更改代码的结果。

        InputStream inputStream= null;
        OutputStream outputStream= null;
        try {
            inputStream = new FileInputStream(new File("C:\Users\lxy\Desktop\2.txt"));
            outputStream = new FileOutputStream("C:\Users\lxy\Desktop\1.txt");
            byte[] buffer=new byte[1024];
            int i=0;
            while((i=inputStream.read(buffer))!=-1){
                outputStream.write(buffer,0,i);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            inputStream.close();        
            outputStream.close();
        }

字节缓冲流

基本思想就是减少磁盘的访问次数,一次性的先从磁盘中获取一部分数据到内存中。程序后续如果能从缓存中获取数据,就不会真正访问磁盘,以提高读取效率。字节缓冲流BufferedInputStream的缓冲区大小为8192。BufferedOutputStream的close()方法调用了flush()方法,也就是说,在关闭流之前会执行最后一次flush()之后不能在写入数据。

        InputStream inputStream= null;
        OutputStream outputStream= null;
        BufferedInputStream bufferedInputStream=null;
        BufferedOutputStream bufferedOutputStream=null;
        try {
            inputStream = new FileInputStream(new File("C:\Users\lxy\Desktop\1.txt"));
            outputStream = new FileOutputStream("C:\Users\lxy\Desktop\2.txt");
            bufferedInputStream=new BufferedInputStream(inputStream);
            bufferedOutputStream=new BufferedOutputStream(outputStream);
            byte[] buffer=new byte[1024];
            int i=0;
            while((i=bufferedInputStream.read(buffer))!=-1){
                bufferedOutputStream.write(buffer,0,i);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            bufferedInputStream.close();
            bufferedOutputStream.close();
       }

字节数据流

DataInputStream和DataOutputStream是一对可以直接读取基本类型数据的流,DataOutputStream写入的只有DataInputStream才能读出来,读取顺序要和写入顺序一样,且次数也要一样。DataOutputStream的close()方法调用了flush()方法,也就是说,在关闭流之前会执行最后一次flush()之后不能在写入数据。

        OutputStream outputStream= null;
        DataOutputStream dataOutputStream=null;
        try {
            outputStream = new FileOutputStream("C:\Users\lxy\Desktop\2.txt");
            dataOutputStream=new DataOutputStream(outputStream);
            int i=50;
            double b=3.24;
            float f=3.24f;
            dataOutputStream.writeInt(i);
            dataOutputStream.writeDouble(b);
            dataOutputStream.writeFloat(f);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            outputStream.close();
            dataOutputStream.close();
        }
        InputStream  inputStream=null;
        DataInputStream dataInputStream=null;
        try {
            inputStream = new FileInputStream("C:\Users\lxy\Desktop\2.txt");
            dataInputStream=new DataInputStream(inputStream);
            System.out.println(dataInputStream.readInt());
            System.out.println(dataInputStream.readDouble());
            System.out.println(dataInputStream.readFloat());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            inputStream.close();
            dataInputStream.close();
        }

字节数组流

ByteArrayOutputStream可以自定义数组大小,默认是32字节。

ByteArrayXXXputStream操作的是数组,不需要进行close()关闭。

ByteArrayXXXputStream和BufferedXXXputStream的区别:

ByteArrayXXXputStream内部的数组大小是固定的。针对不用缓冲区的一般输出流而言的,即减少读取到内存的次数,同时缓冲区大小固定,缓冲区满则清空,有效利用内存( 缓冲区满后,即时清空缓冲区,输出到输出流中,可以有效利用内存。BufferedXXXputStream内部的数组大小是可变的。缓冲区满后,继续扩大缓冲区的大小,最后得到一个保存所有内容的byte数组。较之BufferedOutputStream速度上存在优势,目的是不直接操作数据流。

        String s="ABCDEFG";
        ByteArrayInputStream inputStream=new ByteArrayInputStream(s.getBytes());
        ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
        byte[] buffer=new byte[1024];
        int ch=0;
        while ((ch=inputStream.read(buffer))!=-1){
            outputStream.write(buffer,0,ch);
        }
        System.out.println(outputStream.toString());

字符文件流

        FileReader fileReader= null;
        FileWriter fileWriter= null;
        try {
            fileReader = new FileReader("C:\Users\lxy\Desktop\1.txt");
            fileWriter = new FileWriter("C:\Users\lxy\Desktop\2.txt");
            int len;
            char[] chars=new char[5];
            while ((len=fileReader.read(chars))!=-1){
                fileWriter.write(chars,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            fileReader.close();
            fileWriter.close();
        }

字符缓冲流

        FileReader fileReader= null;
        FileWriter fileWriter= null;
        BufferedReader bufferedReader=null;
        BufferedWriter bufferedWriter=null;
        try {
            fileReader = new FileReader("C:\Users\lxy\Desktop\1.txt");
            fileWriter = new FileWriter("C:\Users\lxy\Desktop\2.txt");
            bufferedReader = new BufferedReader(fileReader);
            bufferedWriter = new BufferedWriter(fileWriter);
            int len;
            char[] chars=new char[6];
            while ((len=bufferedReader.read(chars))!=-1){
                bufferedWriter.write(chars,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            bufferedReader.close();
            bufferedWriter.close();
        }

读取文本中内容

        int len=0;
        StringBuffer str=new StringBuffer("");
        File file=new File("C:\Users\lxy\Desktop\1.txt");
        try {
            InputStreamReader isr= new FileReader(file);
            BufferedReader in= new BufferedReader(isr);
            String line=null;
            while( (line=in.readLine())!=null )
            {
                if(len != 0) // 处理换行符的问题
                {
                    str.append("\r\n"+line);
                }
                else
                {
                    str.append(line);
                }
                len++;
            }
            in.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(str.toString());