在项目中要做图片上传功能,由于用了struts2 文件上传方便了很多,在actoin中增加如下方法就可以了:
private static final int BUFFER_SIZE = 16 * 1024;
private static void copy(File src, File dst) {
try {
InputStream in = null;
OutputStream ut = null;
try {
in = new BufferedInputStream(new FileInputStream(src), BUFFER_SIZE);
ut = new BufferedOutputStream(new FileOutputStream(dst), BUFFER_SIZE);
byte[] buffer = new byte[BUFFER_SIZE];
while (in.read(buffer) > 0) {
out.write(buffer);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != in) {
in.close();
}
if (null != out) {
out.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
文件上传很简单就实现了,可是突然我发现上传的文件都比原来大十几K.由于系统用户量很大,如果有一百万张,那占的空间可非常大了,查看jdk文档,其中在BufferedOutputStream文档中有write(byte[] b, int off, int len)和write(byte[] b).其中write(byte[ ] b,int off,int len)注释为:
将指定 byte 数组中从偏移量off开始的len个字节写入此缓冲的输出流。一般来说,此方法将给定数组的字节存入此流的缓冲区中,根据需要将该缓冲区刷新,并转到底层输出流。但是,如果请求的长度至少与此流的缓冲区大小相同,则此方法将刷新该缓冲区并将各个字节直接写入底层输出流。因此多余的BufferedOutputStream将不必复制数据。
果然我试了write(byte[ ] b,int off,int len)方法文件没有变大.由于习惯,在跟踪下去看看是究竟怎么回事.最后发现write(byte[ ]) 是调用了write(byte[] b,int off,int len),其中len数组的长度.问题就出在这里.在最后一次写入流时,len一般不会为读入字节的长度.除非文件大小刚好被BUFFER_SIZE整除.而通过 while ((len = in.read(buffer)) > 0){write(byte[] b,int off,int len) ,其中len为实际读入流的字节长度.所以这个方法不会增加文件大小,不会把多余的字节写进去.
也不知道为什么sun在java中增加了write(byte[] b) 方法,不过该方法不会影响文件.当我用MagickImage处理一把,文件就恢复原样了.
技术真要求精益求精,多思考,才能多领会.
分享到:
相关推荐
write(byte[] b, int off, int len)方法用于将指定字节数组b中从偏移量off开始的len个字节写入到文件输出流中。该方法可以指定写入的起始位置和长度,从而实现灵活的写入操作。 例如,在testMethod2()方法中,我们...
java集合类的文件,//Student s = new Student(); s = null;... void write(byte[] b,int off,int len) 写出某个范围的字节道数组b中 b 数据写出的数组 off 第一个写出字节在b中的偏移量
- `public void read(byte[] b, int off, int len) throws IOException`:从流中读取`len`个字节到数组`b`中,从索引`off`处开始存放。 - **其他常用方法**: - `public int available() throws IOException`:...
OutputStream的API包括write(int b)、write(byte[] b)和write(byte[] b, int off, int len)三个方法,用于将数据写入输出流。 字符流常常用于读取文本类型的数据或字符串流的操作等等。字符流的API有Reader和Writer...
- **`public void write(byte[] b, int off, int len)`**:向输出流写入字节数组b中从下标off开始的len个字节。 - **`public void flush()`**:刷新输出流,强制写出所有缓冲的输出字节。 ##### 3. 字符流 字符流...
* void write( byte [ ] b ,int off , int len): 将数组 b[ ]中从下标 off 开始的 len 个字节写入数据流 * void close(): 当结束对输出流的操作时应该将其关闭 * void flush(): 刷新此输出流并强制写出所有缓冲的...
* InputStream(典型实现:FileInputStream):int read()、int read(byte[] b)、int read(byte[] b, int off, int len) * Reader(典型实现:FileReader):int read()、int read(char[] c)、int read(char[] c, ...
输出数据流的基类是`OutputStream`,其主要方法包括`write(int i)`用于写入单个字节,`write(byte b[])`和`write(byte b[], int off, int len)`用于写入字节数组的部分或全部内容。同样,`close()`方法用于关闭流,`...
public void write(byte[] b, int off, int len) throws IOException { super.write(b, off, len); } } public class UTF8ZipInputStream extends ZipInputStream { public UTF8ZipInputStream(InputStream in)...
`write(int b)` 写入一个字节,`write(byte[] b)` 写入整个数组,而 `write(byte[] b, int off, int len)` 可以指定写入部分数组。 除了基本的字节流,Java 还提供了许多派生类,如 `FileInputStream` 和 `...
在这个过程中,`write(byte[] b, int off, int len)`方法用于写入字节数组的一部分,其中`off`是数组起始位置,`len`是需要写入的字节数。我们使用循环读取文件,每次读取1024字节,直到文件末尾。 3. **注意点:...
如read(),read(byte[] b)和read(byte[] b, int off, int len),而OutputStream类则提供了写入字节的方法,如write(int b),write(byte[] b)和write(byte[] b, int off, int len)。这些方法为字节级别的数据传输提供...
- `public void write(byte[] b, int off, int len) throws IOException`:写入字节数组的一部分。 ##### 2.2 示例代码 以下示例展示了如何使用`FileOutputStream`来输出数据: ```java import java.io.File; ...
InputStream中还有其他几个方法,如read(byte b[])、read(byte b[], int off, int len)、skip(long n)、close()、mark(int readlimit)、reset()、markSupported()等。这些方法都是用于读取文件的字节流, skip方法...
- `public int read(byte[] b, int off, int len) throws IOException`:从输入流中读取一系列字节到字节数组的一部分。 - **其他方法**: - `mark(int readlimit)`:在输入流中放置一个标记。 - `reset()`:将...
常见的方法包括read(),read(byte[] b),read(byte[] b, int off, int len)等。 3. 字符流的使用方法 - 字符输出流(Writer)用于将数据写入到输出设备中。常见的方法包括write(String), write(char[]), write(int...
- `write(byte[] b, int off, int len)`:写入部分字节数组。 - `flush()`:清空缓冲区,确保所有字节都被写出。 - `close()`:关闭流,释放资源。 **8.2 过滤流** 过滤流(FilterStream)是建立在基础流之上的流...
- `void write(byte[] b, int off, int len)` 2. **Reader** 和 **Writer** - `Reader` 和 `Writer` 是基于字符流的基础类,用于处理字符数据。 - `Reader` 类提供了三个基本的方法: - `int read()` - `int ...
在 FilterOutputStream 中,最重要的是 `write(int b)` 和 `write(byte[] b, int off, int len)` 方法。这两个方法分别用于写入单个字节和字节数组到输出流。它们的默认实现会将操作委托给被包装的输出流。开发者...