Exception in thread “main“ java.io.FileNotFoundException: C:\Temp (拒绝访问。)

Exception in thread "main" java.io.FileNotFoundException: C:\Temp (拒绝访问。)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(FileInputStream.java:195)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at java.io.FileInputStream.<init>(FileInputStream.java:93)
    at com.lbj.javase.exceptionTest.ExceptionTest06.m3(ExceptionTest06.java:36)
    at com.lbj.javase.exceptionTest.ExceptionTest06.m2(ExceptionTest06.java:28)
    at com.lbj.javase.exceptionTest.ExceptionTest06.m1(ExceptionTest06.java:20)
    at com.lbj.javase.exceptionTest.ExceptionTest06.main(ExceptionTest06.java:14)

 

解决:

当src是文件夹就会报这个错,因为输入流不能读取文件夹,把文件夹路径换成具体的文件路径
当你在进行文件夹的复制的时候要检查代码是不是读取的是文件夹。

<think>好的,用户的问题是如何通过Java代码从类路径资源中加载SQLite数据库文件到临时文件。我需要先理解用户的需求。他们可能有一个打包在项目中的SQLite数据库文件,作为资源存在,想要在运行时将其复制到临时文件,以便应用程序可以读写它。因为直接读取类路径资源可能不可写,所以需要复制到临时位置。 首先,我要回忆Java中处理类路径资源的方法。通常使用ClassLoader的getResourceAsStream方法获取输入流。然后,需要将输入流的内容写入一个临时文件。Java中创建临时文件可以用File.createTempFile方法,但要注意文件的扩展名,比如.db,这样SQLite才能正确识别。 接下来,考虑使用Apache Commons IO库中的IOUtils类来简化流的复制,但用户可能没有这个库,所以也应该提供纯Java的实现。两种方法都值得展示。 然后,处理可能出现的异常,比如资源找不到或者IO异常,需要正确的异常处理,比如抛出RuntimeException或者让调用者处理。 此外,临时文件应该在程序退出时删除,可以使用deleteOnExit()方法,但要注意这可能不会立即删除,特别是在长时间运行的应用程序中。可能还需要在复制完成后关闭流,防止资源泄漏。 还要考虑SQLite JDBC连接的方式,需要确保JDBC URL指向临时文件的路径。比如使用jdbc:sqlite:/path/to/temp.db。 现在,整理步骤:获取资源流,创建临时文件,复制流到文件,然后使用该文件路径连接数据库。需要代码示例,包括使用IOUtils和纯Java的实现。 可能的问题点:资源路径是否正确,临时文件的权限问题,以及不同操作系统下的路径处理。比如,在Windows中路径可能需要转义,但JDBC通常处理得很好。 还要检查是否有常见的错误,比如未关闭流导致文件被占用,或者在复制过程中出现中断导致文件不完整。确保在finally块中关闭流,或者使用try-with-resources。 最后,生成相关问题,帮助用户进一步了解相关主题,比如如何确保临时文件安全,或者如何处理多个并发访问的情况。</think>以下是使用Java从类路径资源加载SQLite数据库到临时文件的完整实现步骤: ### 1. 基础实现方法 ```java public class SQLiteLoader { public static File loadFromClasspath(String resourcePath) throws IOException { // 获取类加载器读取资源流 InputStream inputStream = SQLiteLoader.class.getClassLoader() .getResourceAsStream(resourcePath); if (inputStream == null) { throw new FileNotFoundException("Resource not found: " + resourcePath); } // 创建带.db扩展名的临时文件 File tempFile = File.createTempFile("tempdb", ".db"); tempFile.deleteOnExit(); // 设置JVM退出时删除 try (OutputStream outputStream = new FileOutputStream(tempFile)) { // 使用缓冲区提高复制效率 byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } } finally { inputStream.close(); } return tempFile; } } ``` ### 2. 使用Apache Commons IO优化版 ```java // 需添加依赖:commons-io public class SQLiteLoaderV2 { public static File loadWithCommonsIO(String resourcePath) throws IOException { InputStream inputStream = SQLiteLoaderV2.class.getClassLoader() .getResourceAsStream(resourcePath); File tempFile = File.createTempFile("sqlite", ".db"); tempFile.deleteOnExit(); FileUtils.copyInputStreamToFile(inputStream, tempFile); return tempFile; } } ``` ### 3. 数据库连接示例 ```java public class DBConnectionExample { public static void main(String[] args) { try { File dbFile = SQLiteLoader.loadFromClasspath("sample.db"); String url = "jdbc:sqlite:" + dbFile.getAbsolutePath(); Connection conn = DriverManager.getConnection(url); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM users"); // 处理查询结果... conn.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` ### 关键注意事项: 1. **资源释放**:使用try-with-resources确保流正确关闭[^2] 2. **文件锁定**:SQLite会锁定数据库文件,确保单进程访问 3. **临时文件清理**:推荐组合使用以下两种方式 ```java tempFile.deleteOnExit(); // JVM退出时删除 // 或者显式删除 Runtime.getRuntime().addShutdownHook(new Thread(() -> tempFile.delete())); ``` 4. **路径处理**:Windows系统需要确保路径中的反斜杠转义 ```java String winPath = dbFile.getAbsolutePath().replace("\\", "\\\\"); ``` ### 性能优化建议: - 对于大文件(>10MB),使用NIO通道复制 ```java try (FileChannel inChannel = new FileInputStream(inputFile).getChannel(); FileChannel outChannel = new FileOutputStream(outputFile).getChannel()) { inChannel.transferTo(0, inChannel.size(), outChannel); } ``` - 启用WAL日志模式提升并发性能 ```java Statement pragmaStmt = conn.createStatement(); pragmaStmt.execute("PRAGMA journal_mode=WAL"); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值