JAVA的IO

2022-03-29  本文已影响0人  独自闯天涯的码农

一、字符与字节

基本数据类型大小

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;

但是字节与宇符之间的关系是怎样的?

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、字节流和字符流

宇节流和字符流和用法几乎完全一样,区别在于字节流和字符流所操作的数据单元不同。
字符流的由来:因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。
字节流和字符流的区别:

  1. 读写单位不同:宇节流以字节(8bit)为单位,字符流以宇符为单位,根据码表映射字符,一次可能读多个字节。
  2. 处理对象不同:宇节流能处理所有类型的数据(如因片、avi等),而宇符流
    只能处理字符类型的数据。

只要是处理纯文本数据,就优先考虑使用宇符流。除此之外都使用字节流。

3、节点流和处理流

按照流的角色来分,可以分为节点流和处理流。

五、IO流的四大基类

根据流的流向以及操作的数据单元不同,将流分为了四种类型,每种类型对应一种抽象基类。这四种抽象基类分别为:InputStream,Reader,OutputStream以及Writer。四种基类下,对应不同的实现类,具有不同的特性。在这些实现类中,又可以分为节点流和处理流。


IO流的框架

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 由以下几个核心部分组成:

传统的IO操作面向数据流,意味着每次从流中读一个或多个字节,直至完成,数据没有被缓存在任何地方。NIO操作面向缓冲区,数据从Channel读取到Buffer缓冲区,随后在Buffer中处理数据。

上一篇 下一篇

猜你喜欢

热点阅读