
正文
Java高效缓冲区的代码 java高效缓冲区的代码怎么写
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
怎么理解java中BufferedInputStream的缓冲作用,就这张图中的一段代码来说,
BufferedInputStream主要是内存缓冲区,文件的读取是先将文件读取到内存中。如有程序部署是机器资源限制不可能分配很大内存,如果读取超大文件很容易造成内存溢出BufferedInputStream是将文件的一部分(大小有你指定)缓冲到内存,程序处理完后继续缓存下一个指定大小,直到全部读取。
相关问答
Q1: 菜鸟学习java,求大神解释下面的代码各段是什么意思,尽量详细,谢谢
Zip.java
import java.io.*;
import java.util.zip.*;
public class Zip {
static final int BUFFER = 2048; // 定义缓冲区大小
public static void main (Stringargv[]) {
try {
BufferedInputStream origin= null; // 创建带有缓冲区的inputstrream
FileOutputStream dest = new
FileOutputStream("c:\\zip\\myfigs.zip"); // 创建文件输出流,并打开zip文件 CheckedOutputStream checksum = new
CheckedOutputStream(dest,new Adler32()); // 创建过滤流,并验证数据的完整性
ZipOutputStream out = new
ZipOutputStream(new
BufferedOutputStream(checksum)); // 创建压缩文件输出流,并传入参数
//out.setMethod(ZipOutputStream.DEFLATED);
byte data[] = newbyte[BUFFER]; // 创建字节数组
// get a list of files fromcurrent directory
File f = newFile("."); // 创建File变量读取根目录用于文件的读写
String files[] = f.list(); // 读取f文件夹下所有的文件名
for (int i=0; i files.length; i++) { // 根据文件名的数量进行循环
System.out.println("Adding: "+files[i]); // 打印出添加的文件名到控制台
FileInputStream fi = new
FileInputStream(files[i]); // 创建文件读取流,读取当前循环到的文件
origin = new
BufferedInputStream(fi, BUFFER); // 把文件流放入带有缓冲区的inputstream,并指定缓冲区大小
ZipEntry entry = newZipEntry(files[i]); // 创建zip压缩入口实例化,放入当前循环到的文件
out.putNextEntry(entry); // 输出流中放入压缩的文件
int count;
while((count =origin.read(data, 0,
BUFFER)) != -1) {// 当count值等于缓冲区读取的数据字节大小,且不等于-1
out.write(data, 0,count); // 输出流写入count字节大小的数据
}
origin.close();// 关闭带有缓冲区的inputstream
}
out.close(); // 关闭输出流
System.out.println("checksum:
"+checksum.getChecksum().getValue()); // 打印验证压缩文件的值到控制台
} catch(Exception e) { // 捕捉异常
e.printStackTrace(); // 打印异常信息
}
}
}
Q2: 关于java的io读写,缓冲区是如何提高读写效率的???
给你一个例子自己看看吧,加深理解
我们知道Java中一般的输入输出流类都是用单字节的读取方法来进行I/O操作的,也就是说每次只读写一个字节的数据,这种方法显然繁琐低效。如果从设备读取10M的文件,每次读取一个字节,完成操作将需要做10M/次I/O操作,I/O操作又是一件相当耗时的事情,无疑在很大程度上降低了系统的性能。
Java中专门提供提高I/O效率的缓冲类,这好比在数据读写时提供一个临时缓冲区,每次读取一个缓冲区大小的数据,将这数据库一次性写入目标设备。下图中分别为两种读取方式。
举个简单例子,在A地有10000本书需要搬到B地,如果一次搬1本,需要10000次。如果每次取1000本放到一个货车上,运到B地,需要10次完成。货车相当于是缓存区。同样道理,开设一个数据缓存区每次读取一数据块对于提高读取效率有显著提升。下面用一个具体代码示例来表示二者的性能差别。
Java代码
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class TestBuffer {
public static void main(String args[]) throws IOException {
String from = "f:/1.MP3";
System.out.println(from);
long startTime1 = System.currentTimeMillis();
TestBuffer.readWriteWithBuffer(from, "f:/2.MP3");
long endTime1 = System.currentTimeMillis();
System.out.println("使用缓冲区读取耗时:" + (endTime1 - startTime1) +"ms");
long startTime = System.currentTimeMillis();
TestBuffer.readWrite(from,"f:/3.MP3");
long endTime = System.currentTimeMillis();
System.out.println("直接读取耗时:" + (endTime - startTime) +"ms");
}
public static void readWrite(String from, String to) throws IOException {
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(from);
out = new FileOutputStream(to);
while (true) {
int data = in.read();
if (data == -1) {
break;
}
out.write(data);
}
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
/***************************************************************************
* 使用缓存区读写文件
* @param from
* @param to
* @throws IOException
*/
public static void readWriteWithBuffer(String from, String to)
throws IOException {
InputStream inBuffer = null;
OutputStream outBuffer = null;
try {
inBuffer = new BufferedInputStream(new FileInputStream(from));
outBuffer = new BufferedOutputStream(new FileOutputStream(to));
while (true) {
int data = inBuffer.read();
if (data == -1) {
break;
}
outBuffer.write(data);
}
} finally {
if (inBuffer != null) {
inBuffer.close();
}
if (outBuffer != null) {
outBuffer.close();
}
}
}
}
运行例子时会根据mp3文件的大小决定运行时间的长短,尽量使用小一点的mp3文件,运行时需耐心等待一段时间
Q3: java中如何使用缓冲区对文件进行读写操作?
首先Java高效缓冲区的代码,了解下什么是缓冲区:
电脑内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
栈——就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
堆——就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete.如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
自由存储区——就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
全局/静态存储区——全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,Java高效缓冲区的代码你要通过非正当手段也可以修改)
电脑缓冲区就是预留下来的做为急用的那一部分,为暂时置放输出或输入资料的内存。
如何对缓冲区进行操作:
当我们读写文本文件的时候,采用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 = "亲爱的小南瓜Java高效缓冲区的代码!";
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
}
}
}
Q4: 一个关于java 字节缓冲输入输出流的问题
data就是一个字节数组,用来临时存放读取的字节,也可以叫做缓冲区,
data[1]是代表只有一个字节大小的缓冲区,只能存放一个字节,即,每次一个一个字节的读取
关于Java高效缓冲区的代码和java高效缓冲区的代码怎么写的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。






