一、字符与字节
- 在Java中有输入、输出两种IO流;
- 每种输入、输出流又分为字节流和字符流两大类;
- 关于字节,每个宇节(byte)有8bit组成,每种数据类型又几个字节组成等。
- 关于字符,我们可能知道代表一个汉字或者英文字母。
基本数据类型大小
1Byte 字节, 8位;
Boolean ,1个字节, 8位;
Short , 2个字节,16位;
char ,2个字节,16位;
Int , 4个字节,32位;
float, 4个字节,32位;
Long ,8个字节,64位;
double,8个字节,64位;
Int64, 等于long, 占8个字节
1byte = 8bit
1 kb = 1024byte;
1 mb = 1024kb;
1 gb = 1024mb;
但是字节与宇符之间的关系是怎样的?
- Java采用unicode编码,2个字节来表示一个字符;
- C语言中采用ASCIl,一个字符通常占1个字节;
- 但是在0~127整数之间的字符映射,unicode向下兼容ASCII。
而Java采用unicode 来表示宇符,一个中文或英文字符的unicode编码都占2个字节。但如果采用其他编码方式,一个字符占用的宇节数则各不相同。
1、在 GB2312编码或 GBK 编码中,一个英文字母字符存储需要1个字
节,一个汉字字符存储需要2个字节。
2、在UTF-8编码中,一个英文字母字符存储需要1个字节,一个汉字宇符储存需要3到4个字节。
3、在UTF-16编码中,一个英文宇母字符存储需要2个字节一个汉宇宇符储存需要3到4个字节(Unicode扩展区的一些汉字存储需要4个字节)
4、在UTF-32编码中,世界上任何字符的存储都需要4个字节:
简单来讲,一个字符表示一个汉字或英文字母,具体宇符与字节之间的大小比例视编码情況而定。
二、File类
File类是java.io包下代表与平台无关的文件和目录,也就是说,如果希望在程序中操作文件和目录,都可以通过File类来完成。
构造函数
FIle file = new File("路径");
路径分隔符:
window:/、\ 都可以;
linux/unix: /;
最好使用跨平台分隔符:File.separator
路径:
./:表示当前路径
../:表示上一级路径
当前路径:默认当前文件夹相对路径
绝对路径:完整路径名;
File的方法:
三、IO流的概念
Java的10流是实现输入/输出的基础,它可以方便地实现数据的输入/输出操作,在Java中把不同的输入/输出源抽象表述为"流"。流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备问的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作流有输入和输出,输入时是流从数据源流向程序。输出时是流从程序传向数据源,而数据源可以是内存,文件,网络或程序等。
四、IO流的分类
1、输入流和输出流
根据数据流向不同分为:输入流和输出流
- 输入流:只能从中读取数据,而不能向其写入数据。
- 输出流:只能向其写入数据,而不能从中读取数据。
2、字节流和字符流
宇节流和字符流和用法几乎完全一样,区别在于字节流和字符流所操作的数据单元不同。
字符流的由来:因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。
字节流和字符流的区别:
- 读写单位不同:宇节流以字节(8bit)为单位,字符流以宇符为单位,根据码表映射字符,一次可能读多个字节。
- 处理对象不同:宇节流能处理所有类型的数据(如因片、avi等),而宇符流
只能处理字符类型的数据。
只要是处理纯文本数据,就优先考虑使用宇符流。除此之外都使用字节流。
3、节点流和处理流
按照流的角色来分,可以分为节点流和处理流。
- 可可以从/向一个特定的10设备(如磁盘、网络)读/写数据的流,称为节点流,节点流也被成为低级流。(如:FileInputStream)
- 处理流是对一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写功能,处理流也被成为高级流。(如:BufferedInputStream)
五、IO流的四大基类
根据流的流向以及操作的数据单元不同,将流分为了四种类型,每种类型对应一种抽象基类。这四种抽象基类分别为:InputStream,Reader,OutputStream以及Writer。四种基类下,对应不同的实现类,具有不同的特性。在这些实现类中,又可以分为节点流和处理流。

1、InputStream
InputStream 是所有的输入字节流的父类,它是一个抽象类,主要句含三个分法:
//读取一个字节并以整数的形式返回(0-255),如果返回-1已到输入流的末尾。
int read();
//读取一系列字节并存储到一个组buffer,返回实际读取的字节数,如果读取前已到输入流的末尾返回-1。
int read (byte [] buffer );
//读取1ength个字节并存储到一个字节数组buffer,从off位置开始存,最多Ien返回实际读取的字节数,如果读取前以到输入流的末尾返回-1。
int read (byte[] buffer,int off, int len)
2、Reader
Reader 是所有的输入字符流的父类,它是一个抽象类,主要包含三个方法:
//读取一个字符并以整数的形式返回(0-255),如果返回-1巴到输入流的末尾。
int read()
//读取一系列宇符并存储到一个数组buffer,返回实际读取的宇符数,如果读取前已到输入流的末尾返回-1。
int read (char[] cbuf )
//读取1ength个字符,并存储到一个数组buffer,从off位置开始存,最多读取len,返回实际读取的字符数,如果读取前以到输入流的末尾返回-1。
int read (char[] cbuf, int off, int, len)
3、OutputStream
OutputStream 是所有的输出字节流的父类,它是一个抽象类,主要包含如下四个方法:
//向输出流中写入一个字节数据,该字节数据为参数b的低8位
void write(int b);
//将一个字节类型的数组中的数据写入输出流。
void write (byte[] b);
//将一个字节类型的数组中的从指定位置(off) 开始的,len个字节写入到输出流。
void write(byte[] b, int off, int len);
//将输出流中缓冲的数据全部写出到目的地。
void flush);
4、Writer
Writer 是所有的输出字符流的父类,它是一个抽象类,主要包含如下六个方法:
//向输出流中写入一个字符数据,该字节数据为参数b的低16位。
void.write(int c);
//将一个字符类型的数组中的数据写入输出流,
void write (char[] cbuf)
//将一个字符类型的数组中的从指定位置(offset)开始的,length个字符写入到输出流。
void write(char[] cbuf, int offset, int length) ;
//将一个字符串中的字符写入到输出流。
void write (String string) ;
//将一个字符串从offset开始的length个字符写入到输出流。
void write(String string,int offset, int length) ;
//将输出流中缓冲的数据全部写出到目的地
void flush)
所有流使用完,记得关闭,调用close()方法;
六、NIO
1、NIO概念
Java NIO(New IO)是一个可以替代标准Java IO API的IO API以Java1.4开始),
Java NIO提供了与标准IO不同的IO工作方式。
所以Java NIO是一种新式的IO标准,与之间的普通IO的工作方式不同。标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入通道也类似。
由上面的定义就说明NIO是一种新型的IO,但NIO不仅仅就是等于Non-blockingIO(非阻塞IO),NIO中有实现非阻塞IO的具体类,但不代表NIO就是Non-blocking IO(非阻塞)
Java NIO 由以下几个核心部分组成:
- Buffer
- Channel
- Selector
传统的IO操作面向数据流,意味着每次从流中读一个或多个字节,直至完成,数据没有被缓存在任何地方。NIO操作面向缓冲区,数据从Channel读取到Buffer缓冲区,随后在Buffer中处理数据。
网友评论