我需要从文件中获取String。我知道如何使用BufferedReader读取整个文件,我知道如何获取类似“Integer:5”的值我可以从中获取Integer 5但我不知道如何做同样的事情并从中获取整个String它。我的意思是,假设我在一个文件中写了“数据:这是一个数据字符串”。我需要知道如何读取字符串并从中获取“This is a data String”。
ES2015
答案 0 :(得分:0)
您的数据不易使用,只能拆分,而且您的代码也不正确。
1.首先,用“,”分割,你有数据模式 dataName:dataValue
2.接下来,如果你用“:”分割数据,你将面临dataValue也可能包含“:”的问题 和拆分将无法按预期工作。 (我建议用第一个字符':'分开)
3.Inside dataValue还包含带有模式AA的数据:BB - >继续定义规则但在某些情况下拆分无法解决您的规则。 我向您展示了使用Pattern和String获取数据的简单示例(在步骤2中)。
public static void main (String ...args){
String input = "Data: Parent data: Child data";
String regex = "[:]"; // regular expression
// Using Pattern class
Pattern pattern = Pattern.compile(regex);
String output1 = pattern.split(input,2)[1];
// Using String class
String output2 = input.split(regex,2)[1];
System.out.println(output1);
System.out.println(output2);
}
如果您想在步骤3中获得更多数据,请了解正则表达式(正则表达式)并查看模式的java doc以了解它的工作原理。之后定义自己的规则来解析原始数据。也许很难,但正则表达式可以完成很多任务。如果有任何问题,至少要再次展示你的研究和问题。
答案 1 :(得分:0)
以下是您问题的答案......
我希望,那个文件实际上看起来并不像那样,导致等待发生的混乱...使它成为单独的行,而不是使用我的代码......它使它变得更简单。 ..
现在你应该知道两件事:
1。)您可以使用以下方法获取String的第二部分:
String text;
String[] scan=text.split(": ");
String ret=scan[1];
这样做是为了分隔包含:
的字符串而不是抓取字符串的第二部分......
2。)如果你已经知道将在该字符串中的文字,你可以使用它:
public static String replaceAllString(String s, String a, String b) {
s.replace(a, b);
return s;
}
public static void Example() {
String text;
text = replaceAllString(line, knownValue, "");
//knownValue: is the part of the String you DO NOT want in it...
//line: is the line from the file
}
现在它的作用是它而不是拆分String,它只是抓取String raw,并取消你不想在String中的已知值(这个不会编辑来自文件的行)......
现在,如果你不得不把它与文件一起作为一个巨大的混乱,我推荐这样做:
public static String[] getInfo() {
//assuming you have already done the file buffer read...
String[] sep=line.split(", ");
return sep;
}
public static String grab(String start) {
String sep=grabInfo();
String info="";
for (String s : sep) {
if (s.contains(start)) {
String[] c=s.split(start);
info=c[1];
break;
}
}
return info;
}
答案 2 :(得分:0)
我认为@ msagala25对他的评论是正确的,最简单的事情之一是使用 Regular Expression (RegEx)来检索1个(或可能更多)特定子字符串中的字符串与Java的 java.util.regex Pattern and Matcher 类一起使用时。
下面是一个方法( getBetween()),演示如何从字符串中检索几乎所有子字符串,为您提供左右字符串标记(可以这么说) 。让我们在你的文本文件中取第二行:
String fileLine = "[Slot Number: 0, Item ID: 399, Item Data: ItemStack{NETHER_STAR x 1, "
+ "UNSPECIFIC_META:{meta-type=UNSPECIFIC, display-name=§6Kit Selector, "
+ "lore=[§eUse this to, §eselect a kit!]}}]";
如果我们希望 399
元素的字符串中 Item ID:
的值,我们的左字符串标记将为: {{ 1}} 和我们的正确字符串标记为: "Item ID:"
,例如:
","
控制台窗口将显示: String leftTag = "Item ID:";
String rightTag = ",";
String[] data = getBetween(a, leftTag, rightTag);
System.out.println("The Item ID in String is: " + data[0]);
getBetween()方法返回单维字符串数组,唯一的原因是提供的 fileLine 字符串可能包含多组左右字符串标记。可以轻松地增强该方法,以仅返回特定实例或所提供的左和右字符串标记之间的特定实例。目前,如果您知道有多个实例,则需要遍历数组以获取所需的实例。在上面提供的 fileLine 字符串中,我们知道只有一个“项目ID:”的左字符串标记实例,其中包含“的正确字符串标记,” 在提供的 fileLine 字符串中,因此上面的示例代码只使用数组的索引0 来显示所需的内容。
默认情况下,此方法会在将结果放入返回的1D字符串数组之前修剪结果中的任何前导或尾随制表符和/或空格。通过提供布尔值false,可以通过 trimFound 可选参数选择关闭此选项。忽略字母大小写(默认为false)也可以应用,为 ignoreLetterCase 可选参数提供布尔值true(阅读提供的评论部分)。
以下是 getBetween()方法:
The Item ID in String is: 399
如前所述,Pattern / Matcher用于使用正则表达式检索所需的子字符串。根据是否要忽略Letter Case,有两种不同的表达方式。以下是每个表达式的解释:
如果字母大小写未被忽略:“\\ Q”+ leftStringTag + “\\ E(。*?)\\ Q”+ rightStringTag +“\\ E”
如果忽略字母大小写:“(?i)\\ Q”+ leftStringTag + “\\ E(。*?)\\ Q”+ rightStringTag +“\\ E”
答案 3 :(得分:-1)
请查看apache IOUtils的java.nio包,它提供了逐行读取文件的直接方法。读完一行后,您需要使用基于Regex的搜索来从该字符串中获取所需内容。
另外我看到你只是在阅读,直到找到特定的字符串,这是要求吗?
此外,您还没有关闭文件,因此也存在资源泄漏。