Java字符串(txt文本解析)

目录

1. String:

1.1  常见的字符串操作方法

2. StringBuffer和StringBuilder:

2.1 StringBuffer和StringBuilder的区别:

2.2 StringBuffer和StringBuilder的方法:

3. 开发场景(解析txt文件并保存到数据库):


1. String:

        String类的对象实例是不可变的,一旦创建下来,对字符串施加操作后并不改变字符串本身,而是生成了一个实例。

       1.1  常见的字符串操作方法

  1. 获取信息:

    • length():获取字符串的长度。
    • charAt(int index):获取字符串中指定位置的字符。
  2. 提取子串:

    • substring(int beginIndex) 或 substring(int beginIndex, int endIndex):获取字符串的子串,可以指定起始位置和结束位置。
  3. 连接字符串:

    • concat(String str) 或使用 + 运算符:将两个字符串链接在一起。
  4. 比较字符串:

    • equals(Object obj) 或 equalsIgnoreCase(String anotherString):用于比较字符串是否相等,可以忽略大小写。
  5. 查找子字符串:

    • indexOf(String str) 或 lastIndexOf(String str):查找指定子字符串在字符串中第一次或最后一次出现的位置。
  6. 判断开头和结尾:

    • startsWith(String prefix) 和 endsWith(String suffix):判断字符串是否以指定前缀或后缀开头。
  7. 替换和转换:

    • replace(char oldChar, char newChar) 或 replace(CharSequence target, CharSequence replacement):替换字符串中的字符或子字符串。
    • toLowerCase() 和 toUpperCase():将字符串转换为小写或大写形式。
  8. 去除空格:

    • trim():去除字符串首尾的空格。
  9. 拆分字符串:

    • split(String regex):根据指定的正则表达式将字符串拆分为子字符串数组。
  10. 格式化字符串:

    • format(String format, Object... args):使用指定格式化字符串和参数创建格式化字符串。
//获取信息:
String str = "Hello, World!";
int length = str.length();
char firstChar = str.charAt(0);
System.out.println("Length: " + length);
System.out.println("First character: " + firstChar);

//提取子串:
String str = "Hello, World!";
String substr1 = str.substring(7);
String substr2 = str.substring(7, 12);
System.out.println("Substring 1: " + substr1);
System.out.println("Substring 2: " + substr2);

//连接字符串:
String str1 = "Hello, ";
String str2 = "World!";
String result = str1.concat(str2);
System.out.println("Concatenated string: " + result);

// 或者使用 + 运算符
String result2 = str1 + str2;
System.out.println("Concatenated string using + operator: " + result2);

//比较字符串:
String str1 = "hello";
String str2 = "HELLO";
boolean isEqual = str1.equalsIgnoreCase(str2);
System.out.println("Strings are equal (ignoring case): " + isEqual);

//查找子字符串:
String str = "Hello, World!";
int index1 = str.indexOf("o");
int index2 = str.lastIndexOf("o");
System.out.println("First 'o' is at index: " + index1);
System.out.println("Last 'o' is at index: " + index2);

//判断开头和结尾:
String str = "Hello, World!";
boolean startsWith = str.startsWith("Hello");
boolean endsWith = str.endsWith("World!");
System.out.println("Starts with 'Hello': " + startsWith);
System.out.println("Ends with 'World!': " + endsWith);

//替换和转换:
String str = "Hello, World!";
String replacedStr = str.replace("Hello", "Hi");
String lowerCaseStr = str.toLowerCase();
String upperCaseStr = str.toUpperCase();
System.out.println("Replaced string: " + replacedStr);
System.out.println("Lowercase string: " + lowerCaseStr);
System.out.println("Uppercase string: " + upperCaseStr);

//去除空格:
String str = "   Hello, World!   ";
String trimmedStr = str.trim();
System.out.println("Original string: '" + str + "'");
System.out.println("Trimmed string: '" + trimmedStr + "'");

//拆分字符串:
String str = "apple,orange,banana";
String[] parts = str.split(",");
for (String part : parts) {
    System.out.println(part);
}

