java中的IO流(字符流,字节流)及一些常见面试题

目录

一.File类

1.1File类的概述与构造方法  1.1.1File类的介绍

  1.1.2File类的构造方法

 1.2File类的常用方法

1.2.1File类的创建功能

1.2.2File类的判断与获取功能

 1.2.3File类的删除功能​

1.2.4绝对路径与相对路径

1.3递归

1.3.1递归介绍

1.3.2递归的注意事项

1.3.3递归遍历目录

二 .IO流

2.1IO流概述和分类

2.1.1IO流介绍

 2.1.2IO流的分类

2.1.3IO流的使用场景

 2.2字节流写数据

2.2.1字节流概述

 2.2.2字节流写数据的三种方式

2.2.3字节流读数据(一次读一个字节数据)

2.2.4字节流复制图片

2.3字节缓冲流

2.4字符流

2.4.1中文的字节存储方式

2.5字符串中的编码解码问题

2.6字符流中的编码解码问题

​2.7字符流写数据的五种方式

2.7.1五种方法介绍

​2.7.2刷新和关闭的方法

2.7.3字符流读数据的方式

2.8字符缓冲流

2.8.1字符缓冲流介绍

2.8.2构造方法

2.8.3字符缓冲流的特有功能

三.特殊操作流

3.1字节打印流

3.1.1打印流分类

3.1.2打印流的特点

3.1.3字节打印流

3.2字符打印流

3.2.1字符打印流构造房方法

四.Properties集合

4.1Properties作为Map集合的使用

 4.1.1Properties介绍

4.1.2特有方法​

4.2Properties和IO流相结合的方法

4.2.1和IO流结合的方法

4.2.2代码展示:

五.IO流常见面试题

5.1java中有几种类型的流?

5.2字节流和字符流哪个好?怎么选择? 

5.3 什么是缓冲区?有什么作用?

5.4 字符流和字节流有什么区别?

5.5 什么是Java序列化,如何实现Java序列化?

5.6 PrintStream、BufferedWriter、PrintWriter的比较?

5.7BufferedReader属于哪种流,它主要是用来做什么的,它里面有那些经典的方法?

5.8 什么是节点流,什么是处理流,它们各有什么用处,处理流的创建有什么特征?

5.9流一般需要不需要关闭,如果关闭的话在用什么方法,一般要在那个代码块里面关闭比较好,处理流是怎么关闭的,如果有多个流互相调用传入是怎么关闭的?

5.10 InputStream里的read()返回的是什么,read(byte[] data)是什么意思,返回的是什么值?

5.11 OutputStream里面的write()是什么意思,write(byte b[], int off, int len)这个方法里面的三个参数分别是什么意思?


一.File类

1.1File类的概述与构造方法
  1.1.1File类的介绍

   1.它是文件和目录路径名的抽象表示

(2)文件和目录是可以通过File封装成对象的

(3)对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。它可以是存在的,也可以是不存在的。将来是要通过具体的操作把这个路径的内容转换为具体存在

  1.1.2File类的构造方法

java中的IO流(字符流,字节流)及一些常见面试题_第1张图片

 

 1.2File类的常用方法

1.2.1File类的创建功能

java中的IO流(字符流,字节流)及一些常见面试题_第2张图片 

1.2.2File类的判断与获取功能

判断功能

java中的IO流(字符流,字节流)及一些常见面试题_第3张图片

 获取功能

java中的IO流(字符流,字节流)及一些常见面试题_第4张图片

 代码演示:

public class FileDemo04 {
    public static void main(String[] args) {
        //创建一个File对象
        File f = new File("myFile\\java.txt");

//        public boolean isDirectory():测试此抽象路径名表示的File是否为目录
//        public boolean isFile():测试此抽象路径名表示的File是否为文件
//        public boolean exists():测试此抽象路径名表示的File是否存在
        System.out.println(f.isDirectory());
        System.out.println(f.isFile());
        System.out.println(f.exists());

//        public String getAbsolutePath():返回此抽象路径名的绝对路径名字符串
//        public String getPath():将此抽象路径名转换为路径名字符串
//        public String getName():返回由此抽象路径名表示的文件或目录的名称
        System.out.println(f.getAbsolutePath());
        System.out.println(f.getPath());
        System.out.println(f.getName());
        System.out.println("--------");

//        public String[] list():返回此抽象路径名表示的目录中的文件和目录的名称字符串数组
//        public File[] listFiles():返回此抽象路径名表示的目录中的文件和目录的File对象数组
        File f2 = new File("E:\\itcast");

        String[] strArray = f2.list();
        for(String str : strArray) {
            System.out.println(str);
        }
        System.out.println("--------");

        File[] fileArray = f2.listFiles();
        for(File file : fileArray) {
//            System.out.println(file);
//            System.out.println(file.getName());
            if(file.isFile()) {
                System.out.println(file.getName());
            }
        }
    }
}

 1.2.3File类的删除功能

注意 

只能一个一个删。

代码演示: 

public class FileDemo03 {
    public static void main(String[] args) throws IOException {
//        File f1 = new File("E:\\itcast\\java.txt");
        //需求1:在当前模块目录下创建java.txt文件
        File f1 = new File("myFile\\java.txt");
//        System.out.println(f1.createNewFile());

        //需求2:删除当前模块目录下的java.txt文件
        System.out.println(f1.delete());
        System.out.println("--------");

        //需求3:在当前模块目录下创建itcast目录
        File f2 = new File("myFile\\itcast");
//        System.out.println(f2.mkdir());

        //需求4:删除当前模块目录下的itcast目录
        System.out.println(f2.delete());
        System.out.println("--------");

        //需求5:在当前模块下创建一个目录itcast,然后在该目录下创建一个文件java.txt
        File f3 = new File("myFile\\itcast");
//        System.out.println(f3.mkdir());
        File f4 = new File("myFile\\itcast\\java.txt");
//        System.out.println(f4.createNewFile());

        //需求6:删除当前模块下的目录itcast
        System.out.println(f4.delete());
        System.out.println(f3.delete());
    }
}

1.2.4绝对路径与相对路径

绝对路径:完整的路径名,不需要任何其他信息就可以定位它所表示的文件。例如:E:\itcast\java.txt

相对路径:必须使用取自其他路径名的信息进行解释。例如:myFile\java.txt

1.3递归

1.3.1递归介绍

  • 以编程的角度来看,递归指的是方法定义中调用方法本身的现象

  • 把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解

  • 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算

1.3.2递归的注意事项

  • 递归一定要有出口。否则内存溢出

  • 递归虽然有出口,但是递归的次数也不宜过多。否则内存溢出

1.3.3递归遍历目录

 案例需求:给定一个路径(E:\itcast),通过递归完成遍历该目录下所有内容,并把所有文件的绝对路径输出在控制台

代码展示

public class DiGuiDemo02 {
    public static void main(String[] args) {
        //根据给定的路径创建一个File对象
//        File srcFile = new File("E:\\itcast");
        File srcFile = new File("E:\\itheima");

        //调用方法
        getAllFilePath(srcFile);
    }

    //定义一个方法,用于获取给定目录下的所有内容,参数为第1步创建的File对象
    public static void getAllFilePath(File srcFile) {
        //获取给定的File目录下所有的文件或者目录的File数组
        File[] fileArray = srcFile.listFiles();
        //遍历该File数组,得到每一个File对象
        if(fileArray != null) {
            for(File file : fileArray) {
                //判断该File对象是否是目录
                if(file.isDirectory()) {
                    //是:递归调用
                    getAllFilePath(file);
                } else {
                    //不是:获取绝对路径输出在控制台
                    System.out.println(file.getAbsolutePath());
                }
            }
        }
    }
}

二 .IO流

2.1IO流概述和分类

2.1.1IO流介绍

  • IO:输入/输出(Input/Output)

  • 流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输

  • IO流就是用来处理设备间数据传输问题的。常见的应用:文件复制;文件上传;文件下载

 2.1.2IO流的分类

  • 按照数据的流向

    • 输入流:读数据

    • 输出流:写数据

  • 按照数据类型来分

    • 字节流

      • 字节输入流

      • 字节输出流

    • 字符流

      • 字符输入流

      • 字符输出流

2.1.3IO流的使用场景

  • 如果操作的是纯文本文件,优先使用字符流

  • 如果操作的是图片、视频、音频等二进制文件。优先使用字节流

  • 如果不确定文件类型,优先使用字节流。字节流是万能的流

 2.2字节流写数据

2.2.1字节流概述

字节流抽象基类

InputStream:这个抽象类是表示字节输入流的所有类的超类

OutputStream:这个抽象类是表示字节输出流的所有类的超类

子类名特点:子类名称都是以其父类名作为子类名的后缀

字节输出流

FileOutputStream(String name):创建文件输出流以指定的名称写入文件

使用字节输出流写数据的步骤

创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)

调用字节输出流对象的写数据方法

释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源)

 2.2.2字节流写数据的三种方式

java中的IO流(字符流,字节流)及一些常见面试题_第5张图片
代码演示:

public class FileOutputStreamDemo02 {
    public static void main(String[] args) throws IOException {
        //FileOutputStream(String name):创建文件输出流以指定的名称写入文件
        FileOutputStream fos = new FileOutputStream("myByteStream\\fos.txt");
        //new File(name)
//        FileOutputStream fos = new FileOutputStream(new File("myByteStream\\fos.txt"));

        //FileOutputStream(File file):创建文件输出流以写入由指定的 File对象表示的文件
//        File file = new File("myByteStream\\fos.txt");
//        FileOutputStream fos2 = new FileOutputStream(file);
//        FileOutputStream fos2 = new FileOutputStream(new File("myByteStream\\fos.txt"));

        //void write(int b):将指定的字节写入此文件输出流
//        fos.write(97);
//        fos.write(98);
//        fos.write(99);
//        fos.write(100);
//        fos.write(101);

//        void write(byte[] b):将 b.length字节从指定的字节数组写入此文件输出流
//        byte[] bys = {97, 98, 99, 100, 101};
        //byte[] getBytes():返回字符串对应的字节数组
        byte[] bys = "abcde".getBytes();
//        fos.write(bys);

        //void write(byte[] b, int off, int len):将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流
//        fos.write(bys,0,bys.length);
        fos.write(bys,1,3);

        //释放资源
        fos.close();
    }
}

2.2.3字节流读数据(一次读一个字节数据)

字节输入流

FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream ,该文件由文件系统中的路径名name命名

字节输入流读取数据的步骤

创建字节输入流对象

调用字节输入流对象的读数据方法

释放资源

代码演示:

public class FileInputStreamDemo01 {
    public static void main(String[] args) throws IOException {
        //创建字节输入流对象
        //FileInputStream(String name)
        FileInputStream fis = new FileInputStream("myByteStream\\fos.txt");

        int by;
        /*
            fis.read():读数据
            by=fis.read():把读取到的数据赋值给by
            by != -1:判断读取到的数据是否是-1
         */
        while ((by=fis.read())!=-1) {
            System.out.print((char)by);
        }

        //释放资源
        fis.close();
    }
}

2.2.4字节流复制图片

案例需求

把“E:\itcast\mn.jpg”复制到模块目录下的“mn.jpg”

实现步骤

根据数据源创建字节输入流对象

根据目的地创建字节输出流对象

读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)

释放资源

代码实现:

public class CopyJpgDemo {
    public static void main(String[] args) throws IOException {
        //根据数据源创建字节输入流对象
        FileInputStream fis = new FileInputStream("E:\\itcast\\mn.jpg");
        //根据目的地创建字节输出流对象
        FileOutputStream fos = new FileOutputStream("myByteStream\\mn.jpg");

        //读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)
        byte[] bys = new byte[1024];
        int len;
        while ((len=fis.read(bys))!=-1) {
            fos.write(bys,0,len);
        }

        //释放资源
        fos.close();
        fis.close();
    }
}

2.3字节缓冲流

字节缓冲流介绍

BufferOutputStream:该类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用

BufferedInputStream:创建BufferedInputStream将创建一个内部缓冲区数组。 当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节

构造方法:

java中的IO流(字符流,字节流)及一些常见面试题_第6张图片
代码演示:

public class BufferStreamDemo {
    public static void main(String[] args) throws IOException {
        //字节缓冲输出流:BufferedOutputStream(OutputStream out)
 
        BufferedOutputStream bos = new BufferedOutputStream(new 				                                       FileOutputStream("myByteStream\\bos.txt"));
        //写数据
        bos.write("hello\r\n".getBytes());
        bos.write("world\r\n".getBytes());
        //释放资源
        bos.close();
    

        //字节缓冲输入流:BufferedInputStream(InputStream in)
        BufferedInputStream bis = new BufferedInputStream(new                                                          FileInputStream("myByteStream\\bos.txt"));

        //一次读取一个字节数据
//        int by;
//        while ((by=bis.read())!=-1) {
//            System.out.print((char)by);
//        }

        //一次读取一个字节数组数据
        byte[] bys = new byte[1024];
        int len;
        while ((len=bis.read(bys))!=-1) {
            System.out.print(new String(bys,0,len));
        }

        //释放资源
        bis.close();
    }
}

2.4字符流

2.4.1字符流的介绍

由于字节流操作中文不是特别的方便,所以Java就提供字符流

字符流 = 字节流 + 编码表

2.4.1中文的字节存储方式

用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接成中文,如何识别是中文的呢?

汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数

2.5字符串中的编码解码问题

java中的IO流(字符流,字节流)及一些常见面试题_第7张图片
代码演示:

public class StringDemo {
    public static void main(String[] args) throws UnsupportedEncodingException {
        //定义一个字符串
        String s = "中国";

        //byte[] bys = s.getBytes(); //[-28, -72, -83, -27, -101, -67]
        //byte[] bys = s.getBytes("UTF-8"); //[-28, -72, -83, -27, -101, -67]
        byte[] bys = s.getBytes("GBK"); //[-42, -48, -71, -6]
        System.out.println(Arrays.toString(bys));

        //String ss = new String(bys);
        //String ss = new String(bys,"UTF-8");
        String ss = new String(bys,"GBK");
        System.out.println(ss);
    }
}


2.6字符流中的编码解码问题

字符流中和编码解码问题相关的两个类

  • InputStreamReader:是从字节流到字符流的桥梁

    它读取字节,并使用指定的编码将其解码为字符

    它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集

  • OutputStreamWriter:是从字符流到字节流的桥梁

    是从字符流到字节流的桥梁,使用指定的编码将写入的字符编码为字节

    它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集

构造方法

java中的IO流(字符流,字节流)及一些常见面试题_第8张图片
2.7字符流写数据的五种方式

2.7.1五种方法介绍

java中的IO流(字符流,字节流)及一些常见面试题_第9张图片
2.7.2刷新和关闭的方法

java中的IO流(字符流,字节流)及一些常见面试题_第10张图片

代码展示 

public class OutputStreamWriterDemo {
    public static void main(String[] args) throws IOException {
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("myCharStream\\osw.txt"));

        //void write(int c):写一个字符
//        osw.write(97);
//        osw.write(98);
//        osw.write(99);

        //void writ(char[] cbuf):写入一个字符数组
        char[] chs = {'a', 'b', 'c', 'd', 'e'};
//        osw.write(chs);

        //void write(char[] cbuf, int off, int len):写入字符数组的一部分
//        osw.write(chs, 0, chs.length);
//        osw.write(chs, 1, 3);

        //void write(String str):写一个字符串
//        osw.write("abcde");

        //void write(String str, int off, int len):写一个字符串的一部分
//        osw.write("abcde", 0, "abcde".length());
        osw.write("abcde", 1, 3);

        //释放资源
        osw.close();
    }
}

2.7.3字符流读数据的方式

方法介绍

java中的IO流(字符流,字节流)及一些常见面试题_第11张图片
代码展示:

public class InputStreamReaderDemo {
    public static void main(String[] args) throws IOException {
   
        InputStreamReader isr = new InputStreamReader(new FileInputStream("myCharStream\\ConversionStreamDemo.java"));

        //int read():一次读一个字符数据
//        int ch;
//        while ((ch=isr.read())!=-1) {
//            System.out.print((char)ch);
//        }

        //int read(char[] cbuf):一次读一个字符数组数据
        char[] chs = new char[1024];
        int len;
        while ((len = isr.read(chs)) != -1) {
            System.out.print(new String(chs, 0, len));
        }

        //释放资源
        isr.close();
    }
}

2.8字符缓冲流

2.8.1字符缓冲流介绍

BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途

BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途

2.8.2构造方法

java中的IO流(字符流,字节流)及一些常见面试题_第12张图片

2.8.3字符缓冲流的特有功能

方法介绍

BufferedWriter:

方法名    说明
void newLine()    写一行行分隔符,行分隔符字符串由系统属性定义


BufferedReader:

方法名    说明
String readLine()    读一行文字。 结果包含行的内容的字符串,不包括任何行终止字符如果流的结尾已经到达,则为null
代码展示
 

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

        //创建字符缓冲输出流
        BufferedWriter bw = new BufferedWriter(new                                                          FileWriter("myCharStream\\bw.txt"));

        //写数据
        for (int i = 0; i < 10; i++) {
            bw.write("hello" + i);
            //bw.write("\r\n");
            bw.newLine();
            bw.flush();
        }

        //释放资源
        bw.close();

        //创建字符缓冲输入流
        BufferedReader br = new BufferedReader(new                                                          FileReader("myCharStream\\bw.txt"));

        String line;
        while ((line=br.readLine())!=null) {
            System.out.println(line);
        }

        br.close();
    }
}

三.特殊操作流

3.1字节打印流

3.1.1打印流分类

  • 字节打印流:PrintStream

  • 字符打印流:PrintWriter

3.1.2打印流的特点

  • 只负责输出数据,不负责读取数据

  • 永远不会抛出IOException

  • 有自己的特有方法

3.1.3字节打印流

  • PrintStream(String fileName):使用指定的文件名创建新的打印流

  • 使用继承父类的方法写数据,查看的时候会转码;使用自己的特有方法写数据,查看的数据原样输出

  • 可以改变输出语句的目的地

    public static void setOut(PrintStream out):重新分配“标准”输出流

3.2字符打印流

3.2.1字符打印流构造房方法

java中的IO流(字符流,字节流)及一些常见面试题_第13张图片

四.Properties集合

4.1Properties作为Map集合的使用

 4.1.1Properties介绍

是一个Map体系的集合类

Properties可以保存到流中或从流中加载

属性列表中的每个键及其对应的值都是一个字符串

4.1.2特有方法
java中的IO流(字符流,字节流)及一些常见面试题_第14张图片

代码展示: 

public class PropertiesDemo02 {
    public static void main(String[] args) {
        //创建集合对象
        Properties prop = new Properties();

        //Object setProperty(String key, String value):设置集合的键和值,都是String类型,底层调用Hashtable方法put
        prop.setProperty("itheima001", "林青霞");
        /*
            Object setProperty(String key, String value) {
                return put(key, value);
            }

            Object put(Object key, Object value) {
                return map.put(key, value);
            }
         */
        prop.setProperty("itheima002", "张曼玉");
        prop.setProperty("itheima003", "王祖贤");

        //String getProperty(String key):使用此属性列表中指定的键搜索属性
//        System.out.println(prop.getProperty("itheima001"));
//        System.out.println(prop.getProperty("itheima0011"));

//        System.out.println(prop);

        //Set stringPropertyNames():从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串
        Set names = prop.stringPropertyNames();
        for (String key : names) {
//            System.out.println(key);
            String value = prop.getProperty(key);
            System.out.println(key + "," + value);
        }
    }
}


4.2Properties和IO流相结合的方法

4.2.1和IO流结合的方法

java中的IO流(字符流,字节流)及一些常见面试题_第15张图片 

4.2.2代码展示:

public class PropertiesDemo03 {
    public static void main(String[] args) throws IOException {
        //把集合中的数据保存到文件
//        myStore();

        //把文件中的数据加载到集合
        myLoad();

    }

    private static void myLoad() throws IOException {
        Properties prop = new Properties();

        //void load(Reader reader):
        FileReader fr = new FileReader("myOtherStream\\fw.txt");
        prop.load(fr);
        fr.close();

        System.out.println(prop);
    }

    private static void myStore() throws IOException {
        Properties prop = new Properties();

        prop.setProperty("itheima001","林青霞");
        prop.setProperty("itheima002","张曼玉");
        prop.setProperty("itheima003","王祖贤");

        //void store(Writer writer, String comments):
        FileWriter fw = new FileWriter("myOtherStream\\fw.txt");
        prop.store(fw,null);
        fw.close();
    }
}

五.IO流常见面试题

5.1java中有几种类型的流?

字符流和字节流。

字节流继承inputStream和OutputStream,字符流继承自InputSteamReader和OutputStreamWriter

这里写图片描述

 

5.2字节流和字符流哪个好?怎么选择? 

  1. 大多数情况下使用字节流会更好,因为大多数时候 IO 操作都是直接操作磁盘文件,所以这些流在传输时都是以字节的方式进行的(图片等都是按字节存储的)
  2. 如果对于操作需要通过 IO 在内存中频繁处理字符串的情况使用字符流会好些,因为字符流具备缓冲区,提高了性能

5.3 什么是缓冲区?有什么作用?

  1. 缓冲区就是一段特殊的内存区域,很多情况下当程序需要频繁地操作一个资源(如文件或数据库)则性能会很低,所以为了提升性能就可以将一部分数据暂时读写到缓存区,以后直接从此区域中读写数据即可,这样就显著提升了性。
  2. 对于 Java 字符流的操作都是在缓冲区操作的,所以如果我们想在字符流操作中主动将缓冲区刷新到文件则可以使用 flush() 方法操作。

5.4 字符流和字节流有什么区别?

字符流和字节流的使用非常相似,但是实际上字节流的操作不会经过缓冲区(内存)而是直接操作文本本身的,而字符流的操作会先经过缓冲区(内存)然后通过缓冲区再操作文件

5.5 什么是Java序列化,如何实现Java序列化?

  1. 序列化就是一种用来处理对象流的机制,将对象的内容进行流化。可以对流化后的对象进行读写操作,可以将流化后的对象传输于网络之间。序列化是为了解决在对象流读写操作时所引发的问题
  2. 序列化的实现:将需要被序列化的类实现Serialize接口,没有需要实现的方法,此接口只是为了标注对象可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,再使用ObjectOutputStream对象的write(Object obj)方法就可以将参数obj的对象写出

5.6 PrintStream、BufferedWriter、PrintWriter的比较?

  1. PrintStream类的输出功能非常强大,通常如果需要输出文本内容,都应该将输出流包装成PrintStream后进行输出。它还提供其他两项功能。与其他输出流不同,PrintStream 永远不会抛出 IOException;而是,异常情况仅设置可通过 checkError 方法测试的内部标志。另外,为了自动刷新,可以创建一个 PrintStream
  2. BufferedWriter:将文本写入字符输出流,缓冲各个字符从而提供单个字符,数组和字符串的高效写入。通过write()方法可以将获取到的字符输出,然后通过newLine()进行换行操作。BufferedWriter中的字符流必须通过调用flush方法才能将其刷出去。并且BufferedWriter只能对字符流进行操作。如果要对字节流操作,则使用BufferedInputStream
  3. PrintWriter的println方法自动添加换行,不会抛异常,若关心异常,需要调用checkError方法看是否有异常发生,PrintWriter构造方法可指定参数,实现自动刷新缓存(autoflush)

5.7BufferedReader属于哪种流,它主要是用来做什么的,它里面有那些经典的方法?

属于处理流中的缓冲流,可以将读取的内容存在内存里面,有readLine()方法,它,用来读取一行

5.8 什么是节点流,什么是处理流,它们各有什么用处,处理流的创建有什么特征?

  1. 节点流 直接与数据源相连,用于输入或者输出
  2. 处理流:在节点流的基础上对之进行加工,进行一些功能的扩展
  3. 处理流的构造器必须要 传入节点流的子类

5.9流一般需要不需要关闭,如果关闭的话在用什么方法,一般要在那个代码块里面关闭比较好,处理流是怎么关闭的,如果有多个流互相调用传入是怎么关闭的?

  1. 流一旦打开就必须关闭,使用close方法
  2. 放入finally语句块中(finally 语句一定会执行)
  3. 调用的处理流就关闭处理流
  4. 多个流互相调用只关闭最外层的流

5.10 InputStream里的read()返回的是什么,read(byte[] data)是什么意思,返回的是什么值?

  1. 返回的是所读取的字节的int型(范围0-255)
  2. read(byte [ ] data)将读取的字节储存在这个数组。返回的就是传入数组参数个数

5.11 OutputStream里面的write()是什么意思,write(byte b[], int off, int len)这个方法里面的三个参数分别是什么意思?

  1. write将指定字节传入数据源
  2. Byte b[ ]是byte数组
  3. b[off]是传入的第一个字符、b[off+len-1]是传入的最后的一个字符 、len是实际长度

 

 

你可能感兴趣的:(java,面试)