BufferedReader bf = new BufferedReader(reader);
定义一个缓冲数组。
然后开始处理。
定义一个缓冲数组。
然后开始处理。
解决方案 »
- Generated servlet error:Invalid character constant
- JAVA的一个让人很无语的问题
- 简单的Socket和ServerSocket的问题
- 一个例子,有点不太明白为什么错了
- JBoss-4.0.5.GA启动出错(帮顶也有分)
- 数据库连接问题:开始tomcat连接数据orcal数据库正常,但是安装SQL Server2000后,tomcat就连不上数据库了。
- 我用JAVA做APPLICATION的时候,连接数据库,我怎么样才能把表中的信息现实在SWING中的TEXTAREA中啊???解决马上给分!!!!
- 我的代码不能运行~?!!!(附代码)
- YuLimin(阿敏当兵) 100一次
- 有个小问题!
- Java基础问题,望大神不吝赐教
- 对java.net.CookieStore持久化,无效
程序是从zh.dat文本文件中一行一行读文本,如果有重复行做记录输出重复次数……
待读文件zh.dat有近400M(约2000万行),运行程序报: “heap overflow”之后中断,当zh.dat大小在50M以下时,程序能正常运行。
我知道是zh.dat文件400M太大所致,但我改了几次程序都无效,哪位高手能邦我一下?
让程序能将400M的大文本一次处理完吗?
import java.io.*;
import java.util.*;
import static java.util.Map.Entry;
public class Sdup{
public static void main(String[] args) {
try{
File file = new File("D:/search/zh.dat");
FileWriter fw = new FileWriter("d:/search/dup.dat",true);
PrintWriter pw = new PrintWriter(fw);
BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream(file)));
String str = null;
Map<String,Integer> map = new HashMap<String,Integer>();
while((str = reader.readLine())!=null){
map.put(str, map.get(str)==null?1:map.get(str)+1);
}
for(Entry<String, Integer> entry:map.entrySet()){
if(entry.getValue() > 200){
System.out.println(entry.getKey()+" Repeat Num:"+entry.getValue());
pw.println(entry.getKey()+" Repeat Num:"+entry.getValue());
pw.flush();//Firsttime forgeted to use flush() dupzh.dat allways empty
}
else{
System.out.println("Not Found ");
}
}
pw.println("********Dupzh maked on "+new Date()+"************");
pw.flush();
}catch(IOException e){e.printStackTrace();}
}
}
这样肯定不行换个思路吧,先读取一行,然后一行一行遍历,重复就标记行数,比如用list
接着换第二行.....
以此类推这样可以记录下重复行的行数然后你就可以遍历一遍文件,去掉重复的,写入新文件
帮LZ查了些资料http://sharong.iteye.com/blog/910989,File file = new File(filepath);
BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file));
BufferedReader reader = new BufferedReader(new InputStreamReader(fis,"utf-8"),5*1024*1024);// 用5M的缓冲读取文本文件
String line = "";
while((line = reader.readLine()) != null){
//TODO: write your business
}
实例化BufferedReader时,增加一个分配缓存的参数即可
楼主试试看吧
绝大多数的文本编辑器是一次性全部加载进内存的,只有少数的比如 EmEditor 可以批量加载。
绝大多数的文本编辑器是一次性全部加载进内存的,只有少数的比如 EmEditor 可以批量加载。
VIM, Word...
Charset charset = Charset.defaultCharset();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(FilePath, true), charset),1024*1024*20);
另外,通过设置jvm运行参数-Xmx1350m,大小自己去调
java -Xmx1g ...
如果1G不够,就2G或者更多。如果没有那么多内存可用,我们再说其他的解决办法:)
import java.io.EOFException;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.HashSet;
import java.util.LinkedHashMap;public class HeavyMap extends LinkedHashMap<String, Integer> {
private static final long serialVersionUID = -858815745597381386L;
public static final int DEFAULT_CAPACITY = 2000;
public static final String File_Prefix = "heavy_map";
public static final String File_Suffix = "bin";
private int capacity;// 内存对象容量
private RandomAccessFile switchFile;// 数据交换文件
private HashSet<Integer> virtualCache = new HashSet<Integer>(); public HeavyMap() throws IOException {
this(DEFAULT_CAPACITY);
} public HeavyMap(int capacity) throws IOException {
this(capacity, File.createTempFile(File_Prefix, File_Suffix));
} public HeavyMap(int capacity, File switchFile) throws IOException {
super(16, 0.75f, true);
this.capacity = capacity;
if (switchFile.isDirectory()) {
switchFile = File.createTempFile(File_Prefix, File_Suffix,
switchFile);
}
this.switchFile = new RandomAccessFile(switchFile, "rw");
} @Override
public Integer put(String key, Integer value) {
virtualCache.add(key.hashCode());
return super.put(key, value);
} @Override
protected boolean removeEldestEntry(
java.util.Map.Entry<String, Integer> eldest) {
if (size() >= capacity) {
updateEntry(eldest);
return true;
}
return false;
} @Override
public Integer get(Object key) {
Integer value = super.get(key);
if (value == null && virtualCache.contains(key.hashCode())) {
Integer v = findValue((String) key);
if (v != null) {
put((String) key, v);
}
}
return value;
} private Integer findValue(Object key) {
synchronized (switchFile) {
try {
switchFile.seek(0L);
long length = switchFile.length();
while (switchFile.getFilePointer() < length) {
int hash = switchFile.readInt();
int len = switchFile.readInt();
if (hash == key.hashCode()) {
byte[] data = new byte[len - 4];
if (switchFile.read(data) < 0) {
throw new EOFException();
}
int valueNumber = switchFile.readInt();
String keyString = new String(data, "UTF-8");
if (keyString.equals(key)) {
return valueNumber;
}
} else {
switchFile.skipBytes(len);
}
}
} catch (EOFException e) {
return null;
} catch (IOException e) {
throw new IllegalStateException("读取交换区数据时产生异常", e);
}
}
return null;
} private void updateEntry(java.util.Map.Entry<String, Integer> e) {
synchronized (switchFile) {
try {
switchFile.seek(0L);
long length = switchFile.length();
while (switchFile.getFilePointer() < length) {
int hash = switchFile.readInt();
int len = switchFile.readInt();
if (hash == e.getKey().hashCode()) {
byte[] data = new byte[len - 4];
if (switchFile.read(data) < 0) {
throw new EOFException();
}
int valueNumber = switchFile.readInt();
String keyString = new String(data, "UTF-8");
if (keyString.equals(e.getKey())
&& valueNumber != e.getValue()) {
switchFile.seek(switchFile.getFilePointer() - 4);
switchFile.writeInt(e.getValue());
}
} else {
switchFile.skipBytes(len);
}
}
} catch (IOException ex) {
throw new IllegalStateException("读取交换区数据时产生异常", ex);
}
}
} @Override
protected void finalize() throws Throwable {
super.finalize();
switchFile.close();
}
}