为了账号安全,请及时绑定邮箱和手机立即绑定

文本文件A.txt中顺序包含如下文本:

文本文件A.txt中顺序包含如下文本:

万千封印 2022-10-02 13:09:24
HEDRASHDRAPOSDA1POSDA2POSDA3HEDRBSHDRBPOSDB1POSDB2POSDB3..........TLRL其中每个文本行前四个字母称为行类型,每个文本块从HEDR行开始到下个HEDR结束(不含下个HEDR行),最后一个TLRL是文件结束标志。约束条件1、处理掉文件不存在、文件打开或读取失败等异常。2、忽略掉空行。3、每个文本行前四个字符必须由三个大写英文字母加一个大写英文字母或一个数字组成,要求用正则表达式进行验证。4、如果文件末尾没有TLRL行,则返回空ArrayList,即认为该文件无效。  请编写一个方法,返回由若干个文件块组成的ArrayList,即其中每个元素是文本块,每个文本块也定义成一个ArrayList.返回的ArrayList的内存映射如下描述     【           【HEDRA,SHDRA,POSD,POSD】,           【HEDRB,SHDRB,POSD,POSD】,            ......            ......     】
查看完整描述

2 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

我写了一个demo,希望能帮到你
package com.wenqiang.regex;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

/**
* 其中每个文本行前四个字母称为行类型,每个文本块从HEDR行开始到下个HEDR结束(不含下个HEDR行),最后一个TLRL是文件结束标志。
* 约束条件:
* 1、处理掉文件不存在、文件打开或读取失败等异常。
* 2、忽略掉空行。
* 3、每个文本行前四个字符必须由三个大写英文字母加一个大写英文字母或一个数字组成,要求用正则表达式进行验证。
* 4、如果文件末尾没有TLRL行,则返回空ArrayList,即认为该文件无效。
* 请编写一个方法,返回由若干个文件块组成的ArrayList,即其中每个元素是文本块,每个文本块也定义成一个ArrayList.
* @author wenqiang
*
*/
public class MessageHander {

private final static String reg = "^[A-Z]{3}[A-Z0-9]+";

public boolean pathIsExist(String path){

File file = new File(path);

return fileIsExist(file);

}

public boolean fileIsExist(File file){
return file.exists();
}

public List<ArrayList<String>> handerMsg(String filepath){

List<ArrayList<String>> msgList = new ArrayList<ArrayList<String>>();

if(!pathIsExist(filepath)){

System.out.println("文件不存在!--PATH");
}else{

File file = new File(filepath);

FileInputStream fis = null;

InputStreamReader isr = null;

BufferedReader br = null;
try {
fis = new FileInputStream(file);

isr = new InputStreamReader(fis);

br =  new BufferedReader(isr);

String temp = "";

ArrayList<String> tempList = null;
try {
while(true){
temp = br.readLine();
if("TLRL".equals(temp)){
if(tempList!=null){
msgList.add(tempList);
}
System.out.println("文件读取结束--TLRL!");
break;
}else if(temp==null){
if(tempList!=null){
msgList.add(tempList);
}
System.out.println("文件读取结束--NULL!");
break;
}else{
if("".equals(temp)){

}else if(Pattern.matches(reg, temp.trim())&&"HED".equals(temp.substring(0, 3))){
if(tempList!=null){
msgList.add(tempList);
}
tempList = new ArrayList<String>();
tempList.add(temp);
}else{
tempList.add(temp);
}

}

}
} catch (IOException e) {

System.out.println("文件读取失败--IO!");
e.printStackTrace();
return msgList;
}

} catch (FileNotFoundException e) {
System.out.println("文件打不开!--FILE");
e.printStackTrace();
return msgList;
}finally{
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return msgList;
}

public static void main(String[] args) {

String filepath = "e:/file.txt";

List<ArrayList<String>> resultList = new MessageHander().handerMsg(filepath);

System.out.println(resultList.size());

System.out.println(resultList.toString());
//System.out.println(Pattern.matches(reg, "HEDRA"));
//System.out.println("HED".equals("HEDRA".substring(0, 3)));
}
}

查看完整回答
反对 回复 2022-10-06
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

约束1:打开文件或者读取文件失败要捕获异常信息用try catch就好了
约束2:while((line = br.readLine()) ==null)不读取这行
约束3:用正则验证前四个字符,每次读取一行,截取前四个九OK了,至于正则表达式,网上搜一下
约束4:while((sc.hasNextLine()&&(line=sc.nextLine())!=null)){
    if(!sc.hasNextLine())
    System.out.println(line);判断line的值是否是TLRL
     }

最后的意思就是:你每次读取一个HEDR开头的到head结尾的数据,就把他放在arraylist中

查看完整回答
反对 回复 2022-10-06
  • 2 回答
  • 0 关注
  • 110 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信