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

Use an alternative API and specify a charset name or Charset object explicitly

Sonar 抱怨我的 scala 代码需要使用不同的 API 来明确指定字符集名称或字符集对象。

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

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

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

还有声纳状态 "Use an alternative API and specify a charset name or Charset object explicitly"

val writer = new PrintWriter(partitionsfilePath); 

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

对于文件输入,Sonar 认为您是根据用户指定(部分)输入路径从文件系统加载文件。根据您对文件的处理方式,您需要对输入进行判断以确保用户无法执行目录遍历(例如 ../../../../../../etc/passwd)以根据他们提供的输入读取或覆盖文件。

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

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

PrintWriter(File file) 使用 Java 虚拟机的默认字符集。默认字符集是在虚拟机启动期间确定的,通常取决于底层操作系统的区域设置和字符集。为了确定性,您应该改用 PrintWriter(File file, String csn) 。例如,要确保始终使用 UTF-8,您可以编写 new PrintWriter(partitionsfilePath, StandardCharsets.UTF_8.name())