开发者社区> 问答> 正文

java读取文本超级大问题:报错

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文本的情况下,可不可以读取不内存崩溃

求大神

展开
收起
kun坤 2020-06-07 17:10:01 528 0
1 条回答
写回答
取消 提交回答
  • 求大神######来人啊######建议直接用 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()######怎么个包装法######

    引用来自“沈学良”的答案

    你的test2把InputStreamReader用BufferedReader再包装一下,然后直接readline()
    BufferedReader in
       = new BufferedReader(new InputStreamReader(new FileInputStream("foo.in")));
    或者:
    BufferedReader in
       = new BufferedReader(new FileReader("foo.in"));
    然后:
    String line = in.readLine();
    ######回复 @协议 : 大锅,你的StringBuffer就别用啦,直接打印不就行啦...######我明天去公司试试你的方法######不行不行 一样内存爆掉######

    你这是windows环境吧,默认字符编码是GBK或者gb20xx ,  java用的是unicode , 你实例化string 要指明字符集, new String(,,"utf-8") 。

    另外, 90m真不大。在程序启动时设置JVM内存参数即可,设置Xmx大于90M

    ######现在规定内存就这么大!不能设置jvm内存######

    貌似 我也看成读取超级大文件了,晕。。

    原来是读取文本超级大

    ######嘿嘿。。。
    2020-06-07 17:10:07
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载