这是我的代码:
public static void modif(String name, String color, int k)
{
try {
File input= new File("file1.txt");
File output= new File("temp.txt");
String correctLine = (String) FileUtils.readLines(input).get(k-3);
BufferedReader br = new BufferedReader(new FileReader(input));
BufferedWriter bw = new BufferedWriter(new FileWriter(output));
String line="";
while ((ligne = br.readLine()) != null){
String lineConcat = line + "\n";
if(ligne.startsWith("\""+name+"\"")){
System.out.println(correctLine); // i can display the line to change
bw.write("\"" + name + "\"" + ": " + "\"" + color + "\"" + "\n"); // this is the way i replace my line
System.out.println("Awesome !");
bw.flush();
}else{
bw.write(lineConcat);
bw.flush();
}
}
bw.close();
br.close();
output.renameTo(new File("file2.txt"));
} catch (IOException e) {
e.printStackTrace();
}
}
基本上我想在检测到条件时替换特定的行。 我知道哪条线路要改变,但我不知道如何更换它。因为现在我只能检测一条线的开始并改变当前线而不是前一条线。
我尝试使用FileUtils.writeStringToFile,但它不起作用,所以我在这里寻求帮助:(
谢谢你们!
编辑:我的输入是这样的:
{
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
6.07721374522497,
43.08716485432151
],
[
6.051202617426629,
43.07969629888752
],
[
6.032563261594762,
43.07758570385911
]
]
]
},
"properties": {
"_storage_options": {
"color": "Orange"
},
"name": "CARQUEIRANNE"
}
}
我实际上在做的是当我找到“名字”行:“CAREQUEIRANNE”时,我想替换他的颜色属性,所以我必须去当前行 - 3我真的不知道该怎么做它
编辑2:
我的方法被称为:
BufferedReader in2 = new BufferedReader(new FileReader("file1.txt"));
String line;
String lineConcat = null;
int k=1;
while ((line = in2.readLine()) != null)
{
lineConcat = line + "\n";
String myPattern = tabCity[21];
Pattern p = Pattern.compile(myPattern);
Matcher m = p.matcher(lineConcat);
//Matcher m2 = p2.matcher(lineConcat);
if (m.find()){
System.out.println("Found !");
System.out.println(k);
modif("color", "Orange", k);
}
else
{
System.out.println("Not Found");
}
k++;
}
in2.close();
当我发现我的模式与文件中的研究相匹配时,我调用我的函数来替换城市的颜色属性
编辑3:
@BrettWalker这里是新代码:
public static void modif(String nom, String color, int k)
{
try {
File input = new File("file1.txt");
File output = new File("temp.txt");
BufferedReader br = new BufferedReader(new FileReader(input));
BufferedWriter bw = new BufferedWriter(new FileWriter(output));
String line="";
Stack st = new Stack();
st.push(br.readLine());
st.push(br.readLine());
st.push(br.readLine());
while ((ligne = br.readLine()) != null){
String ligneConcat = ligne + "\n";
st.push(ligneConcat);
String oldLine = (String) st.pop();
if(ligne.startsWith("\""+nom+"\"")){
oldLine = "\"" + nom + "\"" + ": " + "\"" + color + "\"" + "\n";
}
bw.write(oldLine);
}
bw.write((int) st.pop());
bw.write((int) st.pop());
bw.write((int) st.pop());
bw.close();
br.close();
output.renameTo(new File("file2.txt"));
} catch (IOException e) {
e.printStackTrace();
}
}
答案 0 :(得分:1)
您需要使用队列(缓冲区)临时保存Java中的一小段文件,以便您可以检测何时并允许您更改相应的行。
不是立即写出行,而是将行拖到队列(缓冲区)上,然后弹出队列中的下一个项目。如果弹出的是要更改的那个,则将修改后的行写入文件,否则将原始行写入文件。
有点可怜的伪代码来帮助表达这个想法。
// Open up the readers/writers
// Prime the queue with the first few line of the file.
// Need to add safeguard to protect against small files!!
queue.push(br.readLine());
queue.push(br.readLine());
queue.push(br.readLine());
while ((line = br.readLine()) != null) {
String lineConcat = line + "\n";
queue.push(lineConcat);
String oldLine = queue.pop();
if (line.startsWith("\""+name+"\"")) {
oldLine = < Modify oldLine >
}
bw.write(oldLine)
}
// Empty the queue
bw.write(queue.pop());
bw.write(queue.pop());
bw.write(queue.pop());
// Close the readers/writer