24.11. 使用 charset
charset 选项允许在消费者和制作者端点上配置文件编码。例如,如果您读取 utf-8 文件,并希望将文件转换为 iso-8859-1,您可以执行以下操作:
from("file:inbox?charset=utf-8") .to("file:outbox?charset=iso-8859-1")
您还可以在路由中使用 convertBodyTo
。在以下示例中,我们仍然以 utf-8 格式输入文件,但我们希望将文件内容转换为 iso-8859-1 格式的字节数组。然后,让 bean 处理数据。在使用当前 charset 将内容写入 outbox 文件夹之前。
from("file:inbox?charset=utf-8") .convertBodyTo(byte[].class, "iso-8859-1") .to("bean:myBean") .to("file:outbox");
如果您省略了消费者端点上的 charset,则 Camel 不知道文件的 charset,默认情况下会使用 "UTF-8"。但是,您可以配置 JVM 系统属性来覆盖和使用带有 org.apache.camel.default.charset
键的不同默认编码。
在以下示例中,如果文件不在 UTF-8 编码中,这可能是一个问题,这是读取文件的默认编码。
在这个示例中,在编写文件时,内容已转换为字节数组,因此会将内容直接写入(无需进一步的编码)。
from("file:inbox") .convertBodyTo(byte[].class, "iso-8859-1") .to("bean:myBean") .to("file:outbox");
您还可以通过使用密钥 Exchange.CHARSET_NAME
在交换上设置属性来覆盖和控制编码动态。例如,在下面的路由中,我们使用消息标头中的值设置属性。
from("file:inbox") .convertBodyTo(byte[].class, "iso-8859-1") .to("bean:myBean") .setProperty(Exchange.CHARSET_NAME, header("someCharsetHeader")) .to("file:outbox");
我们建议保持简单操作,因此如果您选择具有相同编码的文件,并希望以特定编码写入文件,那么最好在端点上使用 charset
选项。
请注意,如果您在端点上明确配置了 charset
选项,则无论 Exchange.CHARSET_NAME
属性是什么,都会使用该配置。
如果您有一些问题,您可以在 org.apache.camel.component.file
上启用 DEBUG 日志记录,并在其使用特定的 charset 读取/写入文件时 Camel 日志。
例如,以下示例将记录以下内容:
from("file:inbox?charset=utf-8") .to("file:outbox?charset=iso-8859-1")
和日志:
DEBUG GenericFileConverter - Read file /Users/davsclaus/workspace/camel/camel-core/target/charset/input/input.txt with charset utf-8 DEBUG FileOperations - Using Reader to write file: target/charset/output.txt with charset: iso-8859-1