java 删除某行和读写txt文件
### Java删除某行和读写TXT文件 在Java中,如果需要从文本文件中删除特定行,实际上并没有直接提供这样的方法。通常的做法是先将文件中的所有内容读取到内存中,然后根据需要过滤掉不需要的行,最后再将处理后的结果写回原文件或者新的文件中。下面我们将详细讲解这一过程。 #### 读取TXT文件 我们需要创建一个`FileReader`对象来读取文件。为了提高性能和易用性,通常会在这个`FileReader`的基础上创建一个`BufferedReader`对象,这样可以逐行读取文件内容。 ```java FileReader fr = new FileReader("./a.txt"); BufferedReader br = new BufferedReader(fr); ``` 接下来,我们可以使用`readLine()`方法来读取每一行。该方法每次调用都会返回一行字符串,直到文件结束时返回`null`。 ```java String s = br.readLine(); while (s != null) { // 处理每一行数据 s = br.readLine(); } ``` #### 过滤不需要的行 在读取过程中,我们需要检查每一行是否符合删除条件。这可以通过简单的字符串比较实现,比如检查行首的字符串是否与指定的字符串相等: ```java String name = "要删除的行"; while ((s = br.readLine()) != null) { String[] x = s.split(""); if (!x[0].equals(name)) { // 如果不符合删除条件,则保留该行 } } ``` 这里需要注意的是,上面的代码示例中使用了`split("")`,这意味着会按照空字符串进行分割,这显然不是我们想要的结果。正确的做法应该是按照空格或其他合适的分隔符进行分割。此外,`!x[0].equals(name)`这样的判断方式可能并不适用于所有情况,因为它只检查了行的第一个字符。更合理的做法是直接比较整个字符串: ```java if (!s.equals(name)) { // 不等于指定的名称,则保留该行 } ``` #### 写入文件 当所有的行都被读取并检查完毕后,我们需要将保留下来的行写回到文件中。这里我们同样需要创建一个`FileWriter`对象,并在其基础上创建一个`BufferedWriter`对象来提高写入效率。 ```java FileWriter fw = new FileWriter("./a.txt"); BufferedWriter bw = new BufferedWriter(fw); // 将保留下来的行写入文件 bw.write(file); bw.close(); fw.close(); ``` 这里需要注意,在写入完成后,一定要记得关闭缓冲流和文件流,以确保所有数据都被正确保存并且释放资源。 #### 完整示例代码 下面是根据上述步骤整理的一个完整的示例代码: ```java import java.io.*; public class DeleteRowInFile { public static void delete(String name) throws Exception { // 读取文件 FileReader fr = new FileReader("./a.txt"); BufferedReader br = new BufferedReader(fr); // 存储保留的行 StringBuilder fileContent = new StringBuilder(); String s = br.readLine(); while (s != null) { if (!s.equals(name)) { // 如果不是要删除的行,则保留 if (fileContent.length() > 0) { fileContent.append("\n"); } fileContent.append(s); } s = br.readLine(); } br.close(); fr.close(); // 将保留的行写回文件 FileWriter fw = new FileWriter("./a.txt"); BufferedWriter bw = new BufferedWriter(fw); bw.write(fileContent.toString()); bw.close(); fw.close(); } public static void main(String[] args) { try { delete("要删除的行"); } catch (Exception e) { e.printStackTrace(); } } } ``` 通过以上步骤,我们可以实现在Java中删除文本文件中的特定行的功能。这种方法虽然相对简单,但也是最常用的处理方式之一。
这里重新写入不要用下面的raf的方法写入,因为这里的raf写入是从头开始覆盖之前的文件,如果现在的String比之前的文件大的话可以把之前的文件全部覆盖掉,但是如果新的String比之前的方件小的话,那写入后的结果是新的String和旧的String长出新的String的结合体。
还要注意,这里用bw写入文件,最后要关掉流:bw.close();
还有这里一旦开始:
FileWriter fw = new FileWriter("./a.txt");
BufferedWriter bw = new BufferedWriter(fw);
之后,在close()之前,这个文件的其它操作如下面的s = lnr.readLine();就无效了,你会发现如果
FileWriter fw = new FileWriter("./a.txt");
BufferedWriter bw = new BufferedWriter(fw);写在s = lnr.readLine();之前的话,close()之前,这个s的值是空的,得不到值。
public static void delete(String name) throws Exception {
RandomAccessFile raf = new RandomAccessFile("./a.txt", "rw");
FileReader fr = new FileReader("./a.txt");
LineNumberReader lnr = new LineNumberReader(fr);
FileWriter fw = new FileWriter("./a.txt");
BufferedWriter bw = new BufferedWriter(fw);
String s = null;
String file = "";
int count = 0;
s = lnr.readLine();
while (s != null) {
String[] x = s.split(" ");
if (!x[0].equals(name)) {
if (count == 0)
file += s;
else
file += "\n" + s;
}
count++;
s = lnr.readLine();
}
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
- 1
- 2
- 3
前往页