当前位置: 首页 > 面试题库 >

作为Upstart服务启动时无法读取UTF-8文件名

秦禄
2023-03-14
问题内容

我的Java程序递归地读取目录的内容。这是一个示例树(请注意非ASCII字符):

./sviluppo
./sviluppo/ciaò
./sviluppo/ciaò/subdir
./sviluppo/pippo
./sviluppo/pippo/prova2.txt <-file
./sviluppo/così

该程序作为Upstart服务启动,带有名为like的配置文件 /init/myservice.conf

description "Private Service"
author "AD"
start on runlevel [2345]
stop on runlevel [! 2345]
exec java -jar /home/mainFind.jar >> /tmp/log.txt

当我启动服务时:

root@mdr:/tmp#  service myservice start
myservice start/running, process 15344

它不会记录名称中包含非ASCII字符的文件名:

root@mdr:/tmp#  cat /tmp/log.txt
Found dir: /mnt/sviluppo/pippo

相反,当我运行命令(以root身份模仿服务启动时发生的情况)时,无论有没有,它都可以正常运行exec

root@mdr:/tmp# java -jar /home/mainFind.jar  >> /tmp/log.txt
root@mdr:/tmp# exec java -jar /home/mainFind.jar  >> /tmp/log.txt

root@mdr:/tmp#  cat /tmp/log.txt
Found dir: /mnt/sviluppo/ciaò
Found dir: /mnt/sviluppo/ciaò/subdir
Found dir: /mnt/sviluppo/pippo
Found dir: /mnt/sviluppo/così

为什么由同一用户运行的同一程序不能在Upstart服务中运行,而是在从命令行运行时正确处理所有文件名?这是Java代码

public static void aggiungiFileDir(File f){
  File[] lista= f.listFiles();
  for(int i=0;i<lista.length;i++){
    if(lista[i].isDirectory()){
      System.out.println("Found dir: "+lista[i]); 
    }
  }
}

形式参数f是根目录。该函数将在每个子目录上递归调用。

编辑2:发布ls

root@mdr:/tmp# ls -al /mnt/sviluppo
totale 20
drwx------ 5 root root 4096 nov 15 15:10 .
drwxr-xr-x 7 root root 4096 nov  9 10:43 ..
drwxr-xr-x 2 root root 4096 nov 15 15:10 ciaò
drwxr-xr-x 2 root root 4096 nov 15 11:23 così
drwxr-xr-x 2 root root 4096 nov 15 17:57 pippo

问题答案:

Java使用本地调用来列出目录的内容。基础的C运行时依赖于 语言环境 概念,String从文件系统作为文件名存储的字节blob中构建Java 。

从外壳程序(特权用户或非特权用户)执行Java程序时,它会承载由变量组成的 环境LANG读取该变量可将字节流转码为Java
String,默认情况下,在Ubuntu上它将与UTF-8编码关联。

请注意,不需要从任何外壳运行进程,但是通过查看代码,Upstart似乎足够聪明,可以理解何时打算从外壳执行配置文件中的命令。因此,假设通过外壳程序调用了JVM,则问题在于LANG未设置变量,因此C运行时假定默认字符集,恰好
不是 UTF-8。解决方案在Upstart节中:

description "List UTF-8 encoded filenames"
author "Raffaele Sgarro"
env LANG=en_US.UTF-8
script
  cd /workspace
  java -jar list.jar test > log.txt
end script

我曾经en_US.UTF-8用作语言环境,但是任何UTF-8支持的语言都一样。测试的来源list.jar

public static void main(String[] args) {
    for (File file : new File(args[0]).listFiles()) {
        System.out.println(file.getName());
    }
}

该目录/workspace/test包含文件名,如àààèèè等等。现在您可以移至数据库部分;)



 类似资料:
  • 环境:Ubuntu 18Spring开机2.0 JDK 11 当应用程序在IntelliJ中运行时,它会正确执行,但在Spring Bootmaven插件打包文件后读取文件时不会。 PS:该文件确实可以在打包的jar文件中找到!

  • 问题内容: 我无法通过暴发户来运行我的golang编。 这是我的项目目录- 我将我的gopath设置为上述目录。 在该文件夹中,我可以运行并且可以运行。 但是,通过以下新贵配置,其日志记录- 为什么它不能像我手动运行命令时那样从新贵开始工作? 问题答案: 摘自评论: 通过Upstart调用时,是否有可能未设置?尝试编译您的程序(),然后将其放到正常位置。

  • 我正在尝试在亚马逊 Linux EC2 实例上启动Spring启动应用程序即服务。 我将服务打包为: 当我手动启动服务(没有服务)时,它会运行correclty: 信息 [main] 组织.springframework.boot.web.embedded.tomcatWebServer: Tomcat 在端口上启动: 8080 (http) 与上下文路径 '' 信息 [主] 组织.springf

  • 问题内容: 我需要阅读一个以GBK编码的文本文件。Go编程语言中的标准库假定所有文本均以UTF-8编码。 如何读取其他编码的文件? 问题答案: 以前(如在较早的答案中所述),“简单”的方法是使用需要cgo并包装iconv库的第三方程序包。由于许多原因,这是不希望的。值得庆幸的是,有一段时间以来,仅使用Go Authors提供的软件包(不是在主要软件包中,而是在Go子存储库中),就有了一种上乘的Go

  • 问题内容: 我正在从事一个涉及Maven,Java和Clojure的项目。我面临的问题是,UTF-8我的clojure源文件中有一些字符,由于这些原因,java编译器无法正确解释我的源代码,我通过设置环境变量使其正常工作,但是我想要的是通过MAVEN传递此属性。 我已经尝试设置,但这似乎不起作用。 我也尝试过为Maven的编译器插件设置配置…如下所示: 这也不起作用。 我做错了什么,还是有其他方法

  • 问题内容: 我有一个问题,当XML文件中存在UTF-8字符时,我的DOM解析器无法加载文件现在,我知道我必须给他指令以读取utf-8,但我不知道如何放置它在我的代码中,它是: 我知道有方法setencoding(),但我不知道将其放在代码中的位置… 问题答案: 试试这个。 为我工作