up.yfei 发表于 2013-5-26 14:23
我有点迷惑的是
fos = new FileOutputStream("e:\\1.jpg");//输出目标
fis = n ...
你那个数组其实就起到了一个简单的缓冲作用,先将数据读出来存到数组中,然后在将数组中的数组写入,
不过缓冲区的数组的大小你一定要定义好。 不知道你看源码没有 看里面的缓冲区 看他的定义 他的写读的方法也是直接将InputStream穿进去 然后里面有确定数组长度的,
public synchronized int read() throws IOException {
if (pos >= count) {
fill();
if (pos >= count)
return -1;
}
return getBufIfOpen()[pos++] & 0xff;
}这个是他的读的方法 可是你看fill();方法
// 在这个方法中来确定缓冲区的长度 我看的也不是很懂 只能看懂个大概 你在看前面的几个方法 有好几个都是贯穿着,他其中获得数组
private void fill() throws IOException {
byte[] buffer = getBufIfOpen(); //这里是从上文的getBufIfOpen(); 这个方法中获取数组 下面的都是英文了 你慢慢读 想要深入了解 就去读源码 最好
if (markpos < 0)
pos = 0; /* no mark: throw away the buffer */
else if (pos >= buffer.length) /* no room left in buffer */
if (markpos > 0) { /* can throw away early part of the buffer */
int sz = pos - markpos;
System.arraycopy(buffer, markpos, buffer, 0, sz);
pos = sz;
markpos = 0;
} else if (buffer.length >= marklimit) {
markpos = -1; /* buffer got too big, invalidate mark */
pos = 0; /* drop buffer contents */
} else { /* grow buffer */
int nsz = pos * 2;
if (nsz > marklimit)
nsz = marklimit;
byte nbuf[] = new byte[nsz];
System.arraycopy(buffer, 0, nbuf, 0, pos);
if (!bufUpdater.compareAndSet(this, buffer, nbuf)) {
// Can't replace buf if there was an async close.
// Note: This would need to be changed if fill()
// is ever made accessible to multiple threads.
// But for now, the only way CAS can fail is via close.
// assert buf == null;
throw new IOException("Stream closed");
}
buffer = nbuf;
}
count = pos;
int n = getInIfOpen().read(buffer, pos, buffer.length - pos);
if (n > 0)
count = n + pos;
} |