package www.java.com.test; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; /** * 测试类 * @author fuce * 2013-9-25 */ public class Test{ public static void main(String[] str) throws UnsupportedEncodingException{ try { tets1(); } catch (Exception e) { e.printStackTrace(); } } public static void test2() throws Exception{ String file = "eula.1028.txt"; String charset = "UTF-8"; // 写字符换转成字节流 // 读取字节转换成字符 FileInputStream inputStream = new FileInputStream(file); InputStreamReader reader = new InputStreamReader(inputStream, charset); StringBuffer buffer = new StringBuffer(); char[] buf = new char[1024*768]; int count = 0; try { while ((count = reader.read(buf)) != -1) { buffer.append(buf, 0, count); } } finally { reader.close(); } System.out.println(buffer.toString()); } public static void tets1(){ try { InputStream inputStream=new FileInputStream(new File("eula.1028.txt")); byte[] bs=new byte[1024]; int tem; try { while((tem=inputStream.read(bs))!=-1){ String string=new String(bs,0, tem,"UTF-16"); System.out.println(string); } } catch (IOException e) { e.printStackTrace(); } try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); System.out.println("读取失败"); } } }
条件
1 文本:90M
2 运行内存myeclipse的自带内存没改动过应该是50M?
第一种
执行的test1
该方法读取文本不容易内存溢出,
该方法 如果读取UNicode格式的文本,乱码 求解决
这个方法改动
byte[] bs=new byte[1024];
大小可以最开始改动的1024不是乱码,后面的读取任然乱码
第二种test2
这种直接报内存崩溃,
在不分隔txt文本的情况下,可不可以读取不内存崩溃
求大神
求大神######来人啊######建议直接用 Commons-IO 这个库来读写文件。一行代码搞定,又不担心出错
######nio######MappedByteBuffer######
你这是闹哪样?
你知不知道UTF-8,UTF-16(BE,LE先不谈)都是变长码?
new byte[1024],一次读1024个字节,
你怎么保证最后读的那个字节刚好就是一个码元的结束?
玩编码之前,补基础知识先。
http://zh.wikipedia.org/wiki/UTF-16
http://zh.wikipedia.org/wiki/UTF-8
######引用楼上的,这类乱码问题必涉及Charset类,你可以自行编写CharsetDecoder相关代码,但相当的麻烦,所以还是规规矩矩地用Reader接口吧。
内存溢出是代码问题:看看test1方法System.out.println(string);把读取到的字符串立即打印到控制台,此后这字符串占用资源会被释放的。而test2方法buffer.append(buf, 0, count);是不断连接字符串,相当于正在把整个90M文件塞进内存,还能不爆吗?
最后绝大多数场合请用StringBuilder替换StringBuffer
######谢谢######你的test2把InputStreamReader用BufferedReader再包装一下,然后直接readline()######怎么个包装法######你这是windows环境吧,默认字符编码是GBK或者gb20xx , java用的是unicode , 你实例化string 要指明字符集, new String(,,"utf-8") 。
另外, 90m真不大。在程序启动时设置JVM内存参数即可,设置Xmx大于90M
######现在规定内存就这么大!不能设置jvm内存######貌似 我也看成读取超级大文件了,晕。。
原来是读取文本超级大
######嘿嘿。。。版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。