为什么Java nio只写字节?

时间:2018-11-12 01:53:41

标签: java nio

java nio只能写字节吗?例如:

    Path path=FileSystems.getDefault().getPath("\(a path)")
    Files.write(path, "test string".getBytes())

我不能仅将字符串传递给Files.write的第二个参数。 如果是这种情况,那为什么只能写入字节呢?

1 个答案:

答案 0 :(得分:3)

另一种方法Files.write(Path,Iterable,Charset,OpenOption...)可用于直接写入CharSequenceStringCharSequence)。

  

将文本行写入文件。每行都是一个char序列,并按顺序写入到文件中,每行由平台的行分隔符终止,如系统属性line.separator所定义。使用指定的字符集将字符编码为字节。

     

options参数指定如何创建或打开文件。如果不存在任何选项,则此方法就像存在CREATE,TRUNCATE_EXISTING和WRITE选项一样工作。换句话说,它将打开要写入的文件,如果不存在则创建文件,或者首先将现有的常规文件截断为0大小。该方法确保在写入所有行后(或者引发I / O错误或其他运行时异常)关闭文件。如果发生I / O错误,则可能在创建或截断文件后或在将某些字节写入文件后发生。

Java 8添加了不需要Charset的重载,并使用UTF-8作为默认值。

Java 11添加了另一种方法:Files.writeString(Path,CharSequence,Charset,OpenOption...)

  

将CharSequence写入文件。使用指定的字符集将字符编码为字节。

     

所有字符均按原样写入,包括char序列中的行分隔符。没有添加额外的字符。

     

options参数指定如何创建或打开文件。如果不存在任何选项,则此方法就像存在CREATE,TRUNCATE_EXISTING和WRITE选项一样工作。换句话说,它将打开文件进行写入,如果不存在则创建文件,或者首先将现有的常规文件截断为0大小。

此方法还具有不需要Charset的重载,再次使用UTF-8作为默认值。

在幕后,CharSequence转换为字节,就像问题注释中提到的Scary Wombat和yshavit一样。这些方法的文档甚至对此进行了明确说明:

  

使用指定的字符集将字符编码为字节。