Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 读写文本文件_Java_Text Files - Fatal编程技术网

Java 读写文本文件

Java 读写文本文件,java,text-files,Java,Text Files,想知道有没有从文本文件中读取特定数据的方法?例如: [2014年1月1日凌晨3:57] (EmailDeliveryOptions Home.getAddEmailDeliveryOptions[连接地址: MayConnectionPool]):遇到异常|(java.sql.SQLException: ORA-12899:列的值太大 “BGADMIN”“TBLSTOPRINT\u ACCT”“电子邮件地址” 我想读他们说的那部分 EmailDeliveryOptions主页.getAddEma

想知道有没有从文本文件中读取特定数据的方法?例如:

[2014年1月1日凌晨3:57] (EmailDeliveryOptions Home.getAddEmailDeliveryOptions[连接地址: MayConnectionPool]):遇到异常|(java.sql.SQLException: ORA-12899:列的值太大 “BGADMIN”“TBLSTOPRINT\u ACCT”“电子邮件地址”

我想读他们说的那部分

EmailDeliveryOptions主页.getAddEmailDeliveryOptions

但不是其他,我真的不知道如何编写程序来不读取日期和[连接地址:……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");
        }
publicstaticvoidmain(字符串[]args){
尝试
{File myFile=新文件(“system.txt”);
FileReader FileReader=新的FileReader(myFile);
int len=(int)myFile.length();
char[]chars=新字符[len];
filereader.read(chars);

对于(int i=0;i,您可以查看该类,因为您正在阅读的内容似乎是以某种定义的格式(模式)进行的,并且您总是在寻找可以提取的特定内容

下面这段简单的代码应该可以完成您的任务:

        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
可以找到这个正则表达式的简单解释

其作用如下:

  • [
    字符是正则表达式语言中的一个特殊字符,因此必须在前面用一个额外的
    \
    进行转义。通常,Java需要一个额外的
    \
    进行转义
  • 处的连接将与这些字符完全匹配
  • \s*将匹配0个或更多出现的空白字符(
    \\s
  • 将与此完全匹配
  • \s*将匹配0个或更多出现的空白字符(
    \\s
  • ([^\\]]+)
    :在正则表达式语言中,圆括号(
    )表示组捕获。位于这些括号之间且匹配的任何内容都将被捕获,并在以后访问时可用。当您希望提取时需要这些内容,而不仅仅是匹配给定字符串中的信息。正则表达式中的
    []
    表示您希望匹配的一组字符,因此
    [abc]
    将匹配
    a
    b
    c
    ,没有特定的顺序。但是,如果在
    ^
    字符后面有字符,则效果相反,这意味着它将匹配方括号内的任何字符。简言之,
    [^\\]]+
    是指它将匹配(
    +
    )任何非右方括号(
    \\]
    )字符的1个或多个重复。匹配的任何字符都将放入我稍后访问的组中

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

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

      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());
      }
      

      现在你得到了一个名为<代码>结果< />的变量,或者如果没有找到“代码>结果是空的.< /p>你是否考虑删除字符串中的不需要的部分(或者捕获想要的部分)?阅读完整行后?如果文本的格式总是一样的。你可以找到第一个开括号(和第二个开方括号)的位置[并阅读其中的文本。是的,就像我说的,我想捕捉的所需部分就在第一个曲线括号之后,这表示“EmailDeliveryOptions Home.getAddEmailDeliveryOptions"每行的长度可能会有所不同,我真的很难弄清楚如何只捕获特定的数据。请看npinti的答案,这是一个更好的解决方案。非常感谢。在继续之前,我将了解更多关于模式类的信息。谢谢你。我不知道捕获MayConnectionPool的模式如何我了解这个正则表达式模式,但我解决了以前的问题,即通过使用pattern@user3007600:我修改了我的答案。对不起,我的错误,我的意思是我只想捕获“MayConnectionPool”你介意解释一下这个符号吗?\([^\[]+)\[他们是干什么的?我在网上搜索过,我真的不知道它是怎么工作的。Sorry@user3007600当前位置我再次更新了我的答案。我希望这能回答你的问题。