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内存######貌似 我也看成读取超级大文件了,晕。。
原来是读取文本超级大
######嘿嘿。。。