无论是在文件上传还是下载中,都会用到两个东西,一个是InputStream(输入流),一个是OutputStream,这两货都隶属于I/O流里的东西。
关于流的知识,这里科普一下:
简要说一下,我自己也顺便回忆一下。
I/O流分按照数据传输单位来分呢,分为了字符流和字节流(不同的字符占字节不一致,记住一个汉字字符=俩字节,一个英文字符等于一个字节)。
不论是什么传输单位呢,都有俩,一个是输出流,一个是输入流。
先讲讲字符流中的Reader和Writer:
Reader,因为他们的数据传输单位是字符,所以呢,这个谁就把具体Reader哪些给我们分了一下类,比如说,我们读的是一个字符串,那就用StringReader,如果我们还要弄个碗(缓冲池)来接Reader到的这些字符呢,就有BufferReader;关于PipedReader,我也没用过,听说是做线程之间的管道通信的,和PipedWriter配合起用,但是要注意的PipedReader操作的是字符,PipedWriter操作的是字节,其他的要遇到具体实现才晓得。
Reader还要注意一个问题,那就是编码问题,因为它读取的数据单位是字符,那么必然有字符编码问题,我之前就遇到过,
代码贴出来给大家看看嘛:
OutputStreamWriter oStreamWriter = new OutputStreamWriter(out,"UTF-8");
BufferedReader br = new BufferedReader(new FileReader(file));
int line;
while((line = br.read()) != -1) {
oStreamWriter.write(line);
}
br.close();
oStreamWriter.close();
看到了涩,我弄了个FileReader读某个文件,但是喃,流写出去的文件始终有中文乱码,起初上网查了下,有人说是Reader读的是一个字符字符的读,而中文占两个字符,读的时候就会乱码,后面改成一行一行读(有个readLin()方法),哈是不得行。后面我想,是不是我往外读的时候流的编码不对,又把Out流编码设置成了UTF-8,依旧不行。最后还是用的读bit的方法解决这个问题,字符有编码问题,bit流总不会有吧
FileOutputStream fos = null;
FileInputStream in = null;
try {
fos = new FileOutputStream(tempDir.getPath() + File.separator + fileName);
in = new FileInputStream(file);
byte[] buffer = new byte[1024];
while (in.read(buffer) != -1) {
fos.write(buffer);
}
fos.flush();
} catch (Exception e) {
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
然后就这样解决了问题,其实有想过字符流可以直接弄成bit流吗,毕竟字节流都可以。但是好像不支持reader比特流,有待校验。
文件上传:
文件压缩: