读写文本文件

时间:2014-02-11 06:53:10

标签: java text-files

想知道是否有任何方法可以从文本文件中读取特定数据?例如:

  

[2014年1月1日凌晨3:57]   (EmailDeliveryOptionsHome.getAddEmailDeliveryOptions [连接位置:   MayConnectionPool]):遭遇异常| (值java.sql.SQLException:   ORA-12899:列值太大   “BGADMIN”。 “TBLSTOPRINT_ACCT”。 “EMAIL_ADDR”

我想阅读他们所说的部分

  

EmailDeliveryOptionsHome.getAddEmailDeliveryOptions

但不是其余的,我真的不知道怎么写程序不读日期和[Connection at:...... EMAIL_ADDR。我需要使用缓冲读卡器吗?或者我也可以使用其他方法吗?

public static void main(String[] args) {

        try
        {   File myFile = new File("system.txt");
            FileReader filereader= new FileReader(myFile);
            int len=(int)myFile.length();            
            char [] chars = new char[len];
            filereader.read(chars);
            for(int i=0; i<len; i++){
                System.out.print(chars[i]);
            filereader.close();
        }
        }

        catch(IOException e)
        {    System.out.print("Error performing file reading");
        }

此代码读取文本文件中的所有内容,如何修改文本文件以使其只读取特定数据?

2 个答案:

答案 0 :(得分:2)

您可以查看Pattern类,因为您正在阅读的内容似乎是某种定义的格式(模式),并且您一直在寻找可以提取的特定内容。

下面这个简单的代码可以完成你的目标:

        String input = "[January 1, 2014 3:57 AM] (EmailDeliveryOptionsHome.getAddEmailDeliveryOptions [Connection at : MayConnectionPool]) : Exception Encountered | (java.sql.SQLException: ORA-12899: value too large for column \"BGADMIN\".\"TBLSTOPRINT_ACCT\".\"EMAIL_ADDR\"";
    Pattern p = Pattern.compile("\\[Connection at\\s*:\\s*([^\\]]+)");
    Matcher m  =p.matcher(input);
    if(m.find())
    {
        System.out.println(m.group(1));
    }

这会产生:

MayConnectionPool

可以找到这个正则表达式的简单解释here

这样做如下:

  • [字符是正则表达式语言中的特殊字符,因此必须使用前面的额外\进行转义。像往常一样,需要一个额外的\来逃避Java。
  • Connection at将完全匹配这些字符
  • \ s *将匹配0个或多个空格字符(\\s
  • :将完全匹配
  • \ s *将匹配0个或多个空格字符(\\s
  • ([^\\]]+):在正则表达式语言中,圆括号(分别为())表示组捕获。这些括号之间的任何匹配都将被捕获并在以后访问时可用。如果您想要提取,而不仅仅是给定字符串中的匹配信息,则需要这些。正则表达式中的[]表示您想要匹配的一组字符,因此[abc]将匹配abc,没有特别的顺序。但是,如果你有跟随^字符的字符,则效果相反,意味着它将匹配方括号内的任何内容。简而言之,[^\\]]+是什么{1}}将匹配1个或多个重复的(+)任何不是结束方括号(\\])的字符。匹配的任何内容都将放在我稍后访问的组中。

答案 1 :(得分:0)

这是我使用的一种快速但有点脏的方式:

使用此(或使用您自己的方法)获取文件内容:

Scanner s = new Scanner(new File("textfile.txt"));
String fileContent = "";
if(s.hasNextLine()) { // If multiline
    while(s.hasNext()) {
        fileContent += s.nextLine() + "\n";
    }
}else { // If only one line
    while(s.hasNext()) {
        fileContent += " " + s.next();
    }
    // Remove the first space
    fileContent = fileContent.trim();
}

要从文件中删除您想要的数据:

String result = null;
String searchFor = "EmailDeliveryOptionsHome.getAddEmailDeliveryOptions";
if(fileContent.contains(searchFor)) {
result = fileContent.substring(
                fileContent.indexOf(searchFor), 
                fileContent.indexOf(searchFor) + searchFor.length());
}

现在,您将结果存储在名为result的变量中,或者如果找不到,则result为空。