java文本读取
如图A.txt和B.txt文件,要将A.txt和b.txt合并输出到c.txt条件是比如a某一行为33,16b某一行为33,6则c为33,16,yes就是说c.txt的写...
如图A.txt和B.txt文件,
要将A.txt和b.txt合并输出到c.txt条件是比如
a某一行为33,16
b某一行为33,6则c为33,16,yes就是说c.txt的写入以a为准:
楼主开始写了一个程序就是去读取a中每一行,然后读取b.txt中所有行当匹配到则写入c(不可能a和b匹配多次)接着读取a的下一行,在去读取b的所有行去匹配可是发现这样效率太低,而且有时候还容易内存溢出,注意:b的第一列是按大小排好序的,而a.txt没有,最好将a.txt也按第一列的大小排序:然后设法比对啊
以下是链接:链接: http://pan.baidu.com/s/1mgsYfvM 密码: idne
就是比如a.txt的第一列中的数比如上面的33,如果在b.txt的第一列也出现了33比如上面b的第一列也出现了33,则在c.txt中写入a.txt的第一行的+yes-》33,16,yes反之如果在b.txt中33始终不在第一列出现比如假设上面
b.txt中没有出现第一列为33的行,则在c中写入33,16,no 展开
要将A.txt和b.txt合并输出到c.txt条件是比如
a某一行为33,16
b某一行为33,6则c为33,16,yes就是说c.txt的写入以a为准:
楼主开始写了一个程序就是去读取a中每一行,然后读取b.txt中所有行当匹配到则写入c(不可能a和b匹配多次)接着读取a的下一行,在去读取b的所有行去匹配可是发现这样效率太低,而且有时候还容易内存溢出,注意:b的第一列是按大小排好序的,而a.txt没有,最好将a.txt也按第一列的大小排序:然后设法比对啊
以下是链接:链接: http://pan.baidu.com/s/1mgsYfvM 密码: idne
就是比如a.txt的第一列中的数比如上面的33,如果在b.txt的第一列也出现了33比如上面b的第一列也出现了33,则在c.txt中写入a.txt的第一行的+yes-》33,16,yes反之如果在b.txt中33始终不在第一列出现比如假设上面
b.txt中没有出现第一列为33的行,则在c中写入33,16,no 展开
3个回答
展开全部
很简单撒。利用HashMap不能重复的特点就可以了。
你先读b.txt的数据到HashMap.
然后再读a.txt 到同一个Map
这个时候如果遇到重复的Key,value就会被覆盖的。
就达到你的要求了撒。
参考代码:
将A.txt B.txt 换成你自己的路劲就可以了。
package a;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
public class TestReturn {
private static HashMap<String, String> map=new HashMap<String, String>();
public static void getTxt(File file){
try {
if(file.isFile() && file.exists()){ //判断文件是否存在
InputStreamReader read = new InputStreamReader(
new FileInputStream(file));
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt = null;
while((lineTxt = bufferedReader.readLine()) != null){
System.out.println(lineTxt);
map.put(lineTxt.split(",")[0], lineTxt.split(",")[1]);
}
read.close();
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
public static void writeTxt(File file) throws IOException
{
if(!file.exists())
file.createNewFile();
FileOutputStream outputStream = new FileOutputStream(file);
FileChannel channel = outputStream.getChannel();
String content="";
Iterator iter = map.entrySet().iterator();
while(iter.hasNext()){
Map.Entry<String, String> entry= (Entry<String, String>) iter.next();
content+=entry.getKey()+",";
content+=entry.getValue()+"\n";
}
ByteBuffer buffer = ByteBuffer.allocate(content.getBytes().length);
buffer.put(content.getBytes());
buffer.flip(); //此处必须要调用buffer的flip方法
channel.write(buffer);
channel.close();
outputStream.close();
}
public static void main(String[] args) throws IOException {
//处理文件B
getTxt(new File("d://B.txt"));
//处理文件A
getTxt(new File("d://A.txt"));
//数写入C
writeTxt(new File("d://C.txt"));
}
}
追问
不行哦~可能是我没说清楚意思吧~我补充了下意思???您看看哦~
追答
将上面GetTxt函数
改成下面就可以了:
public static void getTxt(File file){
try {
if(file.isFile() && file.exists()){ //判断文件是否存在
InputStreamReader read = new InputStreamReader(
new FileInputStream(file));
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt = null;
while((lineTxt = bufferedReader.readLine()) != null){
System.out.println(lineTxt);
if(map.get(lineTxt.split(",")[0])!=null)
{
map.put(lineTxt.split(",")[0], lineTxt.split(",")[1]+",yes");
}else{
map.put(lineTxt.split(",")[0], lineTxt.split(",")[1]+",no");
}
}
read.close();
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
2015-03-24 · 知道合伙人软件行家
关注
展开全部
没明白你想干什么,但是java读取文件还是很简单的
麻烦你把问题描述清楚一点
你将文件读取出来后放到一个list中,之后去匹配就不需要再去读取了
另外,匹配合格的,你再放到另外一个list中,排序后再输出到txt文件
采纳我吧,我帮你写出来
麻烦你把问题描述清楚一点
你将文件读取出来后放到一个list中,之后去匹配就不需要再去读取了
另外,匹配合格的,你再放到另外一个list中,排序后再输出到txt文件
采纳我吧,我帮你写出来
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我有个思路,你可以参考下
先将两个文件统一读取放入两个MAP中,然后迭代MAP-a,
用MAP-b.containsKey(MAP-a-key)方法,返回ture,输出的到C中key+value+yes;
返回false,输出到C中key+value+no;
注:a文件必须没有重复Key,否则会被覆盖。b文件无所谓,因为是被比较的。
先将两个文件统一读取放入两个MAP中,然后迭代MAP-a,
用MAP-b.containsKey(MAP-a-key)方法,返回ture,输出的到C中key+value+yes;
返回false,输出到C中key+value+no;
注:a文件必须没有重复Key,否则会被覆盖。b文件无所谓,因为是被比较的。
追问
你是真的看懂了我的问题哦~!!!!可是这样写虽然高效但是显示内存溢出啊~???
追答
给你个思路:
如果在读取文件的时候内存溢出,显然是一次读取的内容太多;
那我可以批量读取,用WHILE循环,计数去量,并判断符合计数后进行逻辑处理,
记得在逻辑处理后将处理的map清空,计数了也要清空,然后就解决问题了~
具体代码如果搞不定我再敲。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询