什么是IO流

Java中的IO

了解什么是IO流之前,要先知道什么是IO。IO,就是in和out(即输入和输出),指应用程序和外部设备之间的数据传递,常见的外部设备包括文件、管道、网络连接等。

流的概念与特性

概念

Java 中是通过流处理IO 的。流(Stream),是一个抽象的概念,是指一连串的数据(字符或字节),是以先进先出的方式发送信息的通道。当程序需要读取数据时,就会开启一个通向数据源的流,同理,当程序需要写入数据时,就会开启一个通向目的地的流。

特性

关于流的特性有以下几点:

先进先出:最先写入输出流的数据最先被输入流读取到。

顺序存取:可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。(RandomAccessFile除外,它可以对文件随机访问的操作,访问包括读和写操作)

只读或只写:每个流只能是输入流或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,对输出流只能进行写操作。在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流。

IO流的分类

IO分类图如下(详细内容可查看API文档):

IO流主要的分类方式有以下3种:

按数据流的方向:输入流、输出流

按处理数据单位:字节流、字符流

按功能:节点流、处理流

输入流与输出流

这里要注意的是:输入与输出是相对于应用程序而言的,比如文件读写,读取文件是输入流,写文件是输出流(即流向内存是输入流,流出内存的输出流),不要搞反,不是很清楚可以看下图。

字节流与字符流

Unicode 编码中,一个英文为1个字节,一个中文为2个字节。而在UTF-8编码中,一个中文字符是3个字节。如果使用字节流处理中文,如果一次读写一个字符对应的字节数就不会有问题,一旦将一个字符对应的字节分裂开来,就会出现乱码了。为了更方便地处理中文这些字符,Java就推出了字符流。

字节流和字符流的用法几乎完全一样,区别在于字节流和字符流所操作的数据单元不同,字节流操作的单元是数据单元是8位的字节(即1个字节),字符流操作的是数据单元为16位的字符(即1个字符或2个字节)。

字节流和字符流的其他区别:

字节流一般用来处理图像、视频、音频、PPT、Word等类型的文件。字符流一般用于处理纯文本类型的文件,如TXT文件等,但不能处理图像视频等非文本文件。简单说就是就是:字节流可以处理一切文件,而字符流只能处理纯文本文件。

字节流本身没有缓冲区,缓冲字节流相对于字节流,效率提升非常高。而字符流本身就带有缓冲区,缓冲字符流相对于字符流效率提升就不是那么大了。

节点流和处理流

节点流:直接操作数据读写的流类,比如FileInputStream

处理流:对一个已存在的流的链接和封装,通过对数据进行处理为程序提供功能强大、灵活的读写功能,例如BufferedInputStream(缓冲字节流)

处理流和节点流应用了Java的装饰者设计模式。下图就很形象地描绘了节点流和处理流,处理流是对节点流的封装,最终的数据处理还是由节点流完成的。

缓冲流:

在诸多处理流中,有一个非常重要,那就是缓冲流。程序与磁盘的交互相对于内存运算是很慢的,容易成为程序的性能瓶颈。减少程序与磁盘的交互,是提升程序效率一种有效手段。缓冲流,就应用这种思路:普通流每次读写一个字节,而缓冲流在内存中设置一个缓存区,缓冲区先存储足够的待操作数据后,再与内存或磁盘进行交互。这样,在总数据量不变的情况下,通过提高每次交互的数据量,减少了交互次数。需要注意的是,缓冲流效率不一定高,在某些情形下,缓冲流效率反而更低,具体请见IO流效率对比。

字节流

一切皆为字节

一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,同理传输时一样如此,所以字节流可以传输任意文件数据。在操作流的时候要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。

字节输出流【OutputStream】

java.io.OutputStream 抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。它定义了字节输出流的基本共性功能方法如下:

public void close() :关闭此输出流并释放与此流相关联的任何系统资源。

public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。

public void write(byte[] b) :将 b.length字节从指定的字节数组写入此输出流。

public void write(byte[] b, int off, int len) :从指定的字节数组写入 len(长度)字节,从偏移量 off(索引)开始输出到此输出流。

public abstract void write(int b) :将指定的字节输出流。

小贴士:

close()方法,当完成流的操作时,必须调用此方法,释放系统资源。

在创建字节输出流对象和使用write()方法写出数据时,会分别抛出FileNotFoundException 和 IOException异常,要注意的是,IOException异常是FileNotFoundException异常的父类,所以这里我们直接抛出IOException异常就可以了。

FileOutputStream类

OutputStream 有很多子类,我们从最常见的一个类FileOutputStream类开始。java.io.FileOutputStream 类是文件输出流,用于将数据写出到文件。

构造方法

public FileOutputStream(File file) :创建一个向指定File对象表示的文件中写入数据的文件输出流。

public FileOutputStream(String name) : 创建一个向具有指定名称的文件中写入数据的输出文件流。

参数 File file:目的地是一个文件    String name:目的地是一个文件的路径

注意:当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有这个文件,会创建该文件。如果有这个文件,会清空这个文件的数据。

作用:

创建一个Fileoutputstream对象

会根据构造方法中传递的文件/文件路径,创建一个空的文件

会把FiLeOutputStream对象指向创建好的文件

构造方法代码演示:

public class FileOutputStreamConstructor throwsIOException {public static voidmain(String[] args) {//使用File对象创建流对象

File file = new File("a.txt");

FileOutputStream fos= newFileOutputStream(file);//使用文件名称创建流对象

FileOutputStream fos = new FileOutputStream("b.txt");

}

}

写出字节数据:

原理:(内存-->硬盘)

java程序-->JVM(java虚拟机 )-->OS(操作系统)-->OS调用写数据的方法-->把数据写入到文件中

方法:

写出字节: write(int b) 方法,每次可以写出一个字节数据,代码演示:

public classFOSWrite {public static voidmain(String[] args) throws IOException {//使用文件名称创建流对象

FileOutputStream fos = new FileOutputStream("fos.txt");//写出数据

fos.write(97);//写出第1个字节

fos.write(98);//写出第2个字节

fos.write(99);//写出第3个字节//关闭资源

fos.close();

}

}

输出结果:

abc

写出字节数组: write(byte[] b) ,每次可以写出数组中的数据,代码演示:

public classFOSWrite {public static void main(String[] args) throwsIOException {//使用文件名称创建流对象

FileOutputStream fos = new FileOutputStream("fos.txt");//字符串转换为字节数组

byte[] b = "张三李四王五".getBytes();//写出字节数组数据

fos.write(b);//关闭资源

fos.close();

}

}

输出结果:

张三李四王五

写出指定长度字节数组: write(byte[] b, int off, int len) ,每次写出从off索引开始,len个字节,代码演示:

public classFOSWrite {public static void main(String[] args) throwsIOException {//使用文件名称创建流对象

FileOutputStream fos = new FileOutputStream("fos.txt");//字符串转换为字节数组

byte[] b = "abcde".getBytes();//写出从索引1开始,2个字节。索引1是b,两个字节,也就是bc。

fos.write(b,1,2);//关闭资源

fos.close();

}

}

输出结果:

bc

数据追加续写

每次程序运行,创建输出流对象,都会清空目标文件中的数据。那么如果要保留目标文件中数据,继续添加新数据,就要使用如下方法:

public FileOutputStream(File file, boolean append) : 创建文件输出流以写入由指定的 File对象表示的文件。

public FileOutputStream(String name, boolean append) : 创建文件输出流以指定的名称写入文件。

这两个构造方法,参数中都需要传入一个boolean类型的值, true 表示追加数据, false 表示清空原有数据。

代码使用演示:

public classFOSWrite {public static void main(String[] args) throwsIOException {//使用文件名称创建流对象并设置数据追加续写

FileOutputStream fos = new FileOutputStream("fos.txt",true);//字符串转换为字节数组

byte[] b = "abcde".getBytes();//写出字节数组数据

fos.write(b);//关闭资源

fos.close();

}

}

文件操作前:

bc

文件操作后:

bcabcde

写出换行

Windows系统里,换行符号是 \r\n 。回车符 \r 和换行符 \n :   回车符:回到一行的开头(return)   换行符:下一行(newline)。

系统中的换行:

Windows系统里,每行结尾是 回车+换行 ,即 \r\n ;

Unix系统里,每行结尾只有 换行 ,即 \n ;

Mac系统里,每行结尾是 回车 ,即 \r 。

代码使用演示:

public classFOSWrite {public static void main(String[] args) throwsIOException {//使用文件名称创建流对象

FileOutputStream fos = new FileOutputStream("fos.txt");//定义字节数组

byte[] words = {97,98,99,100,101};//遍历数组

for (int i = 0; i < words.length; i++) {//写出一个字节

fos.write(words[i]);//写出一个换行, 换行符号转成数组写出

fos.write("\r\n".getBytes());

}//关闭资源

fos.close();

}

}

输出结果:

a

b

c

d

e

字节输入流【InputStream】

java.io.InputStream 抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。它定义了字节输入流的基本共性功能方法。

public void close() :关闭此输入流并释放与此流相关联的任何系统资源。

public abstract int read() : 从输入流读取数据的下一个字节。

public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。

小贴士:

close方法,当完成流的操作时,必须调用此方法,释放系统资源。

在创建字节输入流对象和使用read()方法读取数据时,会分别抛出FileNotFoundException 和 IOException异常,要注意的是,IOException异常是FileNotFoundException异常的父类,所以这里我们直接抛出IOException异常就可以了。

FileInputStream类

java.io.FileInputStream 类是文件输入流,从文件中读取字节。

构造方法

FileInputStream(File file) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 fifile命名。

FileInputStream(String name) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。

参数:读取文件的数据源   File file:文件    String name:文件的路径

注意:当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有该文件,会抛出 FileNotFoundException 。

构造方法代码演示:

public class FileInputStreamConstructor throwsIOException{public static voidmain(String[] args) {//使用File对象创建流对象

File file = new File("a.txt");

FileInputStream fis= newFileInputStream(file);//使用文件名称创建流对象

FileInputStream fis = new FileInputStream("b.txt");

}

}

作用:

会创建一个FileInputStream对象

会把FileInputstream对象指向构造方法中要读取的文件

读取字节数据

原理:(硬盘-->内存)

java程序-->JVM(java虚拟机 )-->OS(操作系统)-->OS调用读取数据的方法-->从文件中读取数据

方法:

读取字节: read():每次可以读取一个字节的数据,返回值int类型,读取到文件末尾,返回 -1 ,代码演示:

public classFISRead {public static void main(String[] args) throwsIOException{//使用文件名称创建流对象,文件内容为abcde

FileInputStream fis = new FileInputStream("read.txt");//读取数据,返回一个字节

int read =fis.read();

System.out.println((char) read);

read=fis.read();

System.out.println((char) read);

read=fis.read();

System.out.println((char) read);

read=fis.read();

System.out.println((char) read);

read=fis.read();

System.out.println((char) read);//读取到末尾,返回‐1

read =fis.read();

System.out.println( read);//关闭资源

fis.close();

}

}

输出结果:

a

b

c

d

e

‐1

循环改进读取方式,代码演示:

public classFISRead {public static void main(String[] args) throwsIOException{//使用文件名称创建流对象,文件内容为abcde

FileInputStream fis = new FileInputStream("read.txt");//定义变量,保存数据

intb ;//循环读取

while ((b = fis.read())!=‐1) {

System.out.println((char)b);

}//关闭资源

fis.close();

}

}

输出结果:

a

b

c

d

e

小贴士:

虽然读取了一个字节,但是会自动提升为int类型。

流操作完毕后,必须释放系统资源,调用close方法,千万记得。

使用字节数组读取: read(byte[] b) ,每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读取到末尾时,返回 -1 ,代码演示:

public classFISRead {public static void main(String[] args) throwsIOException{//使用文件名称创建流对象,文件内容为abcde

FileInputStream fis = new FileInputStream("read.txt");//定义变量,作为有效个数

intlen ;//定义字节数组,作为装字节数据的容器

byte[] b = new byte[2];//循环读取

while (( len= fis.read(b))!=‐1) {//每次读取后,把数组变成字符串打印

System.out.println(newString(b));

}//关闭资源

fis.close();

}

}

输出结果:

ab

cd

ed

错误数据 d ,是由于最后一次读取时,只读取一个字节 e ,数组中,上次读取的数据没有被完全替换,所以要通过 len ,获取有效的字节,代码演示:

