使用替代 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())
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())