当前位置: 首页 > 知识库问答 >
问题:

使用文件通道或文件。复制到jar中的复制文件

杜辰龙
2023-03-14

使用Java8。

为了获得最佳性能,我尝试用Files.copy()复制文件,但很快发现它不支持汉字。例如:

try {
    Files.copy(
        Objects.requireNonNull(
            Main.class.getResourceAsStream("/amres/core/template.xlsx")),
        Paths.get("C:/我的/test.xlsx"), // "我的" means mine in Chinese
        StandardCopyOption.REPLACE_EXISTING
    );
} catch (IOException e) {
    e.printStackTrace();
}

代码打算从jar复制一个文件,但它抛出了一个异常(a“我的" 文件夹已提前创建):java。尼奥。文件NoSuchFileException:C:\鎴戠殑\测验xlsx
问题是鎴戠殑" 甚至连一个中国人都看不懂,所以我正在寻找一个解决办法来处理汉字。

我也尝试了FileChannel,但失败了,意识到它用于直接文件,而不是在一个jar中的文件。我该怎么做?

共有2个答案

公良理
2023-03-14

编译Java类文件时,您可能使用了错误的文件编码。如果您在使用值之前简单地打印出文件的路径名,这个问题应该是清楚的:

System.out.println("C:/我的/test.xlsx");

如果该路径未被识别为中文文件夹名称,那么请再次尝试使用javac编码标志进行编译,以匹配源文件的格式。

舒阳州
2023-03-14

你找错人了<代码>文件。copy与支持(或不支持)中文字符无关,java支持完整的unicode路径名。是的,很明显,您的代码目前没有按设计工作,可以修复,但问题不在于文件。复制

Main。班getResourceAsStream是从代码库中提取资源的正确方法,但是,这是一个资源,因此必须关闭它。用try块包装它,这是一个聪明的方法。

对象。此处不应使用requirennoull——其目的是强制引发NullPointerException。这就是它的全部功能。如果资源不知何故丢失,此代码将已经抛出NPE。这意味着requireNonNull完全没有意义(它强制执行一个已经发生的事情),如果你想要干净的代码,这两种方法都是不合适的:你应该用一个异常重新调用,这个异常正确地传达了应用程序坏掉的概念。

然而,这也不是一个好主意:我们不会为bug或损坏的部署抛出异常。如果您认为应该,那么您应该使用try/catch块来包装整个java项目中的每一行代码,毕竟,显然我们不能假设任何事情。我们甚至不能假设java。lang.String在运行时可用-显然这不是一个可持续的观点。换句话说,您可以安全地假设,出于异常流的目的,资源不可能不在那里。

因此,我们得到了更简单、更安全的代码:

try (var in = Main.class.getResourceAsStream("/amres/core/template.xlsx")) {
  Files.copy(in, Paths.get("C:/我的/test.xlsx"), StandardCopyOption.REPLACE_EXISTING);
}

请注意,通常情况下,捕获异常并使用e.printStackTrace()处理它也是不好的,在所有情况下:您将异常打印到它可能不应该去的地方,抛出有用的信息,例如因果链,然后让代码异常继续,即使代码的状态明显处于意外的未知状态。最好的通用解决方案是实际地抛出异常。如果这是不可行的,或者您只是不想现在就关心它,因此依赖IDE的自动修复程序,而不费心编辑任何内容,那么至少要修复IDE的自动修复程序以发出非白痴代码<代码>抛出新的RuntimeException(“uncaught”,e)是正确的“我现在不想关心这个”填充。因此,修复您的IDE。它通常位于“模板”下的“设置”中。

每次字符变为字节或反之亦然时,都会涉及到字符集编码。文件名看起来像字符,当然,当您编写代码时,您正在编写字符,当您看到NoSuchFileException的文本时,这就是字符——但是中间的所有内容呢?此外,文件系统中的名称本身并不清楚:有些文件系统名称是基于字节的。例如,苹果的APFS完全基于Bytebase。文件名只是字节,而将这些字节呈现在屏幕上(并将命令行上的touch foobar.txt等翻译为文件名的字节序列值)的想法仅通过UTF-8实现。相反,一些文件系统将这种集合编码的概念直接编码到其API中。最好的办法是把所有的事情都交给UTF_8,这是出差错的最小机会。

那么,让我们来完成以下步骤:

  1. 您可以在文本编辑器中编写java代码。你写字符

检查所有加粗的项目,95%的可能性你会通过这样做来解决你的问题。

 类似资料:
  • 问题内容: 我想从罐子中复制文件。我要复制的文件将被复制到工作目录之外。我已经做过一些测试,所有尝试使用的方法都以0字节文件结尾。 编辑 :我希望通过程序而不是手动完成文件的复制。 问题答案: 首先,我想说的是,之前发布的一些答案是完全正确的,但是我想告诉我,因为有时我们不能在GPL下使用开放源代码库,或者因为我们懒得下载jarXD或其他文件无论您的理由在这里,还是一个独立的解决方案。 下面的函数

  • 问题内容: 假设我的jar包“ com.test.io”中有一个名为test.txt的文件。 我将如何编写一个类来检索此文本文件,然后将内容复制到文件系统上的新文件中? 问题答案: 假设jar在您的类路径中:

  • 我正在创建一个使用 RestAPI 获取数据的应用程序,对于该操作,我使用改造 2、okhttp3 和 Jackson 将 json 解析为对象,我的应用程序还使用 Firebase 云消息传递 当我编译我的代码时,它会给我以下错误 错误:任务执行失败:app:transformresourceswithmergejavarefordebug。 com . Android . build . AP

  • rank ▲ ✰ vote url 50 404 65 510 url 复制文件 怎么在Python里赋值文件?在os下没找到复制的方法. shutil有许多的方法.其中之一就是: copyfile(src, dst) 把src文件的内容复制给dst.目的地址必须是可写的;否则将会出现IOError错误.如果dst已经存在,将会被覆盖.一些像字符或者块设备不能用这个方法赋值.src和dst是路径

  • 我有一个META-INF文件夹,其中有persitence.xml和orm.xml。当我用下面的gradle构建一个jar文件时,这些文件不会包含在jar中。如何将这些文件复制到jar中?

  • 问题内容: 我最近开发了一个应用程序,并创建了jar文件。 我的课程之一创建了一个输出目录,并使用其资源中的文件填充该目录。 我的代码是这样的: 不幸的是,这不起作用。 我没有运气就尝试了以下方法: 使用Streams解决其他类上的类似问题,但不适用于dirs。代码类似于 http://www.exampledepot.com/egs/java.io/CopyFile.html 使用创建文件模板