java中getResourceAsStream的问题 - 缓存

本文探讨了解决运行状态下property文件更新后无法被正确读取的问题。详细介绍了使用getResourceAsStream()方法时遇到的缓存问题,并提供了一种通过FileInputStream来加载文件的新方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

运行状态下property文件已经被改动了,但是使用getResourceAsStream()方法读取的文件没发生变化,还是和最初启动服务器时的一致。在网上查了一下,有人说是getResourceAsStream()方法读取新文件后会被java虚拟机缓存,而再次调用getResourceAsStream()方法时会先查找java虚拟机中是否有此文件,如果有则直接返回,如果没有才会去根据传入的name获取文件


    final Properties prop = new Properties();
    
    Property(String file){
        
        try {
            prop.load(this.getClass().getResourceAsStream(file));
        } catch (FileNotFoundException e) {
            e.printStackTrace(System.err);
        } catch (IOException e) {
            e.printStackTrace(System.err);
        }
    }

应该改为


    final Properties prop = new Properties();
    
    Property(String file){
        
        try {
            prop.load(new FileInputStream(this.getClass().getResource(file).getFile()));
            
        } catch (FileNotFoundException e) {
            e.printStackTrace(System.err);
        } catch (IOException e) {
            e.printStackTrace(System.err);
        }
    }


<think>我们正在讨论如何在Java代码中加载或引用HTML文件。根据用户的问题,我们需要提供几种方法来实现这个目标。参考已有的引用内容-引用[2]提到了使用WebView加载HTML代码,这适用于Android环境。-引用[1]和[3]提到了类加载和字节码操作,但这不是直接用于HTML的。-引用[4]解释了JVM和字节码,但同样不直接相关。-引用[5]提到了前端资源缓存问题,也不直接相关。因此,我们可以提供以下方法:1.在Java桌面应用(如Swing)中使用JEditorPane来显示HTML。2.在JavaWeb应用中将HTML文件作为资源读取并输出到响应流。3.在Android应用中使用WebView加载HTML。由于用户没有指定是哪种Java环境(桌面、Web还是Android),我们将分别介绍。同时,根据系统指令,我们需要生成相关问题。</think>在Java中加载或引用HTML文件的方法取决于应用场景(桌面应用、Web应用或Android应用)。以下是常见实现方案: ### 一、桌面应用(Swing/JavaFX) #### 1. 使用`JEditorPane`显示HTML(Swing) ```java import javax.swing.*; public class HTMLViewer { public static void main(String[] args) { JFrame frame = new JFrame(); JEditorPane editorPane = new JEditorPane(); editorPane.setContentType("text/html"); editorPane.setText("<html><body><h1>Hello HTML!</h1></body></html>"); frame.add(editorPane); frame.pack(); frame.setVisible(true); } } ``` > **说明**:支持基础HTML4标签,但渲染能力有限[^1]。 #### 2. 使用`WebView`组件(JavaFX) ```java import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.web.WebView; import javafx.stage.Stage; public class HTMLViewerFX extends Application { @Override public void start(Stage stage) { WebView webView = new WebView(); webView.getEngine().loadContent("<h1>JavaFX HTML</h1>"); // 或加载外部文件:webView.getEngine().load("file:///path/to/file.html"); stage.setScene(new Scene(webView, 800, 600)); stage.show(); } } ``` > **优势**:支持现代HTML5/CSS3标准和JavaScript执行[^1]。 ### 二、Web应用(Servlet/JSP) #### 1. 直接转发HTML文件(Servlet) ```java @WebServlet("/showHtml") public class HtmlServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html"); try (InputStream in = getClass().getResourceAsStream("/template.html"); OutputStream out = response.getOutputStream()) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = in.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); } } } } ``` > **路径说明**:HTML文件需放在`src/main/resources/`目录下[^3]。 #### 2. 使用模板引擎(Thymeleaf示例) ```java @Controller public class WebController { @GetMapping("/page") public String showPage(Model model) { model.addAttribute("title", "动态页面"); return "template"; // 对应src/main/resources/templates/template.html } } ``` ### 三、Android应用 #### 使用`WebView`加载HTML ```java WebView webView = findViewById(R.id.webview); webView.loadData("<html><body>中文内容</body></html>", "text/html; charset=UTF-8", null); // 或加载本地文件:webView.loadUrl("file:///android_asset/page.html"); ``` > **字符集注意**:Android 9+需显式指定`charset=UTF-8`避免中文乱码[^2]。 ### 四、通用文件读取方法 ```java // 从类路径读取 String htmlContent = new String(getClass().getResourceAsStream("/file.html").readAllBytes()); // 从绝对路径读取 Path htmlPath = Paths.get("C:/path/to/file.html"); String htmlContent = Files.readString(htmlPath, StandardCharsets.UTF_8); ``` ### 关键注意事项 1. **安全风险**: - 加载外部HTML时需防范XSS攻击 - 避免直接执行未经验证的HTML中的JavaScript 2. **性能优化**: -文件采用流式传输(如Servlet方案) - 缓存常用HTML内容 3. **移动端限制**: - Android 9+需在`WebView`中配置`WebSettings.setSafeBrowsingEnabled(true)` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值