1 、简述 FileInputStream 类和 FileOutputStream 类的创建语法。 
 
 
 FileInputStream 类和 FileOutputStream 类是用来处理文件输入 /输出的类,创建 FileInputStream 对象的语法如下 (其中:fileName表示文件的路径名称,可以是绝对路径或相对路径哈) 
     FileInputStream fileInputStream = new FileInputStream(fileName); 创建  FileOutputStream  对象的语法如下  
  (其中: fileName  表示文件的路径和名称,可以是相对路径或绝对路径。)  
 FileOutputStream fos = new FileOutputStream(fileName); 需要注意的是,这两个类的创建语法中可能会抛出  IOException  异常,因此需要进行异常处理,可以使  
  用  try-catch  语句或者  throws  关键字进行处理。另外,使用完毕后应该关闭对应的流对象,可以通过调  
  用  close()  方法来实现。 
   2 、如果要完成将各种数据的写入,需要将一个文件输出流对象 fout  
  与一个格式输出流对象 out 相连,要用到什么关键代码? 
    回答:  
  要将一个文件输出流对象  fout  与一个格式输出流对象  out  相连,可以使用  Java  中的  PrintWriter  类来  
  实现。  
  下面是将文件输出流对象  fout  与格式输出流对象  out  相连的关键代码: 
   FileOutputStream fout = new FileOutputStream("example");PrintWriter out = new PrintWriter(fout);
 在这个示例中,通过创建  FileOutputStream  对象  fout  来表示要写入的文件,然后将其传递给  
  PrintWriter  对象  out 。之后,就可以使用  PrintWriter  对象  out  的方法来将各种数据写入文件,比如  
  print  和  println  方法用于写入字符串, printf  方法用于格式化输出等。写入完毕后,应当调用  close  方 法关闭输出流,以确保数据被正确写入并释放相关资源。 
    3 、文件操作类是否可以读入多个文件?什么类可以完成这个操作? 
    Java  文件操作类可以读入多个文件。其中, BufferedReader  类可以用于按行读取文本文件,而  
  FileReader 则用于创建 BufferedReader 对象并关联文件。  
  下面是一个示例代码,展示了如何使用  BufferedReader  类和  FileReader  类来读取多个文件: 
         try {BufferedReader reader;String[] fileNames = {"file1.txt" , "file2.txt" , "file3.txt"};for (String fileNme : fileNames) {reader = new BufferedReader(new FileReader(fileNme));String line;while ((line = reader.readLine()) != null) {//处理读取到的每一行数据System.out.println(line);}reader.close();}}catch (IOException e){e.printStackTrace();}
}
 4 、 File 类有哪些构造函数和常用方法? 
    Java  中的  File  类有多个构造函数和常用方法,用于操作文件和目录。以下是  File  类的一些常用构造函 数和方法:  
   构造函数:  
   File(String pathname) :根据文件路径名创建  File  对象,可以是相对路径或绝对路径。  
  File(String parent, String child) :根据指定的父路径和子路径字符串创建  File  对象。  
  File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的  File  实例。  
   常用方法:  
   boolean exists() : 判断文件或目录是否存在。  
   boolean isFile() : 判断  File  对象表示的是否为文件。  
   boolean isDirectory() : 判断  File  对象表示的是否为目录。  
   String getName() : 获取文件或目录的名称。  
   String getAbsolutePath() :获取文件或目录的绝对路径。  
   boolean createNewFile() :创建新的空文件。  
   boolean mkdir() : 创建此抽象路径名指定的目录。  
   String[] list() : 返回目录下的文件和目录的名称数组。  
   这些构造函数和方法使得  File  类在文件和目录的操作中非常灵活,可以用于判断文件是否存在、创建文 件或目录、获取文件信息等操作。 
    5 、写出 InputStream 定义的 read() 函数的三种形式,并简要的写出  
  它们之间的区别。  
   在  Java  中, InputStream  定义了  read()  方法的三种形式,它们分别是:  
 - int read()
- int read(byte[] b)
- int read(byte[] b, int off, int len)
 这三种形式的  read()  方法有以下区别:  
  1 、 int read()  
  这是最基本的形式的  read()  方法,每次调用该方法将从输入流中读取下一个字节,返回读取的字节数 据。  
  当读取到流的末尾时,返回值为 -1 。  
  这种形式的  read()  方法适用于读取单个字节的数据。  
  2 、 int read(byte[] b)  
  这种形式的  read()  方法将最多  b.length  个字节的数据从输入流中读取到  byte 数组 b  中,返回实际读取的字节数。  
  当返回值为 -1 时,表示已经到达流的末尾。  
  ² 这种形式的  read()  方法适用于一次性读取多个字节的场景。  
  3 、 int read(byte[] b, int off, int len)  
  这种形式的  read()  方法将最多  len 个字节的数据从输入流中读取到 byte 数组 b  中,读取的数据放入  b 中的偏移量为 off 开始的位置,返回实际读取的字节数。  
  当返回值为  -1  时,表示已经到达流的末尾。  
  这种形式的  read()  方法允许控制从输入流中读取数据的长度和放入目标数组中的位置,适用于特定的 读取需求。  
  这三种形式的  read()  方法提供了灵活和多样化的读取方式,使得  InputStream  在处理输入流时更加方 便和高效 
    6 、 abstract class 和 interface 有什么区别 ?  
    回答:  
  抽象类( abstract class )和接口( interface )是  Java  中实现多态性的两种机制,它们的区别主要在以 下几个方面:  
  1 )定义方式:抽象类使用  abstract  关键字定义,可以包含具体方法的定义和抽象方法的声明,并使 用 extends  进行继承。接口使用  interface  关键字定义,只能包含抽象方法的声明,并使用  
  implements  进行实现。  
  2 )实现多态性:抽象类通过继承实现单一继承,子类可以重写抽象类的方法,继承它的属性和方  
  法。接口通过实现实现多重继承,一个类可以实现多个接口,具备多个接口的行为。 
  3 )设计目的和思想:抽象类用于创建类继承层次结构,将具有相似行为和属性的类进行分组,并提 供默认实现。接口用于定义合同或规范,强调类应该具有什么行为而不是如何实现,不相关的类可以实 现相同的行为。  
  抽象类和接口在不同场合有不同的用途,具体使用取决于设计需求。有时候,可以将抽象类和接口结合 使用以充分发挥它们的特性。 
   7 、什么是类成员,什么是实例成员?他们之间有什么区别? 
    在 Java 中,类成员( class members )和实例成员( instance members )指的是在类中定义的不同类 型的成员,它们具有以下区别: 
   1)  定义位置:  
  类成员被定义在类的内部但在任何实例方法之外。它们在类加载时就会被创建,与类的实例化无  
  关。类成员包括静态变量( static variables )和静态方法( static methods )。  
   实例成员被定义在类的内部,但在实例方法内部。它们与类的实例相关联,只有在创建类的实例时  
  才会被分配和初始化。实例成员包括实例变量( instance variables )和实例方法( instance  
  methods )。  
   2)  访问方式:  
   类成员可以通过类名直接访问,无需实例化类。例如,类名 . 类成员。  
  实例成员只能通过实例化类后的对象来访问。例如,对象名 . 实例成员。  
   3)  生命周期:  
   类成员在类加载时就会存在,直到程序结束或类被卸载时才会被销毁。  
  实例成员在类的实例化过程中创建,实例被销毁时,实例成员也会被销毁。  
   4)  内存分配:  
   类成员在类加载时分配静态存储区,并在整个程序的生命周期内存在。它们被所有该类实例所共享。  
  实例成员在每个类的实例化过程中会为每个实例分配独立的内存空间。  
   5)  使用场景:  
   类成员通常用于描述属于整个类的数据和行为,如常量和工具方法。  
  实例成员通常用于描述每个实例特有的数据和行为。  
  总的来说,类成员与类本身相关,对于所有实例而言都是相同的;而实例成员与实例相关,每个实例 都有自己的实例成员副本。类成员通常用来表示整个类的共享信息,实例成员则用于表示每个实例的个性化信息。