代码之家  ›  专栏  ›  技术社区  ›  daxue

为什么无法创建新文件,路径或路径名分隔符是否正确?

  •  1
  • daxue  · 技术社区  · 10 年前

    为什么我不能创建一个新文件,我想知道是不是因为路径不正确,如果不是,可能是我的服务器出了问题。

    我的代码:

    String signaturePath = pathService.getStringByKey(myConstants.REPORT_PATH) + File.separator + "hos_log" + File.separator + params.get("driver");
                System.out.println(signaturePath);//it print this: /home/www/MyServer/report/\my_log\jo
                String fileName = shortDate + ".jpg";
                File file = new File(signaturePath + File.separator + fileName);//file debuged out : \home\www\MyServer\report\my_log\jo\20160601.jpg
                dataMap.put("shortDate", shortDate);
                dataMap.put("driverId", driverLog.getUserId());
                if (file.exists()) {//false.and i go to the sever,there is no such file created.
                    dataMap.put("icon", "yes");
                }else{
                    dataMap.put("icon", "no");
                }
                results.add(dataMap);
    

    下面是分隔符的代码:

    public static final String separator = "" + separatorChar;
    
    public static final char separatorChar = fs.getSeparator();
    
    public char getSeparator() {
    return slash;
    }
    
    class Win32FileSystem extends FileSystem {
    
    private final char slash;
    private final char altSlash;
    private final char semicolon;
    
    public Win32FileSystem() {
    slash = ((String) AccessController.doPrivileged(
              new GetPropertyAction("file.separator"))).charAt(0);
    semicolon = ((String) AccessController.doPrivileged(
              new GetPropertyAction("path.separator"))).charAt(0);
    altSlash = (this.slash == '\\') ? '/' : '\\';
    }
    
    private boolean isSlash(char c) {
    return (c == '\\') || (c == '/');
    }
    
    private boolean isLetter(char c) {
    return ((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z'));
    }
    
    private String slashify(String p) {
    if ((p.length() > 0) && (p.charAt(0) != slash)) return slash + p;
    else return p;
    }
    

    我对文件创建感到困惑,尤其是如何写入路径。

    现在我添加

    file.createNewFile();
    

    就在下面

    File file = new File(signaturePath + File.separator + fileName);
    

    然而,它被异常关闭了,异常在控制台中打印了一次,但它不再打印,并且文件仍然没有在服务器中创建。 我们将新服务器重新部署到Tomcat之前的代码是正确的,因此我不知道该文件是如何物理创建的,因为我从@maskacovnik的答案中获得了信息

    ================================================================= 事实证明,这是因为myConstants的路径。REPORT_PATH指向错误,我显示的代码没有问题。但我仍然对它如何有文件感到困惑,即使没有

    文件.createNewFile();
    
    1 回复  |  直到 10 年前
        1
  •  1
  •   maskacovnik    10 年前

    如果创建File对象:

    File file = new File(signaturePath + File.separator + fileName);
    

    您不会物理地创建文件,这就是为什么 file.exists() 收益 false ,这只是java对象。

    要创建空文件,请使用:

    file.createNewFile();
    

    或者使用一些流在其中写入。还要确保您有创建新文件的权限。

    如果路径不好,最好使用 / 而不是 \ 在路径中。Windows机器可以很好地解释它。你的 File.separator 是最好的选择,它应该是独立于平台的。

    在我看来,路径是可以的,您只是没有物理地创建文件。