从Java中的txt写入特定行

时间:2015-06-05 12:48:04

标签: java

这是我的代码:

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

}

1 个答案:

答案 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