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
展开
 我来答
百度网友cbad167
推荐于2016-10-30 · TA获得超过309个赞
知道小有建树答主
回答量:388
采纳率:66%
帮助的人:291万
展开全部

很简单撒。利用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();
}
}

 

QQMSD8
2015-03-24 · 知道合伙人软件行家
QQMSD8
知道合伙人软件行家
采纳数:6788 获赞数:13239
没有做不到,只有想不到,帮助别人的同时也是对自己的提升

向TA提问 私信TA
展开全部
没明白你想干什么,但是java读取文件还是很简单的
麻烦你把问题描述清楚一点
你将文件读取出来后放到一个list中,之后去匹配就不需要再去读取了
另外,匹配合格的,你再放到另外一个list中,排序后再输出到txt文件
采纳我吧,我帮你写出来
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wdmhere
2015-03-24 · 超过20用户采纳过TA的回答
知道答主
回答量:57
采纳率:100%
帮助的人:10.8万
展开全部
我有个思路,你可以参考下
先将两个文件统一读取放入两个MAP中,然后迭代MAP-a,
用MAP-b.containsKey(MAP-a-key)方法,返回ture,输出的到C中key+value+yes;
返回false,输出到C中key+value+no;
注:a文件必须没有重复Key,否则会被覆盖。b文件无所谓,因为是被比较的。
追问
你是真的看懂了我的问题哦~!!!!可是这样写虽然高效但是显示内存溢出啊~???
追答
给你个思路:
如果在读取文件的时候内存溢出,显然是一次读取的内容太多;
那我可以批量读取,用WHILE循环,计数去量,并判断符合计数后进行逻辑处理,
记得在逻辑处理后将处理的map清空,计数了也要清空,然后就解决问题了~
具体代码如果搞不定我再敲。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式