Existem dois métodos comumente usados para carregar arquivos de recursos:
1. Use ClassLoader Neste ponto, devo mencionar a classificação do ClassLoader. Existem três tipos principais de ClassLoader integrados em Java.
O primeiro é o carregador de classes raiz (carregador de classes bootstrap), escrito em C++, que é responsável por carregar algumas classes Java importantes, como java.lang.Object e outros códigos de tempo de execução na memória. O pacote responsável pelo carregamento: BootStrp------>JRE/lib/rt.jar
O segundo é o carregador de classes estendido (ExtClassLoader), que é escrito pela classe java e é responsável por carregar algumas classes do JRE na memória. O pacote responsável pelo carregamento: ExtClassLoader---------->JRE/lib/ext/*.jar
O terceiro tipo é o carregador de classes do aplicativo (AppClassLoader), ou carregador de classes do sistema, que é responsável por carregar classes em CLASSPATH na memória. O carregador de classes da aplicação pode ser obtido por meio de ClassLoader.getSystemClassLoader();
Vamos falar sobre a herança dos carregadores de classes. Os carregadores de classes não são um relacionamento pai-filho de herança vertical, mas um relacionamento de combinação. Ao instanciar um carregador de classes, a instância do carregador de classes pai pode ser passada para o carregador de classes como uma construção. parâmetro no navio.
Para obter informações detalhadas sobre carregadores de classes, você mesmo pode pesquisar.
Depois de obter o carregador de classes do aplicativo, é hora de obter o arquivo de recursos. Chame loader.getResource(path) para carregar o arquivo de recursos no caminho correspondente. Em relação aos recursos do pacote, você pode. trate o pacote como uma pasta comum, separe cada pacote com '/'.
Por exemplo: URL url2 = ClassLoader.getSystemClassLoader().getResource("demo/names.ser"); é para obter o arquivo de serialização names.ser no pacote demo.
2. Use o método getResource da classe atual que precisa ser carregada para carregar. Na verdade, esse método também chama o carregador de classes que carrega essa classe para obter o arquivo de recurso, mas os parâmetros obtidos são diferentes.
(1) Se você deseja obter os arquivos do pacote onde a classe está localizada, você pode usar caminhos relativos para acessar diretamente os recursos do pacote, por exemplo: Demo1.class.getResource("names.ser"); você obtém os recursos do pacote onde o arquivo de classe Demo1 está localizado.
(2) Para obter arquivos de recursos fora do pacote, eles devem começar com '/', como URL url = Demo1.class.getResource("/demo/names.ser"); o pacote de demonstração
Na verdade, o segundo método é um encapsulamento do primeiro método e ambos usam ClassLoader para carregar arquivos de recursos. Por que você diz isso? Se você olhar o código-fonte da classe Class, saberá: