首页编程java编程java i o是什么流,Java中的IO流的基本知识

java i o是什么流,Java中的IO流的基本知识

编程之家2023-10-1292次浏览

大家好,今天来为大家分享java i o是什么流的一些知识点,和Java中的I/O流的基本知识的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!

java i o是什么流,Java中的IO流的基本知识

Java中IO缓冲区的原理是什么

如果是边读边写,就会很慢,也伤硬盘。缓冲区就是内存里的一块区域,把数据先存内存里,然后一次性写入,类似数据库的批量操作,这样效率比较高。

调用I\O操作的时候,实际上还是一个一个的读或者写,关键就在,CPU只有一个,不论是几个核心。CPU在系统调用时,会不会还要参与主要操作?参与多次就会花更多的时间。

java i o是什么流,Java中的IO流的基本知识

系统调用时,若不用缓冲,CPU会酌情考虑使用中断。此时CPU是主动地,每个周期中都要花去一部分去询问I\O设备是否读完数据,这段时间CPU不能做任何其他的事情(至少负责执行这段模块的核不能)。所以,调用一次读了一个字,通报一次,CPU腾出时间处理一次。

而设置缓冲,CPU通常会使用 DMA方式去执行 I\O操作。CPU将这个工作交给DMA控制器来做,自己腾出时间做其他的事,当DMA完成工作时,DMA会主动告诉CPU“操作完成”。这时,CPU接管后续工作。在此,CPU是被动的。DMA是专门做 I\O与内存数据交换的,不仅自身效率高,也节约了CPU时间,CPU在DMA开始和结束时做了一些设置罢了。

java i o是什么流,Java中的IO流的基本知识

所以,调用一次,不必通报CPU,等缓冲区满了,DMA会对C PU说“嘿,伙计!快过来看看,把他们都搬走吧”。

综上,设置缓冲,就建立了数据块,使得DMA执行更方便,CPU也有空闲,而不是呆呆地候着I\O数据读来。从微观角度来说,设置缓冲效率要高很多。尽管,不能从这个程序上看出来。几万字的读写\就能看到差距

1. Java I/O中字符流和字节流的区别

字节流与和字符流的使用非常相似,但实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。

下面以两个写文件的操作为主进行比较,但是在操作时字节流和字符流的操作完成之后都不关闭输出流。

1、使用字节流不关闭执行

importjava.io.File;

importjava.io.FileOutputStream;

importjava.io.OutputStream;

publicclassOutputStreamDemo05{

publicstaticvoidmain(String[]args)throwsException{//异常抛出,不处理

//第1步:使用File类找到一个文件

Filef=newFile("d:"+File.separator+"test.txt");//声明File对象

//第2步:通过子类实例化父类对象

OutputStreamout=null;

//准备好一个输出的对象

out=newFileOutputStream(f);

//通过对象多态性进行实例化

//第3步:进行写操作

Stringstr="HelloWorld!!!";

//准备一个字符串

byteb[]=str.getBytes();

//字符串转byte数组

out.write(b);

//将内容输出

//第4步:关闭输出流

//out.close();

//此时没有关闭

}

}

打开文件会发现,此时没有关闭字节流操作,但是文件中也依然存在了输出的内容,证明字节流是直接操作文件本身的。而下面继续使用字符流完成,再观察效果。

2、使用字符流不关闭执行

packageorg.lxh.demo12.chariodemo;

importjava.io.File;

importjava.io.FileWriter;

importjava.io.Writer;

publicclassWriterDemo03{

publicstaticvoidmain(String[]args)throwsException{//异常抛出,不处理

//第1步:使用File类找到一个文件

Filef=newFile("d:"+File.separator+"test.txt");//声明File对象

//第2步:通过子类实例化父类对象

Writerout=null;

//准备好一个输出的对象

out=newFileWriter(f);

//通过对象多态性进行实例化

//第3步:进行写操作

Stringstr="HelloWorld!!!";

//准备一个字符串

out.write(str);

//将内容输出

//第4步:关闭输出流

//out.close();

//此时没有关闭

}

}

程序运行后会发现文件中没有任何内容,这是因为字符流操作时使用了缓冲区,而在关闭字符流时会强制性地将缓冲区中的内容进行输出,但是如果程序没有关闭,则缓冲区中的内容是无法输出的,所以得出结论:字符流使用了缓冲区,而字节流没有使用缓冲区。

如果想在不关闭时也可以将字符流的内容全部输出,则可以使用Writer类中的flush()方法完成。

importjava.io.File;

importjava.io.FileWriter;

importjava.io.Writer;

publicclassWriterDemo04{

publicstaticvoidmain(String[]args)throwsException{//异常抛出不处理

//第1步:使用File类找到一个文件

Filef=newFile("d:"+File.separator+"test.txt");//声明File

对象

//第2步:通过子类实例化父类对象

Writerout=null;

//准备好一个输出的对象

out=newFileWriter(f);

//通过对象多态性进行实例化

//第3步:进行写操作

Stringstr="HelloWorld!!!";

//准备一个字符串

out.write(str);

//将内容输出

out.flush();

//强制性清空缓冲区中的内容

//第4步:关闭输出流

//out.close();

//此时没有关闭

}

}

此时,文件中已经存在了内容,更进一步证明内容是保存在缓冲区的。这一点在读者日后的开发中要特别引起注意。

Java中的I/O流的基本知识

1、与外部设备和其它计算机进行交流的输入输出操作,尤其是对磁盘的文件操作,是计算机程序重要的功能,任何计算机语言都必须对输入输出提供支持。Java也不例外,它的输入输出类库中包含了丰富的系统工具,这些类被放在java.io包中。在该类库中,除了定义文件输入输出操作外,还定义了许多用来和其他外设进行信息交换的类。

2、流(Stream)指的是在计算机的输入与输出之间运动的数据序列:输入流代表从外设流入计算机的数据序列;输出流代表从计算机流向外设的数据序列。

流式输入输出是一种很常见的输入输出方式,它最大的特点是数据的获取和发送均沿数据序列顺序进行:每一个数据都必须等待排在它前面的数据读入或输出之后才能被读写,每次读写操作处理的都是序列中剩余的未读写数据中的第一个,而不能够随意选择输入输出的位置。磁带机是实现流式输入输出的典型设备

3、InputStream和OutputStream是java.io包中的两个抽象类,他们分别是其他所有输入、输出流类的父类。其他所有输入流类都是继承了InputStream的基本输入功能并根据自身属性对这些功能加以扩充;同样,其他所有输出流类也都是继承了OutputStream类的基本输出功能并加以扩展的

4、File类是IO包中惟一代表磁盘文件本身的对象,File对象定义了一些与平台无关的方法来操纵文件

创建File类对象时需指明它所对应的文件或目录名。File类共提供了4个不同的构造方法,以不同的参数形式灵活地接收文件和目录名信息

5、FileReader和FileWrite类分别继承自Reader类和Writer类,继承关系如图6-2所示。FileReader类用于读取文件;FileWrite类用于将数据写入文件。在使用这两个类之前,必须调用其构造方法创建相应的对象,然后才能调用相应的read()或write()方法进行文件的读写操作

6、BufferedReader和BufferedWrite类分别继承自Reader类和Writer类,BufferedReader类用来从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。BufferedWrite类用于将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

7、LineNumberReader类是BufferedReader类的直接子类。该类允许对文本输入数据流加入行号。

此类定义了方法setLineNumber(int)和getLineNumber(),它们可分别用于设置和获取当前行号。默认情况下,行编号从0开始。该行号随数据读取在每个行结束符处递增,并且可以通过调用setLineNumber(int)更改行号。但要注意的是,setLineNumber(int)不会实际更改流中的当前位置;它只更改将由getLineNumber()返回的值

8、LineNumberReader类是BufferedReader类的直接子类。该类允许对文本输入数据流加入行号。

此类定义了方法setLineNumber(int)和getLineNumber(),它们可分别用于设置和获取当前行号。默认情况下,行编号从0开始。该行号随数据读取在每个行结束符处递增,并且可以通过调用setLineNumber(int)更改行号。但要注意的是,setLineNumber(int)不会实际更改流中的当前位置;它只更改将由getLineNumber()返回的值使用RandomAccessFile类随机读写文件时,在创建了一个RandomAccessFile对象之后,该文件即对文件描述句柄处于打开状态。此时,文件的指针处于文件开始位置。可以通过seek(long pos)方法设置文件指针的当前位置,以进行文件的快速定位,然后使用相应的read()和write()方法对文件进行读写操作。在对文件的读写操作完成后,调用close()方法关闭文件

9、FileInputStream和FileOutputStream类主要用来处理以“位为主”的输入输出操作。其中,FileInputStream类继承于InputStream类;FileOutputStream类继承于OutputStream类。

与RandomAccessFile类所不同的是,FileInputStream和FileOutputStream类中提供的文件处理方式是文件中数据流的顺序读写,而不是利用文件指针进行定位的随机读写

10、Java中的PipedInputStream和PipedOutputStream类提供了利用管道方式进行数据输入输出管理。管道流用来将一个程序或者线程的输出连接到另外一个程序或线程作为输入,使得相连线程能够通过PipedInputStream和PipedOutputStream类进行数据交换。

PipedInputStream和PipedOutputStream类也是InputStream和OutputStream类的直接子类。这两个类必须结合使用,其中,管道输入流作为管道的接收端、管道输出流作为管道的发送端,在程序设计中应注意数据的传输方向

顺序输入流SequenceInputStream是InputStream的直接子类,其功能是将多个输入流连接在一起,形成单一的输入数据流,没有对应的输出数据流存在。

顺序输入流SequenceInputStream由多个输入流构造而成,它从输入流的有序集合开始,并从第一个输入流开始读取,直到文件末尾,接着从第二个输入流读取,依次类推,直到到达顺序输入流包含的最后一个输入流的文件末尾为止

关于java i o是什么流到此分享完毕,希望能帮助到您。

java 索引是什么,java里索引是什么意思java核心技术第十版什么时候出 java核心技术 卷i 第10版 有没有中文版