JDK基础入门,这一篇文足矣
JDK基础入门
字节流主要操作 byte 类型数据,以 byte 数组为准,java 中每一种字节流的基本功能依赖于基本类 InputStream 和 Outputstream,他们是抽象类,不能直接使用。字节流能处理所有类型的数据(如图片、avi 等)。
InputStream
InputStream 是所有表示字节输入流类的基类,继承它的子类要重新定义其中所定义的抽象方法。InputStream 是从装置来源地读取数据的抽象表示,例如 System 中的标准输入流 in 对象就是一个 InputStream 类型的实例。
我们先来看看 InputStream 类的方法:
方法
说明
read()throws IOException
从输入流中读取数据的下一个字节(抽象方法)
skip(long n) throws IOException
跳过和丢弃此输入流中数据的 n 个字节
available()throws IOException
返回流中可用字节数
mark(int readlimit)throws IOException
在此输入流中标记当前的位置
reset()throws IOException
将此流重新定位到最后一次对此输入流调用 mark 方法时的位置
markSupport()throws IOException
测试此输入流是否支持 mark 和 reset 方法
close()throws IOException
关闭流
在 InputStream 类中,方法 read() 提供了三种从流中读数据的方法:
1. int read():从输入流中读一个字节,形成一个 0~255 之间的整数返回(是一个抽象方法)。
2. int read(byte b[]):从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
3. int read(byte b[],int off,int len):从输入流中读取长度为 len 的数据,写入数组 b 中从索引 off 开始的位置,并返回读取得字节数。
对于这三个方法,若返回 -1,表明流结束,否则,返回实际读取的字符数。
OutputStream
OutputStream 是所有表示字节输出流类的基类。子类要重新定义其中所定义的抽象方法,OutputStream 是用于将数据写入目的地的抽象表示。例如 System 中的标准输出流对象 out 其类型是 java.io.PrintStream,这个类是 OutputStream 的子类。
OutputStream 类方法:
方法
说明
write(int b)throws IOException
将指定的字节写入此输出流(抽象方法)
write(byte b[])throws IOException
将字节数组中的数据输出到流中
write(byte b[], int off, int len)throws IOException
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流
flush()throws IOException
刷新此输出流并强制写出所有缓冲的输出字节
close()throws IOException
关闭流
文件流
在 I/O 处理中,最常见的就是对文件的操作。java.io 包中所提供的文件操作类包括:
1. 用于读写本地文件系统中的文件:FileInputStream 和 FileOutputStream
2. 描述本地文件系统中的文件或目录:File、FileDescriptor 和 FilenameFilter
3. 提供对本地文件系统中文件的随机访问支持:RandomAccessFile
今天我们来学习文件流的 FileInputStream 和 FileOutputStream。
FileInputStream 类用于打开一个输入文件,若要打开的文件不存在,则会产生异常 FileNotFoundException,这是一个非运行时异常,必须捕获或声明抛弃。 FileOutputStream 类用来打开一个输出文件,若要打开的文件不存在,则会创建一个新的文件,否则原文件的内容会被新写入的内容所覆盖。
在进行文件的读/写操作时,会产生非运行时异常 IOException,必须捕获或声明抛弃(其他的输入/输出流处理时也同样需要进行输入/输出异常处理)。
缓冲流
类 BufferedInputStream 和 BufferedOutputStream 实现了带缓冲的过滤流,它提供了缓冲机制,把任意的 I/O 流"捆绑"到缓冲流上,可以提高 I/O 流的读取效率。
在初始化时,除了要指定所连接的 I/O 流之外,还可以指定缓冲区的大小。缺省时是用 32 字节大小的缓冲区;最优的缓冲区大小常依赖于主机操作系统、可使用的内存空间以及机器的配置等;一般缓冲区的大小为内存页或磁盘块等的整数倍。
BufferedInputStream 的数据成员 buf 是一个位数组,默认为 2048 字节。当读取数据来源时例如文件,BufferedInputStream 会尽量将 buf 填满。当使用 read () 方法时,实际上是先读取 buf 中的数据,而不是直接对数据来源作读取。当 buf 中的数据不足时,BufferedInputStream 才会再实现给定的 InputStream 对象的 read() 方法,从指定的装置中提取数据。
BufferedOutputStream 的数据成员 buf 是一个位数组,默认为 512 字节。当使用 write() 方法写入数据时,实际上会先将数据写至 buf 中,当 buf 已满时才会实现给定的 OutputStream 对象的 write() 方法,将 buf 数据写至目的地,而不是每次都对目的地作写入的动作。
数据流
接口 DataInput 和 DataOutput,设计了一种较为高级的数据输入输出方式:除了可处理字节和字节数组外,还可以处理 int、float、boolean 等基本数据类型,这些数据在文件中的表示方式和它们在内存中的一样,无须转换,如 read() , readInt() , readByte() ...; write() , writeChar() , writeBoolean() ... 此外,还可以用 readLine() 方法读取一行信息。
方法:
方法
返回值
说明
readBoolean()
boolean
readByte()
byte
readShort()
short
readChar()
char
readInt()
int
readLong()
long
readDouble()
double
readFloat()
float
readUnsignedByte()
int
readUnsignedShort()
int
readFully(byte[] b)
void
从输入流中读取一些字节,并将它们存储在缓冲区数组 b 中
readFully(byte[] b, int off,int len)
void
从输入流中读取 len 个字节
skipBytes(int n)
int
与 InputStream.skip 等价
readUTF()
String
按照 UTF-8 形式从输入中读取字符串
readLine()
String
按回车 (r) 换行 ( ) 为分割符读取一行字符串,不完全支持 UNICODE
writeBoolean(boolean v)
void
writeByte(int v)
void
writeShort(int v)
void
writeChar(int v)
void
writeInt(int v)
void
writeLong(long v)
void
writeFloat(float v)
void
writeDouble(double v)
void
write(byte[] b)
void
与 OutputStream.write 同义
write(byte[] b, int off, int len)
void
与 OutputStream.write 同义
write(int b)
void
与 OutputStream.write 同义
writeBytes(String s)
void
只输出每个字符的低 8 位;不完全支持 UNICODE
writeChars(String s)
void
每个字符在输出中都占两个字节
数据流类 DataInputStream 和 DataOutputStream 的处理对象除了是字节或字节数组外,还可以实现对文件的不同数据类型的读写:
1. 分别实现了 DataInput 和 DataOutput 接口。
2. 在提供字节流的读写手段同时,以统一的形式向输入流中写入 boolean,int,long,double 等基本数据类型,并可以再次把基本数据类型的值读取回来。
3. 提供了字符串读写的手段。
标准流、内存读写流、顺序输入流
语言包 java.lang 中的 System 类管理标准输入/输出流和错误流。
System.in 从 InputStream 中继承而来,用于从标准输入设备中获取输入数据(通常是键盘) System.out 从 PrintStream 中继承而来,把输入送到缺省的显示设备(通常是显示器) System.err 也是从 PrintStream 中继承而来,把错误信息送到缺省的显示设备(通常是显示器)
每当 main 方法被执行时,就会自动生产上述三个对象。这里就不再写代码验证了。 内存读写流
为了支持在内存上的 I/O,java.io 中提供了类:ByteArrayInputStream、ByteArrayOutputStream 和 StringBufferInputStream
1. ByteArrayInputStream 可以从指定的字节数组中读取数据。
2. ByteArrayOutputStream 中提供了缓冲区可以存放数据(缓冲区大小可以在构造方法中设定,缺省为 32),可以用 write() 方法向其中写入数据,然后用 toByteArray() 方法将缓冲区中的有效字节写到字节数组中去。size() 方法可以知道写入的字节数, reset() 可以丢弃所有内容。
3. StringBufferInputStream 与 ByteArrayInputStream 相类似,不同点在于它是从字符缓冲区 StringBuffer 中读取 16 位的 Unicode 数据,而不是 8 位的字节数据(已被 StringReader 取代)。
这里只做简要的介绍,有兴趣的同学可以查看一下这些类里具体的方法。
顺序输入流
java.io 中提供了类 SequenceInputStream,使应用程序可以将几个输入流顺序连接起来。顺序输入流提供了将多个不同的输入流统一为一个输入流的功能,这使得程序可能变得更加简洁。
京东方全新自研f众所周知,在OLED屏领域,三星一直是王者,最高时拿下90的份额。而京东方TCL等国产厂商在后面慢慢追,现在终于拿到了20左右的份额,部分追上了三星的OLED屏水平。很多人认为,要
win10MicrosoftWi家里的Win10电脑,今天突然网络适配器里面多了一个设备叫MicrosoftWiFiDirectVirtualAdapter,禁用了,不到2秒的时间会再创建一个出来。马上百度,原来
谷歌Pixel7渲染图曝光基于CAD制作,有望10月推出IT之家3月26日消息,昨天有消息称谷歌Pixel7系列智能手机可能要到10月才会问世,现在Pixel7的渲染图已经曝光,这些渲染图基于CAD制作,可靠性很高。据LetsGoDig
比亚迪对特斯拉下手了!全新海豹曝光,四驱3。8S破百,续航700Km导读比亚迪对特斯拉下手了!全新海豹曝光,四驱3。8S破百,续航700Km随着近几年的经济飞速发展,不再是之前的出门基本靠走了,人们对于汽车的日常需求也越来越高,数量也是极具的增加,
华为mate10pro比华为mate10优势在哪里?10月16日华为年度旗舰Mate10系列手机发布,不出意料的发布了华为Mate10华为Mate10Pro以及华为Mate10保时捷版三款产品。那么很多用户纠结了究竟是选择Mate1
魔改iPhone为什么一直有市场?文丨雷科技leitech5年前的秋天,为了向iPhone问世10周年致敬,苹果推出了万众瞩目的创新性产品iPhoneX,这款产品不仅首次采用了刘海屏设计,取消了物理home键设计,
实体店,已进入无利期,个体门店经营户,能否存活下来呢?在过去的两年里,如果你有心,会发现社会上出现了一个非常神奇的现象。一方面,大家都在谈论互联网金融区块链人工智能大数据。无论是创业还是投资,很多人都把目光投向了这些新兴领域。但另一方
英媒笨手机悄悄回归英国广播公司网站21日发表题为不智能但有智慧?笨手机的回归的报道,全文摘编如下17岁的罗宾韦斯特是同龄人中的异类她没有智能手机。她不会整天刷Instagram等软件,她用的是所谓笨
骁龙778G手机卖4千,换芯版华为P50遇冷,上市两天评价仅2003月16日的2022华为全屋智能及全场景新品春季发布会上,华为正式发布了P50系列的第四款机型华为P50E,售价4088元起,已于3月24日正式上市。受管控条例影响,P50E依旧只
赵丽萍决策AI将降低企业智能转型门槛中新经纬3月26日电题决策AI将降低企业智能转型门槛作者赵丽萍中金公司研究部软件电信和教育行业分析师,执行总经理决策AI已在互联网行业证明具备显著的商业价值,是互联网巨头智能化转型
电子管的发明现代半导体芯片经常是由上百亿个MOS晶体管所组成。而在MOS晶体管发明之前,双极型晶体管发挥着重要作用。但是双极型晶体管也不是凭空创造的,它是在电子管的应用基础上发明的。这些器件的