【问题标题】:BufferedWriter#write(int) javadoc queryBufferedWriter#write(int) javadoc 查询
【发布时间】:2010-09-06 20:25:35
【问题描述】:

Javadoc 表示:

只写入整数 oneChar 的低两个字节。

这对编写已转换为 int 的非 utf8 编码字符有什么影响(如果有的话)?

更新:

相关代码从套接字接收数据并将其写入文件。 (接收和写入之间会发生很多事情,所以我不能只使用通过 BufferedReader#readLine() 获得的字符串)。我使用的是 Writer#write(char[]) 但这意味着我每次都必须创建一个新的 char 数组。为了避免每次都创建一个数组,我有一个用 -1 填充的 char 数组(强制转换为 char)。

然后我使用TextUtils#getChars 来填充它,并在必要时扩展数组。对于写入,我循环遍历数组,写入 Writer 直到 char[i] == (char) -1 == true。

【问题讨论】:

  • 我不明白你的更新。 TextUtils#getChars 从 CharacterSequence 获取输入。为什么不直接使用 Writer#append(CharSequence) 编写 CharacterSequence?
  • 通常的方法是使用 Reader#readLine() 读取,然后使用 Writer.append 写入。如果由于代码的工作方式而无法执行此操作,则需要针对您的问题发布一个独立的代码示例。否则就不可能了解您的限制并找到不同的解决方案。
  • Writer#append(charsequence) 在写入之前使用 toString,我不想每次都创建一个新字符串。在 readline() 和写入文件之间,解析器用于解析字符串、添加格式并对字符串执行各种操作。写入仅发生在由应用程序状态和消息类型确定的某些情况下,因此必须在解析器内部进行。我的问题很简单,我可以从 iso-8859-1 编码字符串中获取字符,并将它们转换为 int 而不会丢失任何数据。

标签: android encoding character-encoding bufferedwriter


【解决方案1】:

在内部,write(int) 只会将其参数转换为char,因此write(i) 等价于write((char)i)

现在在 Java 中,char 内部只是一个整数类型,范围为 0-65535(即 16 位)。强制转换 int -> char 是“缩小原始转换”(Java Language spec, 5.1.3),int 是有符号整数,因此:

有符号的缩小转换 整数到整数类型 T 简单 丢弃除 n 最低阶之外的所有阶 位,其中 n 是位数 用来表示类型T。另外 可能丢失信息 关于数字的大小 值,这可能会导致的符号 结果值不同于 输入值的符号。

这就是为什么 Javadoc 说只写入低两个字节的原因。

现在,这在字符方面的含义取决于您要如何解释 int 值。 Java 中的char 表示UTF-16 中的Unicode 码位,即char 所代表的16 位数字被解释为Unicode 码位的编号。因此,如果您的每个 int 值都是 16 位代码点的编号,那么您很好(实际上,这仅适用于 BMP 中的字符;如果您在补充平面中使用字符,则每个 Unicode 代码点都将被编码分成两个chars)。如果它是其他任何东西(包括超过 16 位的代码点,或负数,或完全其他的东西),你会得到垃圾。

如果有的话,这会对 编写非 utf8 字符 转换为 int?

没有“非 utf8 字符”之类的东西。 UTF-8 是一种 encoding,这是一种表示 Unicode 代码点的方式,因此提出的问题毫无意义。也许你可以解释一下你的代码是做什么的?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多