//格式化字符串:
String formattedStr = String.format("The value of pi is %.2f", Math.PI);
System.out.println("Formatted string: " + formattedStr);

2. StringBuffer和StringBuilder:

        Java 中还提供了 StringBufferStringBuilder 这两个类来处理字符串。这两个类主要用于解决字符串拼接时的性能和线程安全性问题,对于那些需要改变内容并有许多操作的字符串,可以使用StringBuffer和StringBuilder类。

        2.1 StringBuffer和StringBuilder的区别:

  • StringBuffer 是线程安全的可变字符序列,适合在多线程环境下进行字符串操作。
  • StringBuffer 的方法都是同步的,保证了多线程情况下的数据安全,但性能相对较低。
  • 适合在单线程或者多线程安全要求较高的场景下使用。

        示例:

StringBuffer sb = new StringBuffer();

sb.append("Hello"); sb.append("World"); 

String result = sb.toString();

  • StringBuilder 也是可变字符序列,但不是线程安全的,适合在单线程环境下进行字符串操作。
  • StringBuilder 的方法都是非同步的,性能比 StringBuffer 更高。
  • 适合在单线程环境下进行字符串操作,例如在需要频繁进行字符串拼接的场景。

        示例:

StringBuilder sb = new StringBuilder();

sb.append("Hello"); sb.append("World");

String result = sb.toString();

总的来说,如果在单线程环境下进行字符串操作,推荐使用 StringBuilder 来提升性能;如果在多线程环境下进行字符串操作,需要考虑线程安全性,则使用 StringBuffer。根据具体需求选择合适的类来操作字符串,可以更高效地处理字符串拼接和修改操作。

2.2 StringBuffer和StringBuilder的方法:

StringBufferStringBuilder 类都用于进行可变的字符串操作,主要提供了以下方法:

  1. 共同方法:

    • append(String str):将指定字符串追加到序列。
    • insert(int offset, String str):在指定位置插入字符串。
    • delete(int start, int end):删除指定范围内的字符。
    • replace(int start, int end, String str):替换指定范围内的字符。
    • reverse():反转序列中的字符。
  2. StringBuffer 特有方法:

    • capacity():返回当前容量。
    • ensureCapacity(int minCapacity):确保容量至少等于指定的最小值。
    • setCharAt(int index, char ch):将指定索引处的字符设置为指定的字符。
    • substring(int start, int end):返回一个新的字符串,它包含此序列当前所包含的字符子序列。
  3. StringBuilder 特有方法:

    • 与 StringBuffer 具有相同的方法,但不是线程安全的。

区别:

  • String 是不可变的字符串类型,一旦创建就不能被修改,任何修改字符串的操作实际上都会创建一个新的字符串对象。这种不可变性使得字符串在多线程环境下更加安全。
  • StringBuffer 是线程安全的可变字符序列,适合在多线程环境下进行字符串操作,其方法都是同步的。
  • StringBuilder 也是可变字符序列,但不是线程安全的,适合在单线程环境下进行字符串操作,其方法都是非同步的,并且性能比 StringBuffer 更高。

因此,StringBufferStringBuilder 主要用于解决字符串拼接时的性能和线程安全性问题,可以动态地构建字符串内容,而 String 则适合于表示不变的字符串常量。

