笔试收获
参加了一次笔试,收获颇多。 不同的输入方法 和力扣不一样,一些大厂的笔试包括面试时的算法题都是 ACM 模式,也就是需要自己处理输入,然后对输入处理并输出,而力扣是核心代码模式,不用你管输入,只需要实现指定方法,平台自会调用你的方法。在参加之前,我去卡码网上了解了一下,发现还是 Scanner 那一套,也就没在意,但当我真正开始做的时候感到有点不对,Scanner 恐怕不太够用。这篇博客主要讲一下 Java 里的输入流。 Java 的输入体系建立在 流 的概念之上,主要有两个抽象基类:InputStream 和 Reader ,前者为字节流,处理原始字节数据,如图片、音频等;后者为字符流,处理字符数据,如文本文件、控制台输入等。两者之间通过 InputStreamReader 作为桥梁,将字节流转换为字符流。 InputStream 字节流 InputStream 类定义了所有字节输入流必须实现的核心办法。包括 int read() , int read(byte[] b) , void close()等方法。 Java 的 IO 体系采用了装饰器模式,意味着可以通过组合不同的流来实现复杂的功能。这里将 InputStream 的子类大致分为两类。 第一种,这种类直接与特定的数据源进行交互,比如 FileInputStream ByteArrayInputStream 。 第二种,这种类不直接连接数据源,而是通过继承装饰器基类 FilterInputStream 来包装一个已存在的 InputStream ,给它提供一些额外的功能,比如缓冲、数据类型转换等。这种类的典型代表有 BufferedInputStream DataInputStream 等。 Reader 字符流 Reader 类是字符输入流的抽象基类,定义的方法有 int read() , int read(char[] cbuf) , void close() 等。 它的子类和 InputStream 一样,也分两种,这里不再多说。但它有一个特别的子类: InputStreamReader 从它的类名就能看出来,它是字节流到字符流的单向桥梁,它可以读取字节,然后根据指定的字符编码将其解码为字符。 System.in 它是 System 类里的一个静态变量,类型是 InputStream ,所以它是一个字节流。如果需要按字符或行读取,通常需要对其包装,比如刚才提到的 InputStreamReader 和常见的 Scanner。通常情况下,System.in 默认连接到控制台(键盘),同时它读取数据也是阻塞式的,程序会一直等待,直到有数据可读或者流被关闭。 ...