Read Resource File

本文介绍了一个用于加载配置文件的Java类实现。该类提供了从指定文件中读取配置信息的功能,并通过异常处理确保了文件流的安全关闭。文章还展示了如何使用类加载器获取资源路径。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

 

public class ConvoyKBConstants {
    /**
     *
     * @param proName
     * @return
     */
    public static String loadConfigFile(String proName) {
        return baseLoad("convoykb.properties", proName);
    }
    /**
     *
     * @param fileName
     * @param proName
     * @return
     */
    public static String loadFile(String fileName,String proName){
        return baseLoad(fileName, proName);
    }
    /**
     *
     * @param fileName
     * @param proName
     * @return
     */
    private static String baseLoad(String fileName, String proName) {
        Properties properties;
        String name = getReasourcePath(fileName);
        properties = new Properties();
        FileInputStream fis=null;
        try {
            fis=new FileInputStream(name);
            properties.load(fis);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
//            log.error("",e);
        } catch (IOException e) {
            e.printStackTrace();
//            log.error("",e);
        }finally{
            try {   
                if(fis!=null)
                  fis.close();
            } catch (IOException e) {               
                e.printStackTrace();
//                log.error("",e);
            }
        }
        return properties.getProperty(proName);
    }
    /**
     *
     * @param resourceName
     * @return
     */
    public static String getReasourcePath(String resourceName) {
//        log.info("loading "+resourceName);       
        if(ConvoyKBConstants.class.getClassLoader().getResource(resourceName)==null) {
//            log.error("Cound not find resource: "+resourceName);
            return resourceName;
        }
        return ConvoyKBConstants.class.getClassLoader().getResource(resourceName).getPath();
    }

在 Linux 系统中,`read` 系统调用报错 `Resource temporarily unavailable`(错误号 11)通常表示当前资源暂时不可用,这可能与文件描述符限制、线程资源、内存资源或系统内核设置相关。以下是可能的原因及解决方法: ### 1. 检查文件描述符限制 Linux 系统对每个进程可打开的文件描述符数量有限制。如果程序尝试打开的文件描述符超过系统限制,可能导致 `read` 调用失败。 - **查看当前限制**: ```bash ulimit -n ``` - **临时增加限制**: ```bash ulimit -n 65536 ``` - **永久修改限制**: 修改 `/etc/security/limits.conf` 文件,添加以下内容: ``` * soft nofile 65536 * hard nofile 65536 ``` - **修改系统级文件描述符限制**: 修改 `/etc/sysctl.conf` 文件,添加: ``` fs.file-max = 100000 ``` 然后执行: ```bash sysctl -p ``` ### 2. 检查线程资源限制 如果程序使用了多线程模型,且线程数超过系统限制,可能导致 `read` 调用失败。 - **查看线程限制**: ```bash ulimit -u ``` - **增加线程限制**: 修改 `/etc/security/limits.conf` 文件,添加: ``` * soft nproc 65536 * hard nproc 65536 ``` ### 3. 检查内存使用情况 当系统内存不足时,`read` 调用也可能因无法分配内存而失败。可以使用以下命令查看内存使用情况: ```bash free -h ``` 如果内存接近耗尽,可以尝试优化程序的内存使用或增加系统内存。 ### 4. 检查系统资源限制 系统层面的资源限制(如 `RLIMIT_NPROC` 和 `RLIMIT_NOFILE`)也可能导致 `read` 调用失败。可以使用 `prlimit` 命令查看和调整进程的资源限制: ```bash prlimit --pid <PID> ``` 如果发现某些资源限制过低,可以通过 `prlimit` 命令调整: ```bash prlimit --pid <PID> --nofile=65536:65536 ``` ### 5. 检查系统日志 系统日志中可能包含更多关于资源限制的信息。可以使用 `dmesg` 或 `journalctl` 查看日志: ```bash dmesg | grep -i "oom" journalctl -xe ``` 如果发现内存不足的提示,可以考虑优化程序逻辑或增加系统资源。 ### 6. 内核参数调优 某些情况下,系统内核参数可能需要调整以支持更高的并发连接或资源使用。可以尝试调整以下参数: - **调整最大线程数**: ```bash sysctl -w kernel.threads-max=999999 ``` - **调整最大文件描述符数**: ```bash sysctl -w fs.file-max=100000 ``` - **调整最大进程数**: ```bash sysctl -w kernel.pid_max=999999 ``` - **持久化设置**: 将上述参数添加到 `/etc/sysctl.conf` 文件中以持久化设置。 ### 7. 检查程序逻辑 如果程序本身存在资源泄漏(如未正确关闭文件描述符或线程),也可能导致资源耗尽。建议检查程序代码,确保所有资源在使用后正确释放。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值