精华内容
下载资源
问答
  • java.io.File找不指定的路径我有一个包含2个包的项目:ListStopWords.txtListStopWords.txt在包(2)中我有一个文本文件ListStopWords.txt,在包(1)中我有一个FileLoadder.这是代码FileLoader:File file = new ...

    如何从Java项目中的相对路径读取文件? java.io.File找不到指定的路径

    我有一个包含2个包的项目:

    ListStopWords.txt

    ListStopWords.txt

    在包(2)中我有一个文本文件ListStopWords.txt,在包(1)中我有一个类FileLoadder.这是代码FileLoader:

    File file = new File("properties\\files\\ListStopWords.txt");

    但有这个错误:

    The system cannot find the path specified

    你能解决一下吗? 谢谢。

    tiendv asked 2019-07-25T13:51:44Z

    10个解决方案

    143 votes

    如果它已经在类路径中,那么只需从类路径中获取它。 请勿在static中使用相对路径。它们依赖于当前工作目录,您无法完全控制Java代码。

    假设static与FileLoader.class类在同一个包中:

    URL url = getClass().getResource("ListStopWords.txt");

    File file = new File(url.getPath());

    或者如果你所追求的只是static:

    InputStream input = getClass().getResourceAsStream("ListStopWords.txt");

    如果文件是-as包名称提示 - 实际上是一个完全属性文件(包含static行),只有“错误”扩展名,那么您可以立即将其提供给static方法。

    Properties properties = new Properties();

    properties.load(getClass().getResourceAsStream("ListStopWords.txt"));

    注意:当您尝试从static上下文中访问它时,请在上面的示例中使用FileLoader.class而不是getClass()。

    BalusC answered 2019-07-25T13:52:31Z

    37 votes

    如果我们要指定文件的相对路径,可以使用以下行。

    File file = new File("./properties/files/ListStopWords.txt");

    santhosh answered 2019-07-25T13:52:59Z

    20 votes

    相对路径在java中使用。运营商。

    。 表示与当前运行的上下文相同的文件夹。

    ..表示当前运行的上下文的父文件夹。

    所以问题是你如何知道java目前正在寻找的路径?

    做一个小实验

    File directory = new File("./");

    System.out.println(directory.getAbsolutePath());

    观察输出,您将了解java正在查找的当前目录。 从那里,只需使用./运算符来定位您的文件。

    例如,如果输出是

    G:\ JAVA8Ws\ MyProject的\内容。

    并且您的文件存在于MyProject简单使用的文件夹中

    File resourceFile = new File("../myFile.txt");

    希望这可以帮助

    Samrat answered 2019-07-25T13:54:26Z

    7 votes

    InputStream in = FileLoader.class.getResourceAsStream("");

    try {

    BufferedReader reader = new BufferedReader(new InputStreamReader(in));

    String line = null;

    while ((line = reader.readLine()) != null) {

    System.out.println(line);

    }

    } catch (Exception e) {

    e.printStackTrace();

    }

    frictionlesspulley answered 2019-07-25T13:54:45Z

    6 votes

    试试.\properties\files\ListStopWords.txt

    bUg. answered 2019-07-25T13:55:13Z

    4 votes

    虽然BalusC提供的答案适用于这种情况,但是当文件路径包含空格时它会中断,因为在URL中,这些将被转换为%20,而不是有效的文件名。 如果使用URI而不是String构造File对象,则将正确处理空格:

    URL url = getClass().getResource("ListStopWords.txt");

    File file = new File(url.toURI());

    Mark Krijgsman answered 2019-07-25T13:55:39Z

    1 votes

    我本可以评论,但我的代表较少。萨姆拉特的回答为我做了这个工作。 最好通过以下代码查看当前目录路径。

    File directory = new File("./");

    System.out.println(directory.getAbsolutePath());

    我只是用它来纠正我在项目中遇到的问题。 请务必使用./返回当前目录的父目录。

    ./test/conf/appProperties/keystore

    Aditya Bhardwaj answered 2019-07-25T13:56:16Z

    0 votes

    我想在src / main // js / Simulator.java中解析'command.json'。 为此我在src文件夹中复制了json文件并给出了这样的绝对路径:

    Object obj = parser.parse(new FileReader("./src/command.json"));

    sver answered 2019-07-25T13:56:42Z

    -1 votes

    如果您尝试从静态方法或静态阻止调用getClass(),则可以执行以下方法。

    您可以在要加载的Properties对象上调用getClass()。

    public static Properties pathProperties = null;

    static {

    pathProperties = new Properties();

    String pathPropertiesFile = "/file.xml;

    InputStream paths = pathProperties.getClass().getResourceAsStream(pathPropertiesFile);

    }

    arun_kk answered 2019-07-25T13:57:16Z

    -1 votes

    如果未读取文本文件,请尝试使用更接近的绝对路径(如果您愿意)你可以使用完整的绝对路径,)像这样:

    FileInputStream fin=new FileInputStream("\\Dash\\src\\RS\\Test.txt");

    假设绝对路径是:

    C:\\Folder1\\Folder2\\Dash\\src\\RS\\Test.txt

    KR N answered 2019-07-25T13:57:51Z

    展开全文
  • 文件的重命名 file.reNameTo()public boolean renameTo(Filedest)重新命名此抽象路径名表示的文件。此方法行为的许多方面都是与平台有关的:重命名操作无法将一个文件从一个文件系统移动另一个文件系统,dest为新...

    文件的重命名   file.reNameTo()

    public boolean renameTo(File dest)

    重新命名此抽象路径名表示的文件。

    此方法行为的许多方面都是与平台有关的:重命名操作无法将一个文件从一个文件系统移动到另一个文件系统,dest为新命名的抽象文件

    public boolean ReName(String path,String newname) {//文件重命名//Scanner scanner=new Scanner(System.in);

    File file=newFile(path);if(file.exists()) {

    File newfile=new File(file.getParent()+File.separator+newname);//创建新名字的抽象文件if(file.renameTo(newfile)) {

    System.out.println("重命名成功!");return true;

    }else{

    System.out.println("重命名失败!新文件名已存在");return false;

    }

    }else{

    System.out.println("重命名文件不存在!");return false;

    }

    }

    文件内容的读取

    File f2=new File(f1,"test.txt");//第一个参数为一个目录文件,第二个参数为要在当前f1目录下要创建的文件

    InputStreamReader reader=new InputStreamReader(new FileInputStream(f2),"GBK");

    BufferedReader bfreader=newBufferedReader(reader);

    String line;while((line=bfreader.readLine())!=null) {//包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null

    System.out.println(line);

    }

    以上方法用于读取文本类文件

    FileInputStream 从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。

    InputStreamReader 是字节流通向字符流的桥梁 第二个参数可以设置字符集

    BufferedReader 内包装 InputStreamReader   从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

    建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)

    文件的写入

    File f1=new File("H://asc//");//传入文件/目录的路径

    File f2=new File(f1,"test.txt");//第一个参数为一个目录文件,第二个参数为要在当前f1目录下要创建的文件

    PrintWriter printWriter=new PrintWriter(new FileWriter(f2,true),true);//第二个参数为true,从文件末尾写入 为false则从开头写入

    printWriter.println("I am your father");

    printWriter.close();//记得关闭输入流

    使用 FileWriter写入字符流    如果要写入诸如图像数据之类的原始字节的流使用FileOutputStream 。

    FileWriter

    public FileWriter(String fileName,

    boolean append)

    参数:fileName - 一个字符串,表示与系统有关的文件名。append - 一个 boolean 值,如果为 true,则将数据写入文件末尾处,而不是写入文件开始处。

    PrintWriter

    public PrintWriter(OutputStream out,

    boolean autoFlush)

    autoFlush - boolean 变量;如果为 true,则 println、 printf 或 format 方法将自动刷新输出缓冲区 如果没有这个参数或者为 false 需要刷新缓冲输入区 fllush()

    文件/文件夹的复制

    文件的复制采用的思路是 先在目标路径下创建好空文件 在利用输入输出流 将从源文件中读取到的数据写入到新文件中

    public void copyFile(String oldfilepath,String newpath) {//复制文件

    File oldfile=newFile(oldfilepath);

    File newfile=new File(newpath+File.separator+oldfile.getName());//创建新抽象文件

    if(!oldfile.exists()||!oldfile.isFile()) {

    System.out.println("复制文件莫得¿¿¿");return;

    }if(newfile.exists()) {//新文件路径下有同名文件

    System.out.println("是否覆盖原有文件¿(y不覆盖|n覆盖)");

    Scanner scanner=newScanner(System.in);

    String string=scanner.nextLine();if(string=="n") {

    newfile.delete();try{

    newfile.createNewFile();

    }catch(IOException e) {//TODO Auto-generated catch block

    e.printStackTrace();

    }

    }else{

    newfile=new File(newpath+File.separator+"(1)"+newfile.getName());try{

    newfile.createNewFile();

    }catch(IOException e) {//TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    }else{try{

    newfile.createNewFile();

    }catch(IOException e) {//TODO Auto-generated catch block

    e.printStackTrace();

    }

    }try{

    FileInputStream fin=new FileInputStream(oldfile);//输入流

    try{

    FileOutputStream fout=new FileOutputStream(newfile,true);//输出流

    byte[]b=new byte[1024];try{while((fin.read(b))!=-1) {//读取到末尾 返回-1 否则返回读取的字节个数

    fout.write(b);

    }

    fin.close();

    fout.close();

    }catch(IOException e) {//TODO Auto-generated catch block

    e.printStackTrace();

    }

    }catch(FileNotFoundException e) {//TODO Auto-generated catch block

    e.printStackTrace();

    }

    }catch(FileNotFoundException e) {//TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    文件夹的复制

    如果是空文件夹倒还好说,直接新建同名文件夹 。但如果是含有文件内容的文件夹的话  需要使用深度优先遍历文件夹。 如果是文件夹 就在对应路径下创建空文件夹 再递归调用函数遍历自身   如果是文件 则直接复制过来

    public void dfs(File f1,File f2) {//f1要复制的文件 f2要复制到的路径

    if(f1.isFile()&&f1.exists()) {//文件

    copyFile(f1.getAbsolutePath(), f2.getAbsolutePath());return;

    }if(f1.isDirectory()) {

    File file2=new File(f2.getAbsoluteFile()+File.separator+f1.getName());

    file2.mkdirs();

    String []list=f1.list();for (int i = 0; i < list.length; i++) {

    File file1=new File(f1.getAbsoluteFile()+File.separator+list[i]);

    dfs(file1, file2);

    }

    }

    }public void copydir(String oldfilepath,String newfilepath) {//复制文件夹

    File oldfile=newFile(oldfilepath);

    File newfile=new File(newfilepath+File.separator+oldfile.getName());if(!oldfile.exists()||!oldfile.isDirectory()) {

    System.out.println("此文件夹不存在!");return;

    }if(newfile.exists()) {

    System.out.println("是否覆盖原有文件夹¿(y不覆盖|n覆盖)");

    Scanner scanner=newScanner(System.in);

    String string=scanner.nextLine();if(string=="n") {

    deleteFile(newfile.getAbsolutePath());

    }else

    return;

    }//dfs

    dfs(oldfile, newFile(newfilepath));return;

    }

    注意 再使用输入输出流后记得 用close()函数关闭 输入输出流.  如果一个文件被打开着 没被关闭  另一个程序想要访问时 就会报错异常

    文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。文件是否可用或能否可以被创建取决于基础平台。

    特别是某些平台一次只允许一个 FileOutputStream(或其他文件写入对象)打开文件进行写入。在这种情况下,如果所涉及的文件

    已经打开,则此类中的构造方法将失败

    展开全文
  • ------- android培训、 java培训、期待与您交流! ---------- Java基础视频笔记第五,本地文件操作: 1、File类简介: ... * 如果不指定路径,默认会创建工程目录File类用来将文件或者文件夹封装成对象,方便对文...

    ------- android培训、 java培训、期待与您交流! ---------- Java基础视频笔记第五,本地文件操作: 1、File类简介: File file = new File("D:\\File.txt");//读取本地的file文件 创建文件:file.createNewFile(); * 如果不指定路径,默认会创建到工程目录

    File类用来将文件或者文件夹封装成对象,方便对文件与文件夹的属性信息进行操作。

    File对象可以作为参数传递给流的构造函数。 获取C盘下的隐藏目录文件名称 import java.io.File;import java.io.FilenameFilter;public class FileDemos{

    public static void main(String[] args)

    {

    // 获取C盘下的隐藏目录

    File

    file = new File("c:\\");

    File[] files = file.listFiles(new FileByHiddan());

    for(File f:files)

    {

    System.out.println(f);

    }

    }}class FileByHiddan implements FilenameFilter{

    @Override

    public boolean accept(File dir, String name) {

    // TODO Auto-generated method stub

    return dir.isHidden();

    }

    } 运行程序:

    展开全文
  • 最近的工作涉及创建和读取文件的工作,这里我就给大家彻底得解决Java路径问题。我编写了一个方法,比ClassLoader.getResource(String 相对路径)方法的能力更强。它可以接受“../”这样的参数,允许我们用相对路径...

    这篇写的相当好。收藏

    前言

    Java的路径问题,非常难搞。最近的工作涉及到创建和读取文件的工作,这里我就给大家彻底得解决Java路径问题。

    我编写了一个方法,比ClassLoader.getResource(String 相对路径)方法的能力更强。它可以接受“../”这样的参数,允许我们用相对路径来定位classpath外面的资源。这样,我们就可以使用相对于classpath的路径,定位所有位置的资源!

    Java路径

    Java中使用的路径,分为两种:绝对路径和相对路径。具体而言,又分为四种:

    一、URI形式的绝对资源路径

    如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b

    URL是URI的特例。URL的前缀/协议,必须是Java认识的。URL可以打开资源,而URI则不行。

    URL和URI对象可以互相转换,使用各自的toURI(),toURL()方法即可!

    二、本地系统的绝对路径

    D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b

    Java.io包中的类,需要使用这种形式的参数。

    但是,它们一般也提供了URI类型的参数,而URI类型的参数,接受的是URI样式的String。因此,通过URI转换,还是可以把URI样式的绝对路径用在java.io包中的类中。

    三、相对于classpath的相对路径

    如:相对于

    file:/D:/java/eclipse32/workspace/jbpmtest3/bin/这个路径的相对路径。其中,bin是本项目的classpath。所有的Java源文件编译后的.class文件复制到这个目录中。

    四、相对于当前用户目录的相对路径

    就是相对于System.getProperty("user.dir")返回的路径。

    对于一般项目,这是项目的根路径。对于JavaEE服务器,这可能是服务器的某个路径。这个并没有统一的规范!

    所以,绝对不要使用“相对于当前用户目录的相对路径”。然而:

    默认情况下,java.io 包中的类总是根据当前用户目录来分析相对路径名。此目录由系统属性 user.dir 指定,通常是 Java 虚拟机的调用目录。

    这就是说,在使用java.io包中的类时,最好不要使用相对路径。否则,虽然在J2SE应用程序中可能还算正常,但是到了J2EE程序中,一定会出问题!而且这个路径,在不同的服务器中都是不同的!

    相对路径最佳实践

    推荐使用相对于当前classpath的相对路径

    因此,我们在使用相对路径时,应当使用相对于当前classpath的相对路径。

    ClassLoader类的getResource(String name),getResourceAsStream(String name)等方法,使用相对于当前项目的classpath的相对路径来查找资源。

    读取属性文件常用到的ResourceBundle类的getBundle(String path)也是如此。

    通过查看ClassLoader类及其相关类的源代码,我发现,它实际上还是使用了URI形式的绝对路径。通过得到当前classpath的URI形式的绝对路径,构建了相对路径的URI形式的绝对路径。(这个实际上是猜想,因为JDK内部调用了SUN的源代码,而这些代码不属于JDK,不是开源的。)

    相对路径本质上还是绝对路径

    因此,归根结底,Java本质上只能使用绝对路径来寻找资源。所有的相对路径寻找资源的方法,都不过是一些便利方法。不过是API在底层帮助我们构建了绝对路径,从而找到资源的!

    得到classpath和当前类的绝对路径的一些方法

    下面是一些得到classpath和当前类的绝对路径的一些方法。你可能需要使用其中的一些方法来得到你需要的资源的绝对路径。

    1,FileTest.class.getResource("")

    得到的是当前类FileTest.class文件的URI目录。不包括自己!

    如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/com/test/

    2,FileTest.class.getResource("/")

    得到的是当前的classpath的绝对URI路径。

    如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

    3,Thread.currentThread().getContextClassLoader().getResource("")

    得到的也是当前ClassPath的绝对URI路径。

    如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

    4,FileTest.class.getClassLoader().getResource("")

    得到的也是当前ClassPath的绝对URI路径。

    如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

    5,ClassLoader.getSystemResource("")

    得到的也是当前ClassPath的绝对URI路径。

    如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

    我推荐使用Thread.currentThread().getContextClassLoader().getResource("")来得到当前的classpath的绝对路径的URI表示法。

    Web应用程序中资源的寻址

    上文中说过,当前用户目录,即相对于System.getProperty("user.dir")返回的路径。

    对于JavaEE服务器,这可能是服务器的某个路径,这个并没有统一的规范!

    而不是我们发布的Web应用程序的根目录!

    这样,在Web应用程序中,我们绝对不能使用相对于当前用户目录的相对路径。

    在Web应用程序中,我们一般通过ServletContext.getRealPath("/")方法得到Web应用程序的根目录的绝对路径。

    这样,我们只需要提供相对于Web应用程序根目录的路径,就可以构建出定位资源的绝对路径。

    这是我们开发Web应用程序时一般所采取的策略。

    通用的相对路径解决办法

    Java中各种相对路径非常多,不容易使用,非常容易出错。因此,我编写了一个便利方法,帮助更容易的解决相对路径问题。

    Web应用程序中使用JavaSE运行的资源寻址问题

    在JavaSE程序中,我们一般使用classpath来作为存放资源的目的地。但是,在Web应用程序中,我们一般使用classpath外面的WEB-INF及其子目录作为资源文件的存放地。

    在Web应用程序中,我们一般通过ServletContext.getRealPath("/")方法得到Web应用程序的根目录的绝对路径。这样,我们只需要提供相对于Web应用程序根目录的路径,就可以构建出定位资源的绝对路径。

    Web应用程序,可以作为Web应用程序进行发布和运行。但是,我们也常常会以JavaSE的方式来运行Web应用程序的某个类的main方法。或者,使用JUnit测试。这都需要使用JavaSE的方式来运行。

    这样,我们就无法使用ServletContext.getRealPath("/")方法得到Web应用程序的根目录的绝对路径。

    而JDK提供的ClassLoader类,

    它的getResource(String name),getResourceAsStream(String name)等方法,使用相对于当前项目的classpath的相对路径来查找资源。

    读取属性文件常用到的ResourceBundle类的getBundle(String path)也是如此。

    它们都只能使用相对路径来读取classpath下的资源,无法定位到classpath外面的资源。

    Classpath外配置文件读取问题

    如,我们使用测试驱动开发的方法,开发Spring、Hibernate、iBatis等使用配置文件的Web应用程序,就会遇到问题。

    尽管Spring自己提供了FileSystem(也就是相对于user,dir目录)来读取Web配置文件的方法,但是终究不是很方便。而且与Web程序中的代码使用方式不一致!

    至于Hibernate,iBatis就更麻烦了!只有把配置文件移到classpath下,否则根本不可能使用测试驱动开发!

    这怎么办?

    通用的相对路径解决办法

    面对这个问题,我决定编写一个助手类ClassLoaderUtil,

    提供一个便利方法[public static URL getExtendResource(String relativePath)]。在Web应用程序等一切Java程序中,需要定位classpath外的资源时,都使用这个助手类的便利方法,而不使用Web应用程序特有的ServletContext.getRealPath("/")方法来定位资源。

    利用classpath的绝对路径,定位所有资源

    这个便利方法的实现原理,就是“利用classpath的绝对路径,定位所有资源”。

    ClassLoader类的getResource("")方法能够得到当前classpath的绝对路径,这是所有Java程序都拥有的能力,具有最大的适应性!

    而目前的JDK提供的ClassLoader类的getResource(String 相对路径)方法,只能接受一般的相对路径。这样,使用ClassLoader类的getResource(String 相对路径)方法就只能定位到classpath下的资源。

    如果,它能够接受“../”这样的参数,允许我们用相对路径来定位classpath外面的资源,那么我们就可以定位位置的资源!

    当然,我无法修改ClassLoader类的这个方法,于是,我编写了一个助手类ClassLoaderUtil类,提供了[public static URL getExtendResource(String relativePath)]这个方法。它能够接受带有“../”符号的相对路径,实现了自由寻找资源的功能。

    通过相对classpath路径实现自由寻找资源的助手类的源代码:

    import java.io.IOException;

    import java.io.InputStream;

    import java.net.MalformedURLException;

    import java.net.URL;

    import java.util.Properties;

    import org.apache.commons.logging.Log;

    import org.apache.commons.logging.LogFactory;

    /***@author沈东良shendl_s@hotmail.com

    *Nov29,2006 10:34:34AM

    *用来加载类,classpath下的资源文件,属性文件等。

    *getExtendResource(StringrelativePath)方法,可以使用../符号来加载classpath外部的资源。

    */

    publicclass ClassLoaderUtil {

    privatestatic Log log=LogFactory.getLog(ClassLoaderUtil.class);

    /**

    *Thread.currentThread().getContextClassLoader().getResource("")

    */

    /**

    *加载Java类。 使用全限定类名*@paramclassName

    *@return

    */

    publicstatic Class loadClass(String className) {

    try {

    return getClassLoader().loadClass(className);

    } catch (ClassNotFoundException e) {

    thrownew RuntimeException("class not found ’"+className+"’", e);

    }

    }

    /**

    *得到类加载器*@return

    */

    publicstatic ClassLoader getClassLoader() {

    return ClassLoaderUtil.class.getClassLoader();

    }

    /**

    *提供相对于classpath的资源路径,返回文件的输入流*@paramrelativePath必须传递资源的相对路径。是相对于classpath的路径。如果需要查找classpath外部的资源,需要使用../来查找*@return文件输入流*@throwsIOException

    *@throwsMalformedURLException

    */

    publicstatic InputStream getStream(String relativePath) throws MalformedURLException, IOException {

    if(!relativePath.contains("../")){

    return getClassLoader().getResourceAsStream(relativePath);

    }else{

    return ClassLoaderUtil.getStreamByExtendResource(relativePath);

    }

    }

    /**

    **@paramurl

    *@return

    *@throwsIOException

    */

    publicstatic InputStream getStream(URL url) throws IOException{

    if(url!=null){

    return url.openStream();

    }else{

    returnnull;

    }

    }

    /**

    **@paramrelativePath必须传递资源的相对路径。是相对于classpath的路径。如果需要查找classpath外部的资源,需要使用../来查找*@return

    *@throwsMalformedURLException

    *@throwsIOException

    */

    publicstatic InputStream getStreamByExtendResource(String relativePath) throws MalformedURLException, IOException{

    return ClassLoaderUtil.getStream(ClassLoaderUtil.getExtendResource(relativePath));

    }

    /**

    *提供相对于classpath的资源路径,返回属性对象,它是一个散列表*@paramresource

    *@return

    */

    publicstatic Properties getProperties(String resource) {

    Properties properties = new Properties();

    try {

    properties.load(getStream(resource));

    } catch (IOException e) {

    thrownew RuntimeException("couldn’t load properties file ’"+resource+"’", e);

    }

    return properties;

    }

    /**

    *得到本Class所在的ClassLoader的Classpat的绝对路径。

    *URL形式的*@return

    */

    publicstatic String getAbsolutePathOfClassLoaderClassPath(){

    ClassLoaderUtil.log.info(ClassLoaderUtil.getClassLoader().getResource("").toString());

    return ClassLoaderUtil.getClassLoader().getResource("").toString();

    }

    /**

    **@paramrelativePath必须传递资源的相对路径。是相对于classpath的路径。如果需要查找classpath外部的资源,需要使用../来查找*@return资源的绝对URL*@throwsMalformedURLException

    */

    publicstatic URL getExtendResource(String relativePath) throws MalformedURLException{

    ClassLoaderUtil.log.info("传入的相对路径:"+relativePath) ;

    //ClassLoaderUtil.log.info(Integer.valueOf(relativePath.indexOf("../"))) ;

    if(!relativePath.contains("../")){

    return ClassLoaderUtil.getResource(relativePath);

    }

    String classPathAbsolutePath=ClassLoaderUtil.getAbsolutePathOfClassLoaderClassPath();

    if(relativePath.substring(0, 1).equals("/")){

    relativePath=relativePath.substring(1);

    }

    ClassLoaderUtil.log.info(Integer.valueOf(relativePath.lastIndexOf("../"))) ;

    String wildcardString=relativePath.substring(0,relativePath.lastIndexOf("../")+3);

    relativePath=relativePath.substring(relativePath.lastIndexOf("../")+3);

    int containSum=ClassLoaderUtil.containSum(wildcardString, "../");

    classPathAbsolutePath= ClassLoaderUtil.cutLastString(classPathAbsolutePath, "/", containSum);

    String resourceAbsolutePath=classPathAbsolutePath+relativePath;

    ClassLoaderUtil.log.info("绝对路径:"+resourceAbsolutePath) ;

    URL resourceAbsoluteURL=new URL(resourceAbsolutePath);

    return resourceAbsoluteURL;

    }

    /**

    **@paramsource

    *@paramdest

    *@return

    */

    privatestaticint containSum(String source,String dest){

    int containSum=0;

    int destLength=dest.length();

    while(source.contains(dest)){

    containSum=containSum+1;

    source=source.substring(destLength);

    }

    return containSum;

    }

    /**

    **@paramsource

    *@paramdest

    *@paramnum

    *@return

    */

    privatestatic String cutLastString(String source,String dest,int num){

    // String cutSource=null;

    for(int i=0;i

    source=source.substring(0, source.lastIndexOf(dest, source.length()-2)+1);

    }

    return source;

    }

    /**

    **@paramresource

    *@return

    */

    publicstatic URL getResource(String resource){

    ClassLoaderUtil.log.info("传入的相对于classpath的路径:"+resource) ;

    return ClassLoaderUtil.getClassLoader().getResource(resource);

    }

    /***@paramargs

    *@throwsMalformedURLException

    */

    publicstaticvoid main(String[] args) throws MalformedURLException {

    //ClassLoaderUtil.getExtendResource("../spring/dao.xml");

    //ClassLoaderUtil.getExtendResource("http://www.cnblogs.com/../src/log4j.properties");

    ClassLoaderUtil.getExtendResource("log4j.properties");

    System.out.println(ClassLoaderUtil.getClassLoader().getResource("log4j.properties").toString());

    }

    }

    后记

    ClassLoaderUtil类的public static URL getExtendResource(String relativePath),虽然很简单,但是确实可以解决大问题。

    不过这个方法还是比较简陋的。我还想在未来有空时,进一步增强它的能力。比如,增加Ant风格的匹配符。用**代表多个目录,*代表多个字符,?代表一个字符。达到Spring那样的能力,一次返回多个资源的URL,进一步方便大家开发。

    总结:

    1,尽量不要使用相对于System.getProperty("user.dir")当前用户目录的相对路径。这是一颗定时炸弹,随时可能要你的命。

    2,尽量使用URI形式的绝对路径资源。它可以很容易的转变为URI,URL,File对象。

    3,尽量使用相对classpath的相对路径。不要使用绝对路径。使用上面ClassLoaderUtil类的public static URL getExtendResource(String relativePath)方法已经能够使用相对于classpath的相对路径定位所有位置的资源。

    4,绝对不要使用硬编码的绝对路径。因为,我们完全可以使用ClassLoader类的getResource("")方法得到当前classpath的绝对路径。

    使用硬编码的绝对路径是完全没有必要的!它一定会让你死的很难看!程序将无法移植!

    如果你一定要指定一个绝对路径,那么使用配置文件,也比硬编码要好得多!

    当然,我还是推荐你使用程序得到classpath的绝对路径来拼资源的绝对路径!

    展开全文
  • 来自src / main / resources的资源会自动复制目标/类,因此可以在Maven和Eclipse下的类路径上相对于同一位置的根级别提供(除非您的Eclipse项目未正确配置).当在JAR中打包时,目标/类的内容将“按原样”打包,因此不会...
  • 一、引言IO(输入/输出),输入是指允许程序读取外部数据(包括来自磁盘、光盘等存储设备的数据)、用户输入数据。输出是指允许程序记录运行状态,将程序数据...回到顶部二、File 类File 是用来操作文件和目录的,Fil...
  • 文件的重命名 file.reNameTo()public boolean renameTo(Filedest)重新命名此抽象路径名表示的文件。此方法行为的许多方面都是与平台有关的:重命名操作无法将一个文件从一个文件系统移动另一个文件系统,dest为新...
  • 此工具优先从项目路径读取配置文件读取时从classpath获取配置文件。使用方式:开发时直接读取项目资源目录下的 properties即可打成jar包使用时,将配置文件与jar包放置在同一目录代码:import java.io....
  • 文件的重命名 file.reNameTo() public boolean renameTo(Filedest) 重新命名此抽象路径名表示的文件。 此方法行为的许多方面都是与平台有关的:重命名操作无法将一个文件从一个文件系统移动另一个文件系统,...
  • 将test.properties的文件读取赋值给静态变量创建一个final可以两种方式读取test.properties配置文件第一种:此方法可以写配置文件的绝对路径InputStream is = new BufferedInputStream(new FileInputStream(new ...
  • 文件读取需要找到文件具体在什么地方,有相对路径和绝对路径; 绝对路径就是相对于操作系统的路径,比如在windows下的D:\XX\file.txt; 相对路径则是针对想在运行的项目环境的路径,可以执行可以通过项目所在的...
  • Java读取本地文件和读取指定网页

    千次阅读 2016-11-02 16:48:10
    读取本地文件通过本地文件路径,把文件构造成File,通过流的读取,把文件内容一行行地读String中。 下面是代码: 工具 package filecontrol;import java.io.BufferedReader; import java.io.File; import ...
  • File是个文件类,可以用其增加、删除、查找某种类型的文件或者文件夹,同时根据其成员变量的特点可以综合利用,避免出现跨系统的时候出现错误,并且查找时最好输入绝对路径,以免出现不存在的文件。使用递归时一定要...
  • 此工具优先从项目路径读取配置文件读取时从classpath获取配置文件。使用方式:开发时直接读取项目资源目录下的 properties即可打成jar包使用时,将配置文件与jar包放置在同一目录代码:import java.io....
  • 将test.properties的文件读取赋值给...InputStream is = new BufferedInputStream(new FileInputStream(new File("F:\\java\\idea-workspace\\javaDemoForTest\\src\\test.properties"))); 第二种:此时test.properti.
  • java 读取 txt 文件

    2017-05-03 15:52:00
     1、首先要根据路径获取你的 txt 文本文件File file = new File(path);  2、将获取的这个字节码流读进缓存。new FileInputStream(file) ;  3、然后对刚才读进缓存的输入流进行解读,生成对应字节流。...
  • 中通过@Value注解获取csvFilePath值 @Value("${csvFilePath}") public String filePath; 2、获取目标文件夹下的所有.csv文件(获取单个文件也可) File root = new File(filePath); File[] fileList = root....
  • Java读取和修改properties文件 方法说明: 1.Properties getProperties(String filepath):根据路径读取属性文件,返回Properties; 2.void saveProperties(Properties prop,String filepath):保存属性指定...
  • 为了永久地保存在程序中创建的数据,我们需要将它们存储磁盘上或者其他永久存储设备的文件中,这些文件之后可以被其他的程序传输和读取,这就是持久化的过程。而java.io包下的File实用类库就可以被运用操作这些...
  • 个人理解:File是个文件类,可以用其增加、删除、查找某种类型的文件或者文件夹,同时根据其成员变量的特点可以综合利用,避免出现跨系统的时候出现错误,并且查找时最好输入绝对路径,以免出现不存在的文件。...
  • 通俗易懂理解IO:当需要把内存中的数据存储持久化设备上这个动作...File类可以操作文件或者文件夹。1)封装成file对象构造函数构造方法摘要 File(File parent, String child) // 根据 parent 抽象路径名和 child ...
  • File(文件类)尽管java.io定义的大多数是实行流式操作的,File类不是。它直接处理文件文件系统。也就是说,File类没有指定信息怎样从文件读取或向文件存储;它描述了文件本身的属性。File对象用来获取或处理与...
  • 文章目录小白学JavaFile类不同风格的分隔符绝对与相对路径File类常用方法常用构造器创建方法判断方法获取方法命名方法删除方法 小白学JavaFile类 我们可以知道,存储在程序中的数据是暂时的,在程序终止的时候,...
  • java当中File类的相对路径问题

    千次阅读 2017-08-14 13:29:51
    不管你是新手还是老鸟,在程序中读取资源文件总会遇到一些找不到文件的问题,这与Java底层的实现有关,不能算bug,只要方法得当,问题还是可以解决的。   项目的文件夹结构: repathtest ├─src │ └...
  • 程序将内存中的数据存储持久化设备上,叫作输出Output程序将数据从持久化设备上读取到内存中,叫作输入Input一、 File类JAVA将系统中的文件路径、目录封装成一个对象,将提供给这个对象很多方法,使之能对系统...
  • Java File类

    2021-02-19 19:39:58
    IO流 流分类 按流向分 1.输入流:数据源程序 2.输出流:程序目的地 按功能分 1.节点流:可以直接从数据源或目的地读写数据 2.处理流(包装流):不直接连接...File文件和目录路径名的抽象表示 //构建File对象 Stri
  • Java File类的使用

    2020-01-01 20:23:34
    后续File类的对象常作为参数传递流的构造器中,指明读取或写入的"节点",即从哪个文件读取内容以及写入哪个文件中去。 File操作文件或文件夹,如查看路径,文件名,是否可读,可写,文件大小等;对于文件中的...
  •   使用File类读取文件时获取的路径全是B程序调用的位置,无法定位jar内。 3.问题解决   Ajar中读取文件的程序使用XXX.class.getClassLoader().getResourceAsStream()方法可以读取到txt public class ...
  • Java学习笔记 -- File类

    2021-01-26 20:24:54
    File类中涉及关于文件文件目录的创建、删除、重命名、查看修改时间、查看文件大小等方法,并未涉及写入或读取文件内容的操作,如果需要读取或写入文件内容,必须使用IO流完成 File类的对象常会作为参数传递...
  • JavaFile类的使用

    2020-12-13 22:54:08
    3.File类中涉及关于文件文件目录的创建、删除、重命名、修改时间、文件大小等方法,并未涉及写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO流来完成。 4.后续File类的对象常会作为参数...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 220
精华内容 88
关键字:

java读取类路径文件到file

java 订阅