请帮助我解决以下问题:
这是一个仅为澄清我的问题而定制的示例代码:
File accounts_File = new File("Sample_Folder\\example.txt");
FileInputStream fis = null;
BufferedInputStream bis = null;
DataInputStream dis = null;
String str_String = ""; //For storing the input from the file.
fis = new FileInputStream(accounts_File);
bis = new BufferedInputStream(fis);
dis = new DataInputStream(bis);
while (dis.available() != 0)
{
str_String = dis.readLine(); //Reading the line from the file.
StringTokenizer st = new StringTokenizer(str_String);
while (st.hasMoreTokens())
{
//I need some help here
}
}
fis.close();
bis.close();
dis.close();
输入文件(example.txt)如下所示:James> Hector> AUS> 25
目标只是扫描并用“安德森”取代“赫克托耳”。问题是名称“Hector”未知;唯一知道的是它的位置(在第一个“> ”之后)。
注意:如果更容易,我可以更改输入文件的格式。作为一个例子,我可以将格式更改为:
名字:詹姆斯
姓氏:赫克托耳
国家/地区:AUS
年龄: 25
*程序现在将扫描关键字“LastName:”并用“Anderson”替换其后的所有内容。
提前感谢您的帮助!
非常感谢任何建议。
答案 0 :(得分:3)
保持格式,它看起来像标准的csv文件(逗号分隔值,“逗号”是“>”字符),csv文件易于读写!
由于您无法替换“磁盘上”的文件内容,因此您必须将文件读入内存,并在内存中重写所需的更改并将其重写到磁盘。
该文件的简单模型是一个二维字符串数组,该文件的每一行都是一行,每个值都是一列,它产生4列。现在,姓氏(您要替换的字符串)始终位于matrix[lineNumber][1]
。更改每行和第二列的值。
对于生产代码,我会编写一个代表记录的类。然后,您的代码可能如下所示:
public void replace(File inputFile, String newName) {
List<Person> persons = new ArrayList<Person>();
// read the file
List<String> lines = readFile(inputFile);
// create a person instance for each line
for (String line:lines) {
String[] values = line.split(">");
persons.add(new Person(values));
}
// change the last name
for (Person person:persons) {
person.setLastName(newName);
}
// store all persons to file
writeFile(inputFile, persons);
}
请注意,实际工作(文件IO,更改名称)是在不同的方法和类中完成的。这使得替换方法中的主算法可以读取。
答案 1 :(得分:2)
我建议使用正则表达式替换第一个和第二个">"
之间的匹配。我承认我既不是Java专家,也不是正则表达专家,所以我不能马上提供“代码”。
您的问题表明您可以根据需要构建源文件 - 那么为什么不将其作为Xml文档呢?我当然不会做文本解析。
答案 2 :(得分:1)
尝试以下方法......
File accounts_File = new File("Sample_Folder\\example.txt");
FileInputStream fis = null;
BufferedInputStream bis = null;
DataInputStream dis = null;
String str_String = ""; //For storing the input from the file.
fis = new FileInputStream(accounts_File);
bis = new BufferedInputStream(fis);
dis = new DataInputStream(bis);
while (dis.available() != 0)
{
str_String = dis.readLine(); //Reading the line from the file.
final int firstIndex = str_String.indexOf('>');
if(firstIndex != -1 && firstIndex != str_String.length() - 1) {
final int secondIndex = str_String.indexOf('>', firstIndex + 1);
if(secondIndex != -1) {
final StringBuilder builder = new StringBuilder();
builder.append(str_String.substring(0, firstIndex + 1));
builder.append("Anderson");
builder.append(str_String.substring(secondIndex));
System.out.println(builder.toString());
}
}
}
dis.close();