public classFISRead {public static void main(String[] args) throwsIOException{//使用文件名称创建流对象,文件内容为abcde

FileInputStream fis = new FileInputStream("read.txt");//定义变量,作为有效个数

intlen ;//定义字节数组,作为装字节数据的容器

byte[] b = new byte[2];//循环读取

while (( len= fis.read(b))!=‐1) {//每次读取后,把数组的有效字节部分,变成字符串打印

System.out.println(new String(b,0,len));//len 每次读取的有效字节个数

}//关闭资源

fis.close();

}

}

输出结果:

ab

cd

e

小贴士:

使用数组读取,每次读取多个字节,减少了系统间的IO操作次数,从而提高了读写的效率,建议开发中使用。

使用字节数组读取数据明确两件事情:

方法的参数byte[]的作用?

起到缓冲作用,存储每次读取到的多个字节

数组的长度一般定义为1024(1kb)或者1024的整数倍

方法的返回值int是什么?

每次读取的有效字节个数

字节流案例

说明:图片复制,从已有的文件中读取字节,将该字节写出到另一个文件中

案例实现:

public classCopy {public static void main(String[] args) throwsIOException {//1.创建流对象//1.1 指定数据源

FileInputStream fis = new FileInputStream("D:\\test.jpg");//1.2 指定目的地

FileOutputStream fos = new FileOutputStream("test_copy.jpg");//2.读写数据//2.1 定义数组

byte[] b = new byte[1024];//2.2 定义长度

intlen;//2.3 循环读取

while ((len = fis.read(b))!=‐1) {//2.4 写出数据

fos.write(b, 0, len);

}//3.关闭资源

fos.close();

fis.close();

}

}

小贴士:

流的关闭原则:先开后关,后开先关。

字符流

当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。

字符输出流【Writer】

java.io.Writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。它定义了字节输出流的基本共性功能方法。

void write(int c) 写入单个字符。

void write(char[] cbuf) 写入字符数组。

abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分,offff数组的开始索引,len写的字符个数。

void write(String str) 写入字符串。

void write(String str, int off, int len) 写入字符串的某一部分,offff字符串的开始索引,len写的字符个数。

void flush() 刷新该流的缓冲。

void close() 关闭此流,但要先刷新它。

FileWriter类

java.io.FileWriter 类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

构造方法

FileWriter(File file) : 创建一个新的 FileWriter,给定要写入数据的File对象。

FileWriter(String fileName) : 创建一个新的 FileWriter,给定要写入数据的文件的名称。

当你创建一个流对象时,必须传入一个文件路径,类似于FileOutputStream。

构造举例,代码如下:

public classFileWriterConstructor {public static void main(String[] args) throwsIOException {//使用File对象创建流对象

File file = new File("a.txt");

FileWriter fw= newFileWriter(file);//使用文件名称创建流对象

FileWriter fw = new FileWriter("b.txt");

}

}

写出字符数据

写出字符: write(int b) 方法,每次可以写出一个字符数据,代码使用演示:

public classFWWrite {public static void main(String[] args) throwsIOException {//使用文件名称创建流对象

FileWriter fw = new FileWriter("fw.txt");//写出数据

fw.write(97); //写出第1个字符

fw.write('b'); //写出第2个字符

fw.write('c'); //写出第3个字符

fw.write(30000); //写出第4个字符,中文编码表中30000对应一个汉字。

/*【注意】关闭资源时,与FileOutputStream不同。 如果不关闭,数据只是保存到缓冲区,并未保存到文件。*/fw.close();

}

}

输出结果:

abc田

小贴士:

虽然参数为int类型四个字节,但是只会保留一个字符的信息写出。

如果未调用close方法,数据只是保存到了缓冲区,并未写出到文件中。

写出字符数组 : write(char[] cbuf) 和 write(char[] cbuf, int off, int len) ,每次可以写出字符数组中的数据,用法类似FileOutputStream,代码使用演示:

public classFWWrite {public static void main(String[] args) throwsIOException {//使用文件名称创建流对象

FileWriter fw = new FileWriter("fw.txt");//字符串转换为字节数组

char[] chars = "张三李四王五".toCharArray();//写出字符数组

fw.write(chars); //张三李四王五//写出从索引2开始,2个字节。索引2是'李',两个字节,也就是'李四'。

fw.write(b,2,2); //李四//关闭资源

fos.close();

}

}

写出字符串: write(String str) 和 write(String str, int off, int len) ,每次可以写出字符串中的数据,更为方便,代码使用演示:

public classFWWrite {public static void main(String[] args) throwsIOException {//使用文件名称创建流对象

FileWriter fw = new FileWriter("fw.txt");//字符串

String msg = "张三李四王五";//写出字符数组

fw.write(msg); //张三李四王五//写出从索引2开始,2个字节。索引2是'李',两个字节,也就是'李四'。

fw.write(msg,2,2); //李四//关闭资源

fos.close();

}

}

续写和换行:操作类似于FileOutputStream。

public classFWWrite {public static void main(String[] args) throwsIOException {//使用文件名称创建流对象,可以续写数据

FileWriter fw = new FileWriter("fw.txt",true);//写出字符串

fw.write("张三");//写出换行

fw.write("\r\n");//写出字符串

fw.write("李四");//关闭资源

fw.close();

}

}

输出结果:

张三

李四

关闭和刷新

因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果既想写出数据,又想继续使用流,就需要 flush 方法了。

flush :刷新缓冲区,流对象可以继续使用。

close :先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。

代码使用演示:

public classFWWrite {public static void main(String[] args) throwsIOException {//使用文件名称创建流对象

FileWriter fw = new FileWriter("fw.txt");//写出数据,通过flush

fw.write('刷'); //写出第1个字符

fw.flush();

fw.write('新'); //继续写出第2个字符,写出成功

fw.flush();//写出数据,通过close

fw.write('关'); //写出第1个字符

fw.close();

fw.write('闭'); //继续写出第2个字符,【报错】java.io.IOException: Stream closed

fw.close();

}

}

小贴士:

即便是flush方法写出了数据,操作的最后还是要调用close方法,释放系统资源。

字符输入流【Reader】

java.io.Reader 抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法。

public void close() :关闭此流并释放与此流相关联的任何系统资源。

public int read() : 从输入流读取一个字符。

public int read(char[] cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。

FileReader类

java.io.FileReader 类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

小贴士:

字符编码:字节与字符的对应规则。Windows系统的中文编码默认是GBK编码表。idea中是UTF-8。

字节缓冲区:一个字节数组,用来临时存储字节数据。

构造方法

FileReader(File file) : 创建一个新的 FileReader ,给定要读取的File对象。

FileReader(String fileName) : 创建一个新的 FileReader ,给定要读取的文件的名称。

当你创建一个流对象时,必须传入一个文件路径,类似于FileInputStream 。

构造举例,代码如下:

public class FileReaderConstructor throwsIOException{public static voidmain(String[] args) {//使用File对象创建流对象

File file = new File("a.txt");

FileReader fr= newFileReader(file);//使用文件名称创建流对象

FileReader fr = new FileReader("b.txt");

}

}

读取字符数据

读取字符: read ()方法,每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回 -1 ,循环读取,代码使用演示:

public classFRRead {public static void main(String[] args) throwsIOException {//使用文件名称创建流对象 ,文件内容:张三李四王五

FileReader fr = new FileReader("read.txt");//定义变量,保存数据

intb ;//循环读取

while ((b = fr.read())!=‐1) {

System.out.println((char)b);

}//关闭资源

fr.close();

}

}

输出结果:

小贴士:

虽然读取了一个字符,但是会自动提升为int类型。

使用字符数组读取: read(char[] cbuf) ,每次读取b的长度个字符到数组中,返回读取到的有效字符个数,读取到末尾时,返回 -1 ,代码使用演示:

public classFISRead {public static void main(String[] args) throwsIOException {//使用文件名称创建流对象 ,文件内容:张三李四王五

FileReader fr = new FileReader("read.txt");//定义变量,保存有效字符个数

intlen ;//定义字符数组,作为装字符数据的容器

char[] cbuf = new char[2];//循环读取

while ((len = fr.read(cbuf))!=‐1) {

System.out.println(new String(cbuf,0,len));

}//关闭资源

fr.close();

}

}

输出结果:

张三

李四

王五

总结

JAVA mac系统io文件流_Java IO流基础1--IO的分类体系与文件流相关推荐

  1. java io密集型任务_Java线程池讲解——针对IO密集型任务

    sap java开发技术详解&mdash基础 94.01元 (需用券) 去购买 > 针对 IO 密集型的任务,我们可以针对原本的线程池做一些改造,从而可以提高任务的处理效率. 基本 在阿 ...

  2. java获取系统当前时间格式化_java 获取系统当前时间并格式化

    java 获取系统当前时间并格式化 CreateTime--2018年5月9日11:41:00 Author:Marydon 实现方式有三种 updateTime--2018年7月23日09点32分 ...

  3. 上传文件到tftp服务器,网络基础知识:TFTP协议之上传文件

    原标题:网络基础知识:TFTP协议之上传文件 上传文件指的是客户端将本地上的文件上传到TFTP服务器上.下面介绍客户端如何进行文件上传,以及上传时所涉及的各类型数据包. 1.工作流程 客户端会向TFT ...

  4. java生成pdf文件流_java 已经获取pdf代码,如何把他pdf文件保存到本机 要求用输出流做...

    展开全部 一.iText介绍 iText是着名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的32313133353236313431303231363533e4b893e5b1 ...

  5. java酒店系统项目面试经验_Java项目案例:酒店前台客服管理系统

    import java.util.Scanner; public class HelloWorld { public static void main(String[] args){ String [ ...

  6. java跨系统和跨域_java web服务解决跨域问题

    问题1:浏览器页面跨域请求报错 相信很多程序员都遇到过跨域的问题,如何解决一直是一件很头疼的事情,我就描述下我遇到的问题,及解决办法.什么是跨域,请自行脑补. 需要添加maven依赖,在web.xml ...

  7. java获取系统时间到毫秒_java获取当前时间精确到毫秒

    [java:long now = System.currentTimeMillis()javascript:var now = new Date().getTime();objective-c:lon ...

  8. java考试系统详细源码_Java在线考试系统(含源码)

    本文demo下载和视频教学观看地址:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1076 本实例介绍了在线考 ...

  9. java主类与源代码名称_Java高级编程基础:类文件结构解析,看穿Class代码背后的秘密...

    类文件结构 在说完了JVM内部结构后,接下来我们需要说一下另外一个非常重要的基础概念Class类结构. 我们既然知道了开发的Java源代码会首先被编译成字节码文件保存,JVM的类加载器会读取这些文件内 ...

最新文章

  1. 编译工具 之 ant
  2. js如何关闭当前页,而不弹出提示框
  3. Yii2与Yii1的模块中Layout使用区别
  4. Netty之粘包问题解决
  5. 数据丢失如当头棒喝,数据备份重如山!
  6. linux 定时任务 crontab 报错 service command not found 解决方法
  7. 一个垃圾分类项目带你玩转飞桨(1)
  8. Xcode7 UI自动化测试详解 带demo UITests
  9. video 标签存在的一些坑
  10. 使用feed_dict不一定要用占位符
  11. ajax返回失败原因,ajax POST请求返回失败
  12. 【数学】扩展欧几里得算法
  13. Poker2  简单配置(方便于vim党)
  14. 使用阿里云镜像加速器--docker
  15. python 温度 符号_python中温度单位转换的实例方法
  16. 详解:化工厂人员定位方案与双重预防机制建设
  17. winpe读取linux硬盘数据恢复,Acronis True Image的WinPE恢复媒体中有一个文件管理器,你知道吗?...
  18. Windows+GCC得到各种格式的文件正文(office文件,PDF,邮件,html,zip等)
  19. 谁是中国移动互联网的王者?360发布定制手机消息随感
  20. 制造企业使用云平台可以做什么

热门文章

  1. 检查软件版本运行时提示丢失 msvcr100d.dll
  2. R语言绘制布林带通道
  3. ActiveX控件 oxc文件的使用
  4. 高中计算机学考什么时候,2017年普通高中信息技术学科学业水平考试时间、考试方式、考试内容...
  5. ollvm 学习笔记
  6. 攻防靶场|Vulnstack2靶场之CS实战
  7. 发起“元点计划”,非繁城品“环保+助学”彰显企业社会责任感
  8. python爬虫之下载电影(不是爱奇艺腾讯视频等平台哈)
  9. 河南固始计算机学校哪个好,信阳市最好的5所高级中学,每一所都实力雄厚,都出过高考状元...
  10. 会议系统m900服务器网口灯,ZXV10 VCS中兴企业视频会议系统(M900+T7)