java中缓冲区是什么(java中的字符串缓冲区是什么意思)
大家好,今天来为大家分享java中缓冲区是什么的一些知识点,和java中的字符串缓冲区是什么意思的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
java中的字符串缓冲区是什么意思
如果你说的缓冲区是在IO操作中的话,指的就是先将数据写在内存中,等写入一定数量后再往硬盘上写。
如果你说的不是IO操作中的缓冲区的话,那可能是指StringBuilder这个类的作用了。
StringBuilder是一个类似于
String
的字符串缓冲区。可将字符串缓冲区安全地用于多个线程。所以比直接对String操作更有效率也更稳定。
java中如何使用缓冲区对文件进行读写操作
首先,了解下什么是缓冲区:
电脑内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
栈——就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
堆——就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete.如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
自由存储区——就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
全局/静态存储区——全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)
电脑缓冲区就是预留下来的做为急用的那一部分,为暂时置放输出或输入资料的内存。
如何对缓冲区进行操作:
当我们读写文本文件的时候,采用Reader是非常方便的,比如FileReader,InputStreamReader和BufferedReader。其中最重要的类是InputStreamReader,它是字节转换为字符的桥梁。你可以在构造器重指定编码的方式,如果不指定的话将采用底层操作系统的默认编码方式,例如GBK等。使用FileReader读取文件:
FileReader fr= new FileReader("ming.txt");
int ch= 0;
while((ch= fr.read())!=-1)
{
System.out.print((char)ch);
}
其中read()方法返回的是读取得下个字符。当然你也可以使用read(char[] ch,int off,int length)这和处理二进制文件的时候类似。
事实上在FileReader中的方法都是从InputStreamReader中继承过来的。read()方法是比较好费时间的,如果为了提高效率我们可以使用BufferedReader对Reader进行包装,这样可以提高读取得速度,我们可以一行一行的读取文本,使用readLine()方法。
BufferedReader br= new BufferedReader(new InputStreamReader(new FileInputStream("ming.txt")));
String data= null;
while((data= br.readLine())!=null)
{
System.out.println(data);
}
了解了FileReader操作使用FileWriter写文件就简单了,这里不赘述。
Eg.我的综合实例:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class testFile{
/**
*@param args
*/
public static void main(String[] args){
// TODO Auto-generated method stub
// file(内存)----输入流---->【程序】----输出流---->file(内存)
File file= new File("d:/temp","addfile.txt");
try{
file.createNewFile();//创建文件
} catch(IOException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
//向文件写入内容(输出流)
String str="亲爱的小南瓜!";
byte bt[]= new byte[1024];
bt= str.getBytes();
try{
FileOutputStream in= new FileOutputStream(file);
try{
in.write(bt, 0, bt.length);
in.close();
// boolean success=true;
// System.out.println("写入文件成功");
} catch(IOException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch(FileNotFoundException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
try{
//读取文件内容(输入流)
FileInputStream out= new FileInputStream(file);
InputStreamReader isr= new InputStreamReader(out);
int ch= 0;
while((ch= isr.read())!=-1){
System.out.print((char) ch);
}
} catch(Exception e){
// TODO: handle exception
}
}
}
JAVA中输入输出流和缓冲式输入输出流出有什么区别
简单地说,缓冲式输入输出流利用了缓冲区,而不是像一般的输入输出流那样,每次读取或写入数据都会引起对设备(如存放在磁盘上的文件)的访问。
具体说来,
缓冲式输入流BufferedInputStream(InputStream
in),新建一个默认大小的缓冲流。从一个流中读取字符,而不会每次都引起对设备的访问。当缓冲区空的时候,一个新的数据块将会被读入缓冲区。
缓冲式输出流BufferedOutputStream(OutputStream
out),新建一个默认缓冲大小的缓冲流。缓冲输出流收集写入的字符以避免每次都引起对设备的访问。当缓存区满或者被刷新里,数据被写入设备。
Java中IO缓冲区的原理是什么
如果是边读边写,就会很慢,也伤硬盘。缓冲区就是内存里的一块区域,把数据先存内存里,然后一次性写入,类似数据库的批量操作,这样效率比较高。
调用I\O操作的时候,实际上还是一个一个的读或者写,关键就在,CPU只有一个,不论是几个核心。CPU在系统调用时,会不会还要参与主要操作?参与多次就会花更多的时间。
系统调用时,若不用缓冲,CPU会酌情考虑使用中断。此时CPU是主动地,每个周期中都要花去一部分去询问I\O设备是否读完数据,这段时间CPU不能做任何其他的事情(至少负责执行这段模块的核不能)。所以,调用一次读了一个字,通报一次,CPU腾出时间处理一次。
而设置缓冲,CPU通常会使用 DMA方式去执行 I\O操作。CPU将这个工作交给DMA控制器来做,自己腾出时间做其他的事,当DMA完成工作时,DMA会主动告诉CPU“操作完成”。这时,CPU接管后续工作。在此,CPU是被动的。DMA是专门做 I\O与内存数据交换的,不仅自身效率高,也节约了CPU时间,CPU在DMA开始和结束时做了一些设置罢了。
所以,调用一次,不必通报CPU,等缓冲区满了,DMA会对C PU说“嘿,伙计!快过来看看,把他们都搬走吧”。
综上,设置缓冲,就建立了数据块,使得DMA执行更方便,CPU也有空闲,而不是呆呆地候着I\O数据读来。从微观角度来说,设置缓冲效率要高很多。尽管,不能从这个程序上看出来。几万字的读写\就能看到差距
如果你还想了解更多这方面的信息,记得收藏关注本站。