使用备用API并明确指定字符集名称或字符集对象

时间:2019-04-29 21:09:03

标签: scala apache sonarqube

Sonar抱怨我的Scala代码需要使用其他API来显式指定字符集名称或Charset对象。

public interface VersionRepositoryExtended extends CrudRepository<Version, Long> {

    @Procedure(procedureName = "getVersionByName")
    public Version getVersionListedName(@Param("name") String name);
}

// sonar抱怨java / io / File。(Ljava / lang / String;)V读取了一个文件,该文件的位置可能由用户输入指定

声纳还指出“使用备用API并明确指定字符集名称或字符集对象”

class UpdatePartitionsFile(val sparkSession: SparkSession, val tableName: 
String, val partitionsfilePath: String) {
....

def getPartitions: (String, String) = {
val partitionsFile = new File(partitionsfilePath);

我应该从这里改变什么? 感谢任何建议和帮助

2 个答案:

答案 0 :(得分:1)

PrintWriter(File file)使用Java虚拟机的默认字符集。默认字符集在虚拟机启动期间确定,通常取决于基础操作系统的语言环境和字符集。为了确定起见,您应该使用PrintWriter(File file, String csn)。例如,要确保始终使用UTF-8,您可以编写new PrintWriter(partitionsfilePath, StandardCharsets.UTF_8.name())

答案 1 :(得分:0)

对于File输入,Sonar认为您是根据用户指定输入路径(的一部分)从文件系统中加载文件的。根据您对文件的处理方式,需要使输入变大,以确保用户无法通过目录遍历(例如../../../../../../etc/passwd)来基于文件提供的输入来读取或覆盖文件。

对于字符编码部分,您需要使用OuputStreamWriter来指定编码,并将其包装在FileOutputStream周围:

val writer = new OutputStreamWriter(new FileOutputStream(partitionsfilePath), StandardCharsets.UTF_8);