【问题标题】:Relative path to store a file in any computer - Java在任何计算机中存储文件的相对路径 - Java
【发布时间】:2013-01-31 17:26:42
【问题描述】:

我使用this reference 来读取我项目中的文件。但我需要同样存储我不知道该怎么做?请帮帮我。

为了读取文件,我从链接中获取了代码

InputStream csv = 
             SomeClassInTheSamePackage.class.getResourceAsStream("filename.csv");

这样任何人都可以帮我写一个文件

目前我正在使用此代码:

 Writer output = null;
 output = new BufferedWriter(new FileWriter("./filename.csv"));

但它在运行时抛出 FileNotFound Exception

问题在于定位文件路径。如果我给出绝对路径,它工作正常。但它需要在任何计算机上运行

【问题讨论】:

  • 您是否尝试过只写信给'filename.csv' 而不是'./filename.csv'
  • @bernie 如果someClassInTheSamePackage 不在当前包中怎么办?
  • SomeClassInTheSamePackage 表示包中的任何 java 文件用作参考
  • @Yuzi 你不觉得让别人用java包写文件会是严重的安全问题吗?

标签: java file


【解决方案1】:

FileWriter 将根据需要创建文件。它不必已经存在。

出现此错误的唯一方法是当前工作目录不再存在或您无权在该目录中创建文件。

【讨论】:

    【解决方案2】:

    检查您的权限:

    Writer output = null;
    if (new File("./filename.csv").canWrite()) {
       System.out.println("You have not permissions");
    } else {
       output = new BufferedWriter(new FileWriter("./filename.csv"));
       ...
    }
    

    【讨论】:

    • 问题在于定位文件路径。如果我给出绝对路径,它工作正常。但它需要在任何计算机上运行
    【解决方案3】:

    OK..使用以下代码获取文件路径:

    String path = System.getProperty("user.dir");
    FileWriter fw = new FileWriter(path+File.separator+"filename.csv");
    

    编辑

    这是一个在包myPackage 中创建文件"pqr.txt" 的演示代码。鉴于我正在使用命令 java myPackage.AccessCheck 执行类文件,即从 mypackage 上方的一个目录。

    package myPackage;
    import java.io.FileWriter;
    import java.io.File;
    public class AccessCheck
    {
        protected void callme()
        {
    
            try
            {
                String name = System.getProperty("user.dir")+File.separator+AccessCheck.class.getPackage().getName()+File.separator+"pqr.txt";
                System.out.println(name);
                FileWriter fw = new FileWriter(name);
            }catch(Exception ex){ex.printStackTrace();}
        }
        public static void main(String st[])
        {
            AccessCheck asc = new AccessCheck();
            asc.callme();
        }
    }
    

    【讨论】:

    • 我没有得到 File.separator
    • File.separator 给出system-dependent 默认name-separator 字符串。例如:在 Microsoft Windows 系统上,它是“\”(c:\abc).. 而在 UNIX 系统上,这个字段的值是“/”。在这里观看更多信息:docs.oracle.com/javase/1.4.2/docs/api/java/io/…
    • 告诉我你的package的名字和这个file的绝对路径。并且告诉我你从哪个目录执行java 命令。
    • @VishalK "./filename.csv" 只不过是"filename.csv" 这意味着他/她将文件存储在根文件夹中,这对我来说很好。我的意思是两者都工作正常。
    【解决方案4】:

    不要调用getResourceAsStream(),而是调用class.getResource()classLoader.getResource()。这些函数返回一个给出资源位置的 URL。如果资源是文件系统上的普通文件,则 URL 将为 file: URL。

    获得 URL 后,您可以将其转换为 URI 并将其传递给采用 URI 的 File 构造函数。然后就可以使用File对象打开文件了。

    请注意,getResource() 可以返回 File 构造函数无法处理的 URL。例如,如果在 jar 文件中找到资源,则 URL 可能如下所示:

    jar:file:/C:/path/to/JDK/lib/vm.jar!/java/lang/Object.class
    

    File 构造函数无法处理这样的 URL。这可能会或可能不会让您担心。

    【讨论】:

      猜你喜欢
      • 2015-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-20
      • 1970-01-01
      • 2011-08-08
      • 2013-09-06
      • 2017-06-15
      相关资源
      最近更新 更多