java 读取文件最佳实践

  1. 1.  前言

Java应用中很常见的一个问题,如何读取jar/war包内和所在路径的配置文件,不同的人根据不同的实践总结出了不同的方案,但其他人应用却会因为环境等的差异发现各种问题,本文则从原理上解释最佳实践。

  1. 2.  参考方案

2.1.log4j

log4j读取配置的代码是:

PropertyConfigurator.configure(“log4j.properties”);

实际执行的文件读取是:

FileInputStream istream = new FileInputStream(configFileName);

也就是执行环境${PWD}中查找文件,这个路径与new File()的路径是一样的。

2.2.hibernate

hibernate读取配置的代码是:

Configuration configuration = new Configuration().configure(“hibernate.cfg.xml”);

实际执行的文件读取是:

String stripped = resource.startsWith(“/”) ? resource.substring(1) : resource;

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

InputStream stream = classLoader.getResourceAsStream(stripped);

是通过类加载器的相对路径来查找文件,这种方式好处是可以读取jar中的文件,而且是new File()无法模拟的。

  1. 3.  方案分析

3.1.方案对比

相对而言,hibernate的文件读取更加实用,主要因为可以读取普通文件,也可以读取jar/war中的文件,相对更通用。

3.2.参考文档

更常见的情况是使用Class.getResourceAsStream(String name),实际上最终会调用ClassLoader.getSystemResourceAsStream,但很多人对于getResourceAsStream并不完全理解,所以很疑惑有些时候需要在路径上加上“/”,有些时候不用。

简单来说ClassLoader的基础路径是固定,而Class的基础路径则不相同,所以ClassLoader都是相对路径,Class读取则存在绝对路径和相对路径两种情况。

Class.getResourceAsStream文档中有解释:

(1)如果name以“/”开头,则是读取${PWD}下的文件。应用与读取jar同级别路径的文件如hibernate.cfg.xml。

(2)如果name不以“/”开头,则是读取Class所在路径package下的文件。应用于读取与Class有关的文件如*.hbm.xml。

  1. 4.  实践应用

4.1.最优方案

由于Class.getResourceAsStream会继续调用ClassLoader的方法,那么建立一个单例的ClassLoader是最优的方案,比如hibernate的实现。

结合maven来说,src/main/resources中的文件都使用ClassLoader.getSystemResourceAsStream(“log4j.properties”)方式读取,对于*.hbm.xml等ORM映射文件等则需要加上包路径,如“com/zheezes/*.hbm.xml”。

4.2.最佳实践

不过由于getClass()方式更简洁,而且性能损失非常小,所以实际使用中,直接调用getClass().getResourceAsStream()的方式更为常用。

结合maven来说,src/main/resources中的文件都使用绝对路径getClass().getResourceAsStream(“/log4j.properties”)方式读取,对于*.hbm.xml等ORM映射文件则一般在PO的Class中直接使用相对路径“*.hbm.xml”来读取。

时间: 2024-10-28 12:59:42

java 读取文件最佳实践的相关文章

避免Java中NullPointerException的Java技巧和最佳实践

Java中的NullPointerException是我们最经常遇到的异常了,那我们到底应该如何在编写代码是防患于未然呢.下面我们就从几个方面来入手,解决这个棘手的?问题吧.? 值得庆幸的是,通过应用一些防御性编码技术并遵循应用程序多个部分之间的约定,您可以在一定程度上避免Java中的NullPointerException. 顺便说一下,在本文中,我们将学习一些Java的编码技术和最佳实践,这些技巧和最佳实践可用于避免的Java中的空指针异常.遵循这些Java的技巧还可以最大程度地减少很多Ja

Java读取文件的注意点

关于Java读取UTF-8和UTF-8 BOM文件的问题记录在此,仅给自己提个醒. 今天从文本文件中读取数据存储到数据库中,操作完之后检验数据库发现有一些记录出现差错,几经排查(╮(╯Д╰)╭,自己忘了把异常输出,费了不少时间.),发现都是每个文本文件下的第一行出现差错,终于找到原因了,是文件的编码惹的祸.存储数据的文本文件编码类型为UTF-8 BOM,文件编码类型该了一下,再一检验,问题解决. 处理方法可以参考http://www.2cto.com/kf/201108/98509.html J

Java读取文件夹大小的6种方法及代码

这篇文章介绍了JAVA读取文件夹大小的几种方法实例,有需要的朋友可以参考一下. (一)单线程递归方式 package com.taobao.test; import java.io.File; public class TotalFileSizeSequential { public static String fileName = "C:\\Documents and Settings\\Administrator\\桌面\\monkeytalk"; // 递归方式 计算文件的大小

[Java]读取文件方法大全(转)

[Java]读取文件方法大全 1.按字节读取文件内容2.按字符读取文件内容3.按行读取文件内容 4.随机读取文件内容 public class ReadFromFile {    /**     * 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件.     */    public static void readFileByBytes(String fileName) {        File file = new File(fileName);        Input

【转】Java读取文件方法大全

本文转自:http://www.cnblogs.com/lovebread/archive/2009/11/23/1609122.html#undefined 目录: 按字节读取文件内容 按字符读取文件内容 按行读取文件内容 随机读取文件内容 将内容追加到文件尾部 public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件. */ public static void readFileByBytes(String fil

Java读取文件,将字符串转化成日期类型,将日期类型进行加减

最近总用Java读取文件,发现了一种我个人觉得比较好的方法,现在分享给大家 public static void main(String[] args) throws Exception { FileInputStream f = new FileInputStream("文件路径"); InputStreamReader fileInputStream = new InputStreamReader(f); BufferedReader br = new BufferedReader

java读取文件最后N行

原文:java读取文件最后N行 源代码下载地址:http://www.zuidaima.com/share/1550463669226496.htm 指定行数,可以获取到从这行到文件尾的所有行,分享自大熊. 源文件: 读取最后10行结果 import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.util.ArrayList; import java.util.List

Java读取文件 利用MappedByteBuffer进行缓冲

Java读取文件 利用MappedByteBuffer进行缓冲,这样可以保证边读取大文件,边进行处理 package sean; import java.io.ByteArrayInputStream; import java.io.File; import java.io.RandomAccessFile; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.util.Scann

JAVA 单实例最佳实践

1.public class Singleton { private static class SingletonHolder { public static Singleton resource = new Singleton(); public static Singleton getResource() { return SingletonHolder.resource ; private Singleton(){ 2.public class Singleton { public sta