万恶的javaeye,编辑器能不能优化下,每次修改样式都变形了。
FileInputStream
属于数据源
BufferedInputStream
属于FileInputStream的一个装饰
BufferedInputStream 有个内部缓冲区当read时会先把缓冲区填满,然后下次读取是直接从缓冲区读取。当读取的位置大于缓冲区时会再一次加载缓冲区。
read()和read(byte[] buf,
int off, int len)处理方式一样,区别在于后者一次返回多个数据,但是同样都是先放入缓冲区,然后再读取。
private void fill() throws IOException {
byte abyte0[] = getBufIfOpen();
if (markpos < 0)
pos = 0;
else if (pos >= abyte0.length)
if (markpos > 0) {
int i = pos - markpos;
System.arraycopy(abyte0, markpos, abyte0, 0, i);
pos = i;
markpos = 0;
} else if (abyte0.length >= marklimit) {
markpos = -1;
pos = 0;
} else {
int j = pos * 2;
if (j > marklimit)
j = marklimit;
byte abyte1[] = new byte[j];
System.arraycopy(abyte0, 0, abyte1, 0, pos);
abyte0 = abyte1;
}
count = pos;
int k = getInIfOpen().read(abyte0, pos, abyte0.length - pos);
if (k > 0)
count = k + pos;
}
public synchronized int read() throws IOException {
if (pos >= count) {
fill();
if (pos >= count)
return -1;
}
return getBufIfOpen()[pos++] & 255;
}
至于性能问题,我们都知道文件的物理读取性能肯定要大于内存读取,FileInputStream.read()相当于一次物理读取,而BufferedInputStream .read()大部分相当于一次内存读取。
同理FileOutputStream和BufferedOutputStream原理也是一样,也是有个缓冲区,每次write相当于写入缓冲区,当缓冲区慢了后在物理写入文件。
private void flushBuffer()
throws IOException
{
if(count > 0)
{
out.write(buf, 0, count);
count = 0;
}
}
public synchronized void write(int i)
throws IOException
{
if(count >= buf.length)
flushBuffer();
buf[count++] = (byte)i;
}
测试
public static void bufferTest() throws IOException{
BufferedInputStream is = new BufferedInputStream(new FileInputStream("d:/A.exe"));
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("d:/B.exe"));
byte[] buffer = new byte[100];
System.out.println("buffer
start "+new Date());
int size = 0 ;
while((size=is.read(buffer, 0, buffer.length))!=-1){
out.write(buffer);
}
is.close();
out.close();
System.out.println("buffer end
"+new Date());
}
public static void ioTest()throws IOException{
FileInputStream is = new FileInputStream("d:/A.exe");
FileOutputStream out = new FileOutputStream("d:/C.exe");
byte[] buffer = new byte[100];
System.out.println("io start
"+new Date());
int size = 0 ;
while((size=is.read(buffer, 0, buffer.length))!=-1){
out.write(buffer);
}
is.close();
out.close();
System.out.println("io end
"+new Date());
}
文件大概有1G,用buffer大概用了20秒,用原始方式等了1分钟还没完,直接强制终止。
分享到:
相关推荐
以Java IO中的FileInputStream和BufferedInputStream为例,假设我们有一个FileInputStream实例,如果我们想要添加缓冲功能,可以创建一个BufferedInputStream,将FileInputStream作为参数传递给BufferedInputStream...
在上面的代码中,我们首先使用 FileInputStream 和 BufferedInputStream 来读取文件,然后使用 InputStreamReader 和 BufferedReader 来读取文件的内容。通过判断文件的前三个字节,我们可以自动判断文件的编码格式...
例如,需要一个具有缓冲的文件输入流,则应当组合使用 FileInputStream 和 BufferedInputStream。Java 的 IO 体系分 Input/Output 和 Reader/Writer 两类,区别在于 Reader/Writer 在读写文本时能自动转换内码。 ...
例如,需要一个具有缓冲的文件输入流,则应当组合使用 FileInputStream 和BufferedInputStream。 Java 的 IO 体系分 Input/Output 和 Reader/Writer 两类,区别在于 Reader/Writer 在读写文本时能自动转换内码。...
Java的FileInputStream和BufferedInputStream可以帮助我们读取文件,而Socket的getOutputStream()方法返回一个OutputStream,用于将数据发送到客户端。例如: ```java File file = new File("file_to_send.txt"); ...
在Java中,我们可以使用FileInputStream和BufferedInputStream来读取大文件,同时更新进度条的值。例如: ```java FileInputStream fis = new FileInputStream("large_file.txt"); BufferedInputStream bis = new ...
Java的FileInputStream和BufferedInputStream类可用于读取文件内容。 6. **线程管理**:为了实现流畅的播放体验,播放器通常会使用多个线程来处理不同的任务,如解码、渲染等。理解Java的多线程机制对实现高性能...
3. **使用FileInputStream和BufferedInputStream** - 对于字节流,我们可以使用`FileInputStream`来读取二进制文件,如图片或音频。同样,`BufferedInputStream`可以提高效率: ```java FileInputStream fis = ...
- 音乐资源:系统可能需要读取和播放音乐文件,这涉及IO流操作,如FileInputStream和BufferedInputStream。 - 数据持久化:如果系统支持歌曲列表的保存和加载,那么可能使用了文件或XML进行数据持久化。 6. **...
FileInputStream和BufferedInputStream可以用来读取文件,而音频解码可能需要用到第三方库,如JLayer或Java Sound API。 6. **对象序列化**:为了在网络间传输对象,如用户信息或者聊天消息,Java的对象序列化机制...
首先,我们需要打开并加载qqwry.dat文件到内存中,这可以通过Java的FileInputStream和BufferedInputStream类实现。然后,设计一个查找算法,例如二分查找,因为qqwry.dat中的IP段通常是按顺序排列的。在找到匹配的IP...
这可能涉及到I/O操作,如使用FileInputStream和BufferedInputStream类来高效地读取大文件。同时,还需要考虑如何有效地管理内存,避免资源浪费。 6. **地图坐标设计**: 地图坐标系统是游戏世界的基础,通常使用二...
在Java中,FileInputStream和BufferedInputStream类常用于读取文件,而HTTP或FTP协议可能用于与服务器进行通信。 2. **文件处理规则**:程序会根据预设的规则对上传的文件进行处理。这可能包括文件的重命名、转换、...
7. **文件I/O操作**:程序需要读取视频文件,这就涉及到了Java的文件I/O操作,如使用FileInputStream和BufferedInputStream进行高效读取。 8. **音频和视频同步**:在播放过程中,确保音频和视频同步是一项挑战。...
Java的FileInputStream和BufferedInputStream可以用来读取文件内容,而FileChannel的transferTo()方法可以用于高效地传输大文件。比较文件内容时,可以使用Arrays.equals()方法对比字节数组,或者利用MD5或SHA哈希...
Java提供了FileInputStream和BufferedInputStream等类来读取文件内容,它们能够高效地处理大文件,如MP3音乐。 3. **Java音频API**:Java Sound API是Java标准库中的一个部分,用于处理音频数据。它包括了Audio...
读取MP3文件需要使用Java的I/O流,如FileInputStream和BufferedInputStream,来高效地读取和处理文件内容。 8. **用户界面设计**: 使用JavaFX或Swing库可以创建包含播放/暂停按钮、音量控制器、播放列表等元素的...
过滤器流(FilterStream)是Java I/O中的一个重要概念,它们通常用于扩展或修改已有流的行为,如BufferedInputStream和BufferedOutputStream分别增加了缓冲功能,而PrintStream则提供了格式化的输出。 6.7 对象序列...
通常可以使用FileInputStream和BufferedInputStream进行读取。 2. HTTP请求:Android通常使用HttpURLConnection或者第三方库如Retrofit、Volley等发送HTTP请求。这个项目可能使用了POST请求,将图片数据作为二进制流...