代码之家  ›  专栏  ›  技术社区  ›  Marci-man

Java 8:用名字读取特殊字符的文件

  •  0
  • Marci-man  · 技术社区  · 6 年前

    我试图在Linux系统上读取名称中包含特殊字符的文件。我对操作系统没有任何控制权。

    我试过使用IO和NIO。我不断地

    java.nio.file.invalidPathException:格式错误的输入或输入包含 不可映射字符:/mnt/au?Enr?ckspiegel,elektrisch verstellbar,1,edition-meta.xml

    我不能在服务器上改变太多,我能在我的应用程序中做些什么来解决这个问题吗?

    System.out.println("Default Charset=" + Charset.defaultCharset()); // US_ASCII
    

    这给了我一个特殊字符有问号的字符串/mnt/au?sen.xml“

    Files.list(Paths.get(path)).forEach(file -> {
            log.info("file to string: " + file.toString());
            String correctedFileName = "";
            correctedFileName = new String(file.getFileName().toString().getBytes(StandardCharsets.ISO_8859_1),
                    StandardCharsets.UTF_8);
            log.info("corrected name: " + correctedFileName);
            try {
                ZipInputStream zipInputStream = new ZipInputStream(Files.newInputStream(Paths.get(correctedFileName)));
                ZipEntry entry = zipInputStream.getNextEntry();
                while (entry != null) {
                    Path filePath = Paths.get(unzipLocation, entry.getName());
                    if (!entry.isDirectory()) {
                        unzipFiles(zipInputStream, filePath);
                    } else {
                        Files.createDirectories(filePath);
                    }
    
                    zipInputStream.closeEntry();
                    entry = zipInputStream.getNextEntry();
                }
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        });
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   dinosaur    6 年前

    您可以尝试将文件名解析为URI来解决这些问题。

    样品:

    File file = new File(path);
    URI uri = file.toURI();
    String asciiURI = uri.toASCIIString();