3. 开发场景(解析txt文件并保存到数据库):

        注:只包含部分代码主要用来展示字符串的实际操作:

    public void dataParser(File folder){
        //遍历主文件夹中的所有子文件夹
        if (folder.exists() && folder.isDirectory()){
            File[] subFolders = folder.listFiles(File::isDirectory);
            if (subFolders != null){
                for (File subFolder : subFolders){
                    processSubFolder(subFolder);
                    // 递归调用dataParser方法,遍历子文件夹中的文件夹
                    dataParser(subFolder);
                }
            }
        }
    }
    private void processSubFolder(File subFolder){
        String subFolderName = subFolder.getName();
        File[] files = subFolder.listFiles((dir, name) -> name.endsWith(".txt"));
        if (files != null){
            for (File file : files){
                processFile(file,subFolderName);
            }
        }
    }
    private void processFile(File file, String subFolderName) {
        try (BufferedReader br = new BufferedReader(new FileReader(file))) {
            switch (subFolderName) {
                case "01":
                    l01Service.save(readWholeFile(br));
                    break;
                case "02":
                    l02Service.save(readWholeFile(br));
                    break;
                    //.....

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private String readWholeFile(BufferedReader br) throws IOException {
        StringBuilder content = new StringBuilder();
        String line;
        while ((line = br.readLine()) != null) {
            content.append(line);
        }
        return content.toString();
    }
    public File convertMultipartFileToFile(MultipartFile multipartFile) throws IOException {
        File file = new File(Objects.requireNonNull(multipartFile.getOriginalFilename()));
        FileCopyUtils.copy(multipartFile.getBytes(), file);
        return file;
    }

    public File saveUploadedFile(MultipartFile file) throws IOException {
        String uploadDir = "D:\\uploads\\";
        File directory = new File(uploadDir);
        if (!directory.exists()) {
            directory.mkdirs();
        }

        File savedFile = new File(uploadDir + file.getOriginalFilename());
        file.transferTo(savedFile);
        return savedFile;
    }

//save方法
   public boolean save(String line) {
        String newLine = line.replaceAll("(?<=;);", "null;");
        String replaceAll = newLine.replaceAll("\\|\\|", "");
        String[] split = replaceAll.split("~");
        String[] finalSplit = split[0].split(";");
        for (String s : split) {
            L01 l01 = new L01();
            System.out.println("***********************************************************");
            System.out.println(" ");
            System.out.println(s);
            if (!s.equals(split[0])) {
                //文件体
                String[] strings = s.split(";");
                //文件头数据解析设置
                l01.seth("null".equals(finalSplit[0]) ? null : finalSplit[0]);
                l01.setc("null".equals(finalSplit[1]) ? null : finalSplit[1]);
                //日期类型转换
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                //数据时间
                try {
                    LocalDateTime dataTime = LocalDateTime.parse(finalSplit[2], formatter);
                    Date newDataTime = Date.from(dataTime.atZone(ZoneId.systemDefault()).toInstant());
                    l01.setDataTime(newDataTime);
                } catch (DateTimeParseException e) {
                    // 处理日期格式解析异常
                    System.err.println("Date parse exception for dataTime: " + e.getMessage());
                    l01.setDataTime(null); // 设置默认日期
                } catch (Exception e) {
                    // 其他异常,打印错误日志
                    System.err.println("Other exception: " + e.getMessage());
                }
                //解析设置文件体
                l01.setFm("null".equals(strings[0]) ? null : strings[0]);
                l01.setFz("null".equals(strings[1]) ? null : strings[1]);
                //设置xyz坐标
                //X
                try{
                    l01.setX("null".equals(strings[2]) ? null : new BigDecimal(strings[2]));
                }catch (NumberFormatException e){
                    // 处理NumberFormatException异常,打印错误日志
                    System.err.println("NumberFormatException: " + e.getMessage());
                    l01.setX(null); // 设置默认值为null
                }
                //Y
                try{
                    l01.setY("null".equals(strings[3]) ? null : new BigDecimal(strings[3]));
                }catch (NumberFormatException e){
                    // 处理NumberFormatException异常,打印错误日志
                    System.err.println("NumberFormatException: " + e.getMessage());
                    l01.setY(null); // 设置默认值为null
                }
                //Z
                try{
                    l01.setZ("null".equals(strings[4]) ? null : new BigDecimal(strings[4]));
                }catch (NumberFormatException e){
                    // 处理NumberFormatException异常,打印错误日志
                    System.err.println("NumberFormatException: " + e.getMessage());
                    l01.setZ(null); // 设置默认值为null
                }
                Date date = new Date();
                l01.setGgddiw(date);
                l01.setGgddiwa(date);
                //保存数据到数据库
                save(l01);
                for (String s1 : strings){
                    System.out.println(s1);
                }
            }
        }

        return true;
    }
  • 51
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值