A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗文杰 中级黑马   /  2012-6-11 09:45  /  1632 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

第一个问题:毕老师讲了一个合并txt的例子,txt文件一般有两种编码ANSI(默认为GB2312)和 Unicode ,如果 我要合并100个以上的txt文件,里面若干文件是ANSI编码,若干文件是Unicode编码,有没有什么办法使合并后的文件不产生乱码,或者采用续写的形式也可以。(不采用手动去一个个看txt文件是什么格式的编码,然后把不同的编码改成同一编码= =!)

第二个问题:被Buffered修饰的流对象如:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter 一般都是用来提高效率的。但是这个效率提高有多少?在大文件的情况下会不会反而会降低效率?
我利用TCP上传文件的例子试了一下,我上传的是4G以上的文件,部分代码如下:
第一种:用BufferInputStream 和 BufferedOutputStream:

Socket s = new Socket("192.168.1.100", 10005);
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\WIN7.iso"));
BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream());
                        long time1 = System.currentTimeMillis();
                        byte[] buff = new byte[1024*1024*32];
                        int by = 0;                       
                        while((by = bis.read(buff)) != -1){                               
                                bos.write(buff, 0, by);
                                bos.flush();
                        }
                        s.shutdownOutput();
                        long time2 = System.currentTimeMillis();

                        System.out.println(time2 - time1);
打印出时间的数值大概保持在150000左右。

第二种方法用FileInputStream和OutputSteam的方法:

Socket s = new Socket("192.168.1.100", 10005);
FileInputStream fis = new FileInputStream("D:\\WIN7.iso");
OutputStream out = s.getOutputStream();
                        long time1 = System.currentTimeMillis();
                        byte[] buff = new byte[1024*1024*32];
                        int by = 0;                       
                        while((by = fis.read(buff)) != -1){                               
                                out.write(buff, 0, by);
                                out.flush();
                        }
                        s.shutdownOutput();
                        long time2 = System.currentTimeMillis();

                        System.out.println(time2 - time1);

打印出的时间的数值大概在120000左右。

上面的例子感觉Buffered效率还没有 没加修饰的高,求解具体原因……

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 恭喜,祝早日进入黑马~~

查看全部评分

6 个回复

倒序浏览
第一个可以用InputStreamReader和OutputStreamWriter指定相同的编码就行了!第二个,个人试过,用Reader和Writer操作纯文本的时候速度调高十倍以上,但是用BufferInputStream和BufferedOutputStream的话效率还不如自己定义的一个缓冲字节数组。我只是简单测试了一下,不能保证是对的!这个还希望自己多加验证。
回复 使用道具 举报
第一问题;
不同文件因为有了不同的编码形式,而只采取同一种解码形式进行解码并合并到一起,肯定是会产生乱码;
我的思路是。先把所有的文件用Charset类中的decode或encode方法转换成Unicode码的编成形式;再进行合并是不是可以呢?
第二个问题参见楼上! 呵呵;
回复 使用道具 举报
黄奕豪 发表于 2012-6-11 11:40
第一个可以用InputStreamReader和OutputStreamWriter指定相同的编码就行了!第二个,个人试过,用Reader和W ...

首先谢谢回答,嘿嘿。
第一个问题如果指定相同编码的话会有乱码,从ANSI转到Unicode会出乱码,或者从Unicode转到ANSI都会出现乱码,即使编码再解码还是会有乱码,实在想不到有什么方法。
第二个问题,我也就纳闷为啥自己定义字节数组会更快,特别操作字节流的大文件的时候特别明显,纳闷中……
回复 使用道具 举报
邓杰 发表于 2012-6-11 14:38
第一问题;
不同文件因为有了不同的编码形式,而只采取同一种解码形式进行解码并合并到一起,肯定是会产生 ...

第一个问题我的想法是先把所有的文件转成一个编码 ANSI或者Unicode,然后再合并,但是如何获得那么多TXT文件中的各个文件的编码格式,以及转换完不出乱码,这个是我的想法要解决的重点, = =~~可是俺没想到咋解决……为啥记事本看ANSI编码和Unicode编码都是汉字,我转完了就是乱码…………:'(
回复 使用道具 举报
黄奕豪 发表于 2012-6-11 11:40
第一个可以用InputStreamReader和OutputStreamWriter指定相同的编码就行了!第二个,个人试过,用Reader和W ...

第一个问题我的想法是先把所有的文件转成一个编码 ANSI或者Unicode,然后再合并,但是如何获得那么多TXT文件中的各个文件的编码格式,以及转换完不出乱码,这个是我的想法要解决的重点, = =~~可是俺没想到咋解决……为啥记事本看ANSI编码和Unicode编码都是汉字,我转完了就是乱码…………:'(
回复 使用道具 举报
{:soso_e103:}本来以为JDK里面能找到get编码方法的,结果File没有,专门操纵数据的DataInputStream也没有,不过在DataInputStream找到一个readUTF方法,你可以试下~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马