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

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

 

文件上传:

 

 

文件压缩:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值