RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 838349
Accepted
Direct
Direct
Asked:2020-06-06 15:12:54 +0000 UTC2020-06-06 15:12:54 +0000 UTC 2020-06-06 15:12:54 +0000 UTC

I/O 流如何存储信息?

  • 772

请解释一下为什么当你在控制台输入字母't'然后输出System.in.read()andnew BufferedReader(new InputStreamReader(System.in)).read()时,当转换为type时你得到相同的结果int,即:116。毕竟字节流的标准read()必须读取一次一个字节,并返回零(作为两字节“t”记录的第一个字节),字符 BufferedReader 正确返回所有内容。
怎么了?

java
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    default locale
    2020-06-06T20:01:01Z2020-06-06T20:01:01Z

    控制台发送就绪字节。

    System.in是由操作系统控制的 Java 进程的输入流。控制台将已转换的字节发送到此流。

    在控制台中输入数据时会发生什么:

    • 控制台根据为控制台指定的编码将输入的字符转换为字节。
      设置编码取决于各个控制台/操作系统。
      您的控制台很可能具有转换t为一个字节的编码。
    • System.in.read诚实地读取接收到的字节。
    • InputStreamReader根据默认编码将接收到的字节转换为字符;您选择了一个未指定编码的构造函数。默认编码由 JVM 参数设置。
      您可以使用以下代码检查阅读器的编码:

          InputStreamReader reader = new InputStreamReader(System.in);
          System.out.println("Encoding: "+reader.getEncoding());
      

      可以使用构造函数之一显式设置编码。
      读取时,读取器从输入流中读取字节,并根据编码转换成对应字符(char)的数值。根据 Java 规范 ( §3.1 Unicode ),字符以 UTF-16 编码存储。假设我们使用单字节编码,输入字符“s”并处理它:

          char value = (char) reader.read();  
      

      Reader 将从输入流中读取一个字节,了解它是什么类型的字符,在 UTF-16 表中找到该字符并返回其数值。因此,此代码将等效于:

         char value = 'ы';
      

      无论编码如何。

    双字节编码

    要查看标准输入的双字节编码,需要设置相应的编码。为了节省空间,大多数编码中的英文字符都被编码为一个字节。

    ...应该一次读取一个字节,并返回零(作为两位 't' 的第一位)

    这就是字符在高位到低位双字节编码(例如,UTF16-BE)中的转换方式。因此,为了看到这样的转换,System.in.read您需要以这样的编码向输入提交数据。

    这可以通过多种方式完成,例如:

    1. 阅读控制台文档以了解如何为其设置编码以及是否支持 UTF16-BE 编码。如果是,则设置编码。如果没有,那么这种方法将不起作用。

    2. 不要从控制台输入数据,而是将文本文件传递给输入。以 UTF16-BE 编码保存文件,然后运行如下命令:

          java Main < encoded.txt
      

      您需要考虑到保存文件中的第一个字符时将是BOM并跳过它。

    • 4
  2. Олег Сухих
    2020-06-06T20:26:33Z2020-06-06T20:26:33Z

    将字符串显式转换为字节数组时:

    import java.util.Arrays;
    public class App {
        public static void main(String[] args) {
            String str = "t";
            byte[] b = str.getBytes();
            System.out.println(b.length); //длина массива
            System.out.println(Arrays.toString(b)); //значение
        }
    }
    

    在控制台中查看

    1
    [116]
    

    字符串中数组的长度"t"为 1,所需的字节为116.

    事实上,正如上面回答的@default locale 一样,read()诚实地返回了这个字节。

    附言

    以两字节字符为例"ы",该方法getBytes()给出了一个两字节数组[-47, -117],如果我们使用该方法从流中读取这个字符System.in.read(),也会得到两个字节209和139。为什么会这样,因为(我引用了“Java Programming”,Patrick Niemeyer,Daniel Leuk,2014 年第 4 版,第 568 页)

    在 Java 平台上,该方法使用一个遵循 C 标准的特殊值来标记流的结束,字节返回为无符号整数,范围从 0 到 255;

    转移字节值的模式很简单——显式int转换为byte.

    (byte) 209和(byte) 139分别-47和-117。

    如果我们通过方法read()从 type 流中读取BufferedReader,则返回字符编码,如文档中所述:

    读取的字符,作为 0 到 65535 (0x00-0xffff) 范围内的整数

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5