文件读写与替换(详细)

1.首先是写入文件
注意看注释,这个新构造的文件在哪里呢?在你的这个WriteData项目文件夹下面,内容就是在代码中写的内容。提醒以下,如果文件已经存在的情况是直接退出,然后在代码中码的内容都不能输入文件,原来的文件没有任何更改。
在这里插入图片描述



public class WriteData {

	public static void main(String[] args) throws Exception {          //利用PrintWriter构造烦方法可能有异常,暂时先声明throws Exception就不会报错了
		// TODO 自动生成的方法存根
		java.io.File file = new java.io.File("scores.txt");
		if(file.exists()) {                      //检查文件是否存在,如果已经存在就退出
			System.out.println("File already exists");
			System.exit(0);
			
		}
		
		java.io.PrintWriter output = new java.io.PrintWriter(file);    //如果文件不存在,用PrintWriter方法构建一个新文件              
		
		                                        //以下是写入内容
		output .print("John T Smith ");   //注意最后有一个空格
		output.println(90);
		output.print("Eric K Jones ");      //最后有一个空格
		output.println(85);
		output.close(); 
	}

}


2.文件读取
执行这个程序前需要做一些准备工作,从文件的写入就可以看出,新建的文件是在WriteData文件夹下面的。那么文件读取也是在ReadData文件夹下面,先把刚刚在WriteData下面生成的score.txt文件复制粘贴到ReadData下面。然后再开始读取。
与上面相同的是也声明了一个 throws Exception. 上面注释提示的加一个空格在这里显得尤为重要,可以把score.txt里面的空格去掉试一下 字符串变成 John T Smith90和Eric K Johes85,运行就会报错。原因在于next()和nextInt 是读取空格(也可以是回车,还可以是自己定义的分隔符)结束的(要不然前面怎么给你分成firstName和mi的?) String Lastname把Smith和90都给读了,Score就没有可以读的了,然后就报错了。我试了一下,如果 John T Smith90,90前最后没有空格的话,把最后一个int score = input.nextInt()改乘String score = input.nextLine()就没问题,nextLine()解释的是使用行分隔符从这个扫描器返回一个行结束,也就是把一个行分隔符这个“\n”也就是Enter键之前到上一个“\n”的字符到输出了,但我还是没看懂是这个代码为什么nextLine()可以正确输出 …

import java.util.Scanner;
public class ReadData {

	public static void main(String[] args) throws Exception{
		// TODO 自动生成的方法存根
		java.io.File file = new java.io.File("scores.txt");
		Scanner input = new Scanner(file);
		
		while(input.hasNext()) {
			String firstName = input.next();       //input.next()书上解释的是从这个扫描器返回下一个 标志作为字符串
			String mi = input.next();           //mi的意思是中间名
			String lastName = input.next();
			int score = input.nextInt();
			System.out.println(firstName+" "+mi+" "+lastName+" "+score);
		}
		input.close();
	}

}

3.替换文件
刚看代码的时候一脸懵逼,根本看不懂,最后敲出来之后也不知道怎么运行,后来我发现了…
先上代码,解释在下面

import java.io.*;
import java.util.*;

public class ReplaceText {

	public static void main(String[] args) throws Exception{
		// TODO 自动生成的方法存根
	   if(args.length != 4) {                                          //检查传给main()方法的参数个数
		
			System.out.println("Usage: java ReplaceText sourceFile targetFile oldStr newStr");
     		System.exit(0);
		}   
		
		File sourceFile = new File(args[0]);
		if(!sourceFile.exists()) {                              //源文件是否存在
			System.out.println("Source file"+args[0]+" does not exit");
			System.exit(0);
		}
		
		File targetFile = new File(args[1]);              //目标文件是否存在
		if(targetFile.exists()) {
			System.out.println("Target file "+args[1]+" already exists");
			System.exit(0);
		}
		
		Scanner input = new Scanner(sourceFile);                   //为源文件创建一个Scanner
		PrintWriter output = new PrintWriter(targetFile);          //PrintWriter构造新的目标文件(如果不存在)
		
		while(input.hasNext()) {                                  //从源文件读入
			String s1 = input.nextLine();                           
			String s2 = s1.replaceAll(args[2], args[3]);            //替换
			output.println(s2);                //向目标文件写入新的一行
		}
		input.close();                       //关闭输入输出文件
		output.close();
		

	}

}

import util和io的包是下面要用他们的类就不说了。throws Exception也是上面说过的。在main()里面有String[] args,只知道要这么写,但是不知道为什么。百度说那个就是传给main方法的参数,暂不深究,但是看下面用到了if(args.length != 4) 就有点不知道是什么,在这个程序里面简单来说就是检查你是否写了4个参数给main,参数是等一下我们要输入的。源文件和目标文件的检验和上面读写同理。最主要的是弄懂 args[0] args[1] args[2] args[3]是什么东西。在为源文件创建了Scanner后就可以读入他的字符串,这个字符串也是我们等下要输入的,然后再输入要替换成的字符串。最后的结果就是源文件不变,新建了一个目标文件,把源文件需要替换掉的字符串替换了。
最开始我不知道怎么运行这块代码…在eclipse里面直接运行得到的是这样的
在这里插入图片描述
要是不这样写代码,直接在代码里面找到文件路径肯定也能直接在eclipse控制台修改,这个代码是书上的,我就直接用了这个然后继续摸索怎么运行它。
后来发现既然没有路径就只能去DOS里面操作了,用这个java文件的功能实现另外一个文件的替换。首先把replaceText.java提出来,别放在他存的项目文件下面,不好访问。我把它放在E:/coding/java下面。在新建一个源文件也就是准备需要被替换的文件。如下,DOS里面运行java之后就会自动生成.class文件。
在这里插入图片描述

然后再DOS输入命令,先找到.java的位置,在写命令替换(cd是返回上层目录)。
找到位置后的命令,就是四个参数。两个文件(加上后缀),两个内容。输入这个命令之后再回过去看代码就清晰多了。

在这里插入图片描述

最后的效果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/alike_meng/article/details/82943701
今日推荐