关于文件上传下载的那些事儿

无论是在文件上传还是下载中,都会用到两个东西,一个是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比特流,有待校验。

 

文件上传:

 

 

文件压缩:

 

发布了3 篇原创文章 · 获赞 2 · 访问量 105
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览