Java 如何使用csv文件读取器(Scala)支持UTF-8-BOM文件

Java 如何使用csv文件读取器(Scala)支持UTF-8-BOM文件,java,scala,csv,utf-8,Java,Scala,Csv,Utf 8,我有一个简单的csv阅读器,我用它上传csv,对数据进行一些操作,并打印新的csv输出 我正在使用带有Scala的tototoshi csv库 我的问题是,我的项目知道如何处理UTF-8文件,但现在我需要支持UTF-8-BOM文件,如果有人能解释我如何解决这个问题,这将是很大的帮助 这是支持UTF-8的当前func: 作者: //----------------WRITER----------------// class CsvDataWriter(csvFile: File, head

我有一个简单的csv阅读器,我用它上传csv,对数据进行一些操作,并打印新的csv输出

我正在使用带有Scala的tototoshi csv库

我的问题是,我的项目知道如何处理UTF-8文件,但现在我需要支持UTF-8-BOM文件,如果有人能解释我如何解决这个问题,这将是很大的帮助

这是支持UTF-8的当前func:

作者:

  //----------------WRITER----------------//
  class CsvDataWriter(csvFile: File, headers: List[String])(implicit format: CSVFormat) {
    val fos = new FileOutputStream(csvFile, false)
    private val writer = {
      CSVWriter.open(fos, "UTF-8")(format)
    }
    writer.writeRow(headers)

    def close() = {
      fos.close()
      writer.close()
    }

    def write(outputCSVRow: RowMap) = writer.writeRow(headers map outputCSVRow)
    def writeHeaders(headers: List[String]) = {
      writer.writeRow(headers)
    }
  }
读者:

  //----------------READER----------------//
  class CsvDataReader(csvFile: File) {

    private val reader = CSVReader.open(csvFile, "UTF-8")(Format)

    val headers: List[String] = reader.readNext().get

    def close() = reader.close()

    def iteratorWithHeaders: Iterator[Map[String, String]] = {
      reader.iterator.map(line => headers.zip(line).toMap)
    }
  }
这是用户选择文件时的上载功能:

 def upload = Action(parse.multipartFormData) { implicit request =>
    request.body.file("file").fold {
      BadRequest("Missing file")
    } { uploadedFile => {

      val localFile = new File("/tmp/" + uploadedFile.ref.file.getName)

      Files.copy(uploadedFile.ref.file.toPath, localFile.toPath, StandardCopyOption.REPLACE_EXISTING)
      localFile.deleteOnExit()
      val j = Json.parse( s"""{"fileId": "${Crypto.encryptAES(localFile.getAbsolutePath)}"}""")

      Ok(j)
    }
    }
  }

UTF-8既不需要也不建议使用BOM

根据,不建议使用UTF-8文件的BOM


UTF-8 BOM是一个字节序列(EF BB BF),允许读取器将文件标识为以UTF-8编码。通常,BOM用于表示编码的结束,但由于结束与UTF-8无关,因此BOM是不必要的。

字节或符号。如果您的Library不支持UTF-8-BOM,我只需检查BOM(以任意字节顺序),并将其从您的流的前端剥离。@JonathonReinhart您能告诉我如何做到这一点吗?UTF-8只有一个字节顺序,即网络字节顺序,即big-endian。