关于文件查找替换的一个问题

SMAR 发布于 2013/04/29 22:00
阅读 108
收藏 0
import java.io.*;
import java.util.Scanner;
import java.util.Arrays;

public class Test {
	public static void main(String args[]) {
		Scanner in = new Scanner(System.in);
		System.out.println("请输入一个字符文件名:");
		String filename = in.next();
		File fin = new File(filename);
		if (fin.exists() == false) {
			System.out.println("File not found!\n");
			return;
		}
		System.out.println("请输入被替换的串:");
		String substr = in.next();
		System.out.println("请输入替换串:");
		String repstr = in.next();
		byte[] b;
		byte[] r;
		b = substr.getBytes();
		r = repstr.getBytes();

		File fout = new File("_$$$_.tmp");
		int x = 0, c = 0, m = b.length, n = r.length; // c用于统计替换次数
		long i = 0, j = 0;
		byte[] buf = new byte[m]; // 输入缓冲
		try {
			RandomAccessFile raf1 = new RandomAccessFile(fin, "rw");
			RandomAccessFile raf2 = new RandomAccessFile(fout, "rw");
			while (true) {
				raf1.seek(i);
				x = raf1.read(buf);
				if (x == -1)
					break;

				if (Arrays.equals(buf, b)) {
					raf2.seek(j);
					raf2.write(r);
					c++;
					i = i + m;
					j = j + n;
				} else {
					raf2.seek(j);
					raf2.write(buf, 0, x);
					j++;
					i++;
				}

			}
			raf1.close();
			raf2.close();
			fin.delete();
			fout.renameTo(fin);
			System.out.println("共有" + c + "处被成功替换!");
		} catch (Exception e) {
			System.out.println("error");
		}
	} // end of main
} // end of Test

测试时,如果文件中仅有1111四个字符,将111替换成a时,结果为aa(应该为a1)。

能帮忙看看原因吗?自己写的,,找不到哪里有逻辑问题啊

加载中
0
SMAR
SMAR

经过反复测试,最终还是明白了。

原因是没有对缓冲区数组清空,只需设置一个byte 变量(值为零)对数组初始化。

byte []buf=new byte[m]; //输入缓冲
byte zero=0;
if(Arrays.equals(buf,b)){ raf2.seek(j);raf2.write(r);c++;i=i+m;j=j+n;Arrays.fill(buf,zero);}
else{raf2.seek(j);raf2.write(buf,0,x);j++;i++;Arrays.fill(buf,zero);}

0
SMAR
SMAR
求助!
返回顶部
顶部