Java 读取文件字符串和本身设置的字符串长度不相等

Java在读取不同UTF8格式(含BOM与无BOM)文件时,可能导致字符串长度不一致。问题源于UTF8 BOM标识,在Windows下用文本编辑器以UTF-8格式保存的文件会带有该标识。解决方案是通过代码移除UTF8 BOM,例如使用`s.trim().replaceAll("uFEFF","")`。" 118387373,11199678,MySQL高级查询与操作指南,"['数据库', 'SQL', '查询优化', '存储过程', '数据库管理']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用java读取文件中的值并做比较,发现竟然不一样!!这让我当时百思不得其解,还以为是IDEA出现了问题呢

话不多说看代码

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class MatchingData {

    private static ArrayList<String> bankfin = new ArrayList<>();

    public static void main(String[] args)  {

        ArrayList<String> banksall = readFileByLines("C:\\Users\\EDZ\\Desktop\\banks.txt");

        HashMap<String, String> bankallMap = new HashMap<>();
        for (int n = 0; n<banksall.size();n++){
            String[] split = banksall.get(n).split(",");

            bankallMap.put(split[1],split[0]);
        }


        ArrayList<String> banksli = readFileByLines("C:\\Users\\EDZ\\Desktop\\littlebank.txt");



        for (int i = 0 ;i<banksli.size();i++){

            //将少数银行数据的表 通过,切割
            String[] bankslittle = banksli.get(i).split(",");

            String aa = bankslittle[0].trim().replaceAll("\\uFEFF","");

            System.out.println(aa.length());


            String bankname ;
            bankname = bankallMap.getOrDefault(aa,"-");

            //  System.out.println(bankname+".....");

            if (bankname.equals("-")){

                bankname =  bankallMap.getOrDefault(aa.substring(0,aa.length()-1)+"股份有限公司'","-");

                //   System.out.println(bankname+"/////");

                if(bankname.equals("-")){
                    bankname = (String) bankallMap.getOrDefault((aa.substring(0,aa.length()-1)+"有限责任公司'"),"-");

                    // System.out.println(bankname+";;;;;;;;;");

                    if(bankname.equals("-")){

                        String concat = banksli.get(i).toString().concat(",null");

                        bankfin.add(concat);
                    }else{
                        String bankkey = aa.substring(0, aa.length() - 1) + "有限责任公司',";
                        String concat= bankkey+ bankslittle[1] + "," + bankallMap.get(bankkey.substring(0,bankkey.length()-1));
                        bankfin.add(concat);
                    }

                }else {

                    String bankkey = aa.substring(0, aa.length() - 1) + "股份有限公司',";
                    String concat= bankkey + bankslittle[1] + "," + bankallMap.get(bankkey.substring(0,bankkey.length()-1));
                    bankfin.add(concat);
                }

            }else {
                String concat = banksli.get(i).toString().concat("," + bankallMap.get(aa));
                bankfin.add(concat);
            }


        }

            writeFileByLines("C:\\Users\\EDZ\\Desktop\\test.txt");


    }

    public static ArrayList<String> readFileByLines(String fileName) {
        File file = new File(fileName);
        BufferedReader reader = null;
        ArrayList<String> list1 = new ArrayList<>();

        try {
            reader = new BufferedReader(new FileReader(file));
            String tempString = null;
            int line = 1;
            // 一次读一行,读入null时文件结束
            while ((tempString = reader.readLine()) != null) {
                // Thread.sleep(1);
                //System.out.println(tempString);
                list1.add(tempString);
                line++;
            }
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
            return list1;
        }

    }

    public static void writeFileByLines(String fileName){
        File file = new File(fileName);  //存放数组数据的文件
        // FileWriter out = null;
        BufferedWriter bw =null;
        FileOutputStream writerStream = null;
        try {
            writerStream = new FileOutputStream(file);
            bw = new BufferedWriter(new OutputStreamWriter(writerStream, "UTF-8"));
        } catch (Exception e) {
            e.printStackTrace();
        }

        for(int m = 0;m<bankfin.size();m++){
            try {
                bw.write(bankfin.get(m));
                bw.newLine();

            } catch (IOException e) {
                e.printStackTrace();
            }


            System.out.println( "写入成功");
        }

        try {
            bw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}


打印结果

文件字符串:中国银行
文件字符串长度:5
-------------------------
本身设置字符串:中国银行
本身设置字符串长度:4

最后发现原来是两个文件的编码格式不太一样,一个是UTF8无BOM格式,一个是UTF8格式,这两种格式虽然都是UTF8,但还是有区别的,在Windows下用文本编辑器创建的文本文件,如果选择以UTF-8等Unicode格式保存,会在文件头(第一个字符)加入一个BOM标识(从第二行开始便没有这个BOM标识了)。

解决 :
将utf8的bom格式去掉
s.trim().replaceAll("\uFEFF","");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值