Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';作为Upstart服务启动时,无法读取UTF-8文件名_Java_Ubuntu_Service_Special Characters - Fatal编程技术网

Java Can';作为Upstart服务启动时,无法读取UTF-8文件名

Java Can';作为Upstart服务启动时,无法读取UTF-8文件名,java,ubuntu,service,special-characters,Java,Ubuntu,Service,Special Characters,我的Java程序递归地读取目录的内容。这是一个示例树(请注意非ASCII字符): 启动服务时: 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,它

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

启动服务时:

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]); 
    }
  }
}

Java使用本机调用列出目录的内容。底层C运行时依赖于区域设置概念,从文件系统存储的字节blob作为文件名构建Java
String
s

当您从shell(作为特权用户或非特权用户)执行Java程序时,它携带一个由变量组成的环境。变量
LANG
被读取以将字节流转换为Java字符串,在Ubuntu上默认情况下,它与UTF-8编码相关联

请注意,进程不需要从任何shell运行,但从代码来看,Upstart似乎足够聪明,能够理解配置文件中的命令何时要从shell执行。因此,假设JVM是通过shell调用的,问题是没有设置变量
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
包含类似
的文件名
èè
等等。现在可以转到数据库部分;)

将它添加到/etc/init.d/script中为我解决了这个问题(我从/etc/init.d/tomcat7复制了它):

我的计算机上/etc/default/locale的内容:

LANGUAGE=en_US:en
LANG=en_US.UTF-8

如果没有代码,你就不能说出java代码?我没有发布,因为我不认为这是为。如果从命令行启动它,因为没有服务,我认为问题在于linux,而不是java。我已经编辑了whit代码。编辑并执行,但权限是ok的。请注意,权限似乎不正常。当前目录不允许对非特权用户执行任何操作。。。不管怎样,有什么问题吗?您可以附加JUnit测试用例吗?或者至少将实际结果与预期结果进行比较?从描述来看,不清楚这里发生了什么……问题是,如果我从命令行(execjavaecc)运行程序,它会正确返回所有目录的列表。如果我运行“service myservice start”,其中/etc/init/上的myservice.conf有上面发布的代码,那么它找不到带有重音符号的目录!我写所有权限都可以,因为所有2个操作都是由root用户执行的。我如何使用系统上其他所有操作使用的值?(即,
locale
的输出)
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
public static void main(String[] args) {
    for (File file : new File(args[0]).listFiles()) {
        System.out.println(file.getName());
    }
}
# Make sure script is started with system locale
if [ -r /etc/default/locale ]; then
    . /etc/default/locale
    export LANG
fi
LANGUAGE=en_US:en
LANG=en_US.UTF-8