【问题标题】:clarification on using OutputStream in Java?关于在 Java 中使用 OutputStream 的说明?
【发布时间】:2013-09-14 21:26:06
【问题描述】:

我正在阅读这个article。它有以下sn-p

OutputStream output = new FileOutputStream("c:\\data\\output-text.txt");

while(moreData) {
  int data = getMoreData();
  output.write(data);
}
output.close();

提到:

OutputStreams 用于写入基于字节的数据,一次一个字节。 OutputStreamwrite() 方法采用 int,其中包含要写入的字节的字节值。

假设我正在将字符串Hello World 写入文件,因此字符串中的每个字符都使用getMoreData() 方法转换为int。它是怎么写的?作为output-text.txt 中的字符或字节?如果它以字节形式写入,如果我必须将字节“重新转换”为字符,那么以字节形式写入有什么好处?

【问题讨论】:

  • 我不明白为什么 StackOverflow 必须成为每一个互联网垃圾的验证站点。不要对非代码文本使用代码格式,对被引用的文本使用引号格式。

标签: java io outputstream fileoutputstream


【解决方案1】:

每个字符(以及存储在文件中的几乎所有内容)都是一个字节/字节。例如:

  • 小写“a”写为一个字节,十进制值为 97。
  • 数字“1”写为一个字节,十进制值为 49

一旦信息写入文件,就不再有数据类型的概念,一切都只是字节流。重要的是用于将信息存储到文件中的编码

看看ascii table,对初学者学习信息编码很有用。

为了说明这一点,创建一个包含文本“hello world”的文件

$ echo 'hello world' > hello.txt

然后使用od命令输出写入文件的字节:

$ od -td1 hello.txt
0000000  104  101  108  108  111   32  119  111  114  108  100   10
0000014

上面的意思是,在文件开头的地址 0000000 处,我看到一个十进制值为 104 的字节(即字符 'h'),然后是一个十进制值为 101 的字节(即字符 'e')和等等..

【讨论】:

    【解决方案2】:

    流对字节进行操作并简单地读取/写入原始数据。

    读取器和写入器使用 UTF-8 或 US-ASCII 等字符集将基础数据解释为字符串。这意味着它们可能采用 8 位字符 (ASCII) 并将数据转换为 UTF-16 字符串。

    流使用字节,读取器/写入器使用字符串(或其他复杂类型)。

    【讨论】:

      【解决方案3】:

      这篇文章不完整,因为OutputStream 具有用于写入的重载方法,这些方法采用byte[]byte[] 以及offsetlength 参数,或单个int

      当你唯一的接口是OutputStream(假设你不知道底层实现是什么)时将String写入流的情况下,使用output.write(string.getBytes())会好得多。与传递字节数组的单个 write 调用相比,一次迭代地剥离单个 int 并将其写入文件将执行得非常糟糕。

      【讨论】:

        【解决方案4】:

        Java.io.OutputStream 类是所有表示字节输出流的类的超类。当字节被写入 OutputStream 时,它可能不会立即写入字节,而是 write 方法可能会将字节放入缓冲区。

        有以下几种写法:

        1. 无效写入(字节[] b)

        此方法将指定字节数组中的 b.length 个字节写入此输出流。

        1. void write(byte[] b, int position, int length)

        此方法将从偏移位置开始的指定字节数组中的长度字节写入此输出流。

        1. 无效写入(int b)

        此方法将指定字节写入此输出流。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-23
          • 2013-10-28
          • 1970-01-01
          • 2013-04-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多