每日五题-java面试题220813

发布于:2023-01-18 ⋅ 阅读:(506) ⋅ 点赞:(0)


1、如何用 java 代码列出一个目录下所有的文件?

如果只要求列出当前文件夹下的文件,代码如下所示

@Test
public void test01(){
    File f = new File("E:\\Application Files");
    for (File temp : f.listFiles()){
        if(temp.isFile()){
            System.out.println(temp.getName());
        }
    }
}

如果需要对文件夹继承展开,代码如下所示:

@Test
public void test02(){
    showDirectory(new File("E:\\Application Files"));
}

public static void showDirectory(File f){
    _walkDirectory(f,0);
}
private static void _walkDirectory(File f, int level){
    if (f.isDirectory()){
        for (File temp : f.listFiles()){
            _walkDirectory(temp,level+1);
        }
    }else {
        for (int i = 0; i < level-1; i++) {
            System.out.println("t");

        }
        System.out.println(f.getName());
    }
}

在 Java 7中可以使用 NIO.2 的 API来做同样的事情,代码如下所示:

import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;

public class ShowFileTest {
    public static void main(String[] args) throws IOException {
        Path initPath = Paths.get("E:\\Application Files");
        Files.walkFileTree(initPath,new SimpleFileVisitor<Path>(){
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attributes) throws IOException {
                System.out.println(file.getFileName().toString());
                return FileVisitResult.CONTINUE;
            }
        });
    }
}

2、XML 文档定义有几种形式?它们之间有何本质区别?解析XML 文档有哪几种方式?

XML 文档定义分为 DTD 和 Schema 两种形式,二者都是 对 XML 语法的约束,其本质区别在于 Schema 本身也是一个XML 文件,可以被 XML 解析器解析,而且可以为XML 承载的数据定义类型,约束能力较之 DTD 更强大。 对 XML 的解析主要有 DOM(文档对象模型,Document Object Model)、SAX(Simple API forXML) 和 StAX(Java6 中引入的新的解析 XML 的方式, Streaming API for XML),其中DOM 处理 大型文件时其性能下降的非常厉害,这个问题是由 DOM 树结构占用的内存较多造成的,而且DOM 解析方式必须在解析文件之前把整个文档装入内存,适合对 XML 的随机访问(典型的用空间换取时间的策略);SAX 是事件驱动的 XML 解析方式,它顺序读取 XML 文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过事件回调代码来处理 XML 文件,适合对 XML 的顺序访问;顾名思义,StAX 把重点放在流上,实际上 StAX 与其他解析方式的本质区别就在于应用程序能够把XML 作为一个事件流来处理。将 XML 作为一组事件来处理的想法并不新颖(SAX就是这样做的),但不同之处在于 StAX 允许应用程序代码把这些事件逐个拉出来,而不用提供在解析器方便时从解析器中接收事件的处理程序。

3、你在项目中哪些地方用到了 XML ?

XML 的主要作用有两个方面:数据交换和信息配置。在做数据交换时,XML 将数据用标签组装成起来,然后压缩打包加密后通过网络传送给接收者,接收解密与解压缩后再从 XML 文件中还原相关信息进行处理,XML 曾经是异构系统间交换数据的事实标准,但此项功能几乎已经被JSON(JavaScript Object Notation)取而代之。当然,目前很多软件仍然使用 XML 来存储配置信息,我们在很多项目中通常也会将它作为配置信息的硬代码写在 XML 文件中,Java 的很多框架也是这么做的,而且这些框架都选择了 dom4j 作为处理XML 的工具,因为 Sun 公司的官方API 实在不怎么好用。

补充:

现在很多时髦的软件(如Sublime)已经开始将配置文件写成 JSON 格式。我们已经强烈的感受到 XML 的另一项功能也逐渐被业界抛弃。

4、阐述 JDBC 操作数据库的步骤。

下面的代码以连接本机的 Oracle 数据库为例,演示 JDBC 操作数据库的步骤。

  1. 加载驱动

    Class.forName("oracle.jdbc.driver.OracleDriver");
    
  2. 创建连接

    Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","tiger");
    
  3. 创建语句

    PreparedStatement ps = con.prepareStatement("select * from emp where sal between ? and ? ");
    ps.setint(1, 1000);
    ps.setint(2, 3000);
    
  4. 执行语句

    ResultSet rs = ps.executeQuery();
    
  5. 处理结果

    while(rs.next()){
    	System.out.println(rs.getint("empno"))+"-"+rs.getString("ename");
    }
    
  6. 关闭资源

    finally {
    	if (con != null){
    		try {
    			con.close();
    		}catch(SQLException e) {
    			e.printStackTrace();
    		}
    	}
    }
    

提示:

关闭外部资源的顺序应该和打开的顺序相反,也就是说先关闭 ResultSet、再关闭Statement、在关闭Connection。上面的代码只关闭了 Connection(连接),虽然通常情况下在关闭连接时,连接上创建的语句和打开的游标也会关闭,但不能保证总是如此,因此应该按照刚才说的的顺序分别关闭。此外,第一步加载驱动在 JDBC4.0 中是可以省略的(自动从类路径中加载驱动),但是我们建议保留。

5、 Statement 和 PreparedStatement 有什么区别?哪个性能更好?

与 Statement 相比

  • PreparedStatement 接口代表预编译的语句,它主要的优势在于可以减少SQL 的编译错误并增加SQL 的安全性(减少SQL 注射攻击的可能性)
  • PreparedStatement 中的 SQL 语句是可以带参数的,避免了用字符串连接拼接 SQL 语句的麻烦和不安全
  • 当批量处理 SQL 或 频繁执行相同的查询时,PreparedStatement 有明显的性能上的优势,由于数据库可以将编译优化后的SQL语句缓存起来,下次执行相同结构的语句时就会很快(不用再次编译和生成执行计划)。

补充:

为了提供对存储过程的调用,JDBC API 中还提供了 CallableStatement 接口。 存储过程(Stored Procedure) 是数据库中一组为了完成特定功能的 SQL 语句的集合,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。虽然调用存储过程会在网络开销、安全性、性能上获得很多好处,但是存在如果底层数据库发生迁移时就会有很多麻烦,因为每种数据库的存储过程在书写上存在不少的差别。

源链接-掘金

本文含有隐藏内容,请 开通VIP 后查看