现有如下格式的成绩单(文本格式)grate.txt:
姓名:马超,数学101分,英语120分,理综280分
姓名:韩信,数学120分,英语130分,理综300分
姓名:猴子,数学100分,英语145分,理综290分
要求:
按行读入取成绩单,并在该行的最尾部加上该同学的总成绩,然后再将该行写入到一个名字为grates.txt的文件中
代码实现
方法①:
package lei;
import java.io.*;
public class dahfcbdcj {
public static void main(String[] args) {
File file=new File("c:\\javas\\grate.txt");
File file1=new File("c:\\javas\\kk\\grates.txt");
Students s=new Students();
s.read(file,file1);
}
}
class Students{
String str=null;
BufferedReader r;
BufferedWriter w;
public void read(File file,File file1){
try{
r=new BufferedReader(new FileReader(file));
w=new BufferedWriter(new FileWriter(file1));
while((str=r.readLine())!=null){
double j=0,k=0;
char[] a=str.toCharArray();
for(int i=0;i<str.length();i++){
if(a[i]>='0'&&a[i]<='9'){//这里的0——9表示的是ASSIC码表中的,0的ASSIC码值为48
j=(double)(a[i]-48);
i++;
if(a[i]>='0'&&a[i]<='9'){
j=j*10+(double)(a[i]-48);
i++;
}
if(a[i]>='0'&&a[i]<='9'){
j=j*10+(double)(a[i]-48);
}
k+=j;
}else{
j=0;
}
}
String s1=str+"-------------总分"+k+"分";
System.out.println(s1);
w.write(s1);
w.newLine();
}
w.close();
r.close();
}catch(IOException e){
}
}
}
方法②:
public class dahfcbdcj2 {
public static void main(String[] args) {
File file=new File("c:\\javas\\grate.txt");
File file1=new File("c:\\javas\\kk\\grates.txt");
Students2 s=new Students2();
s.read(file,file1);
}
}
class Students2{
String str=null;
BufferedReader r;
BufferedWriter w;
public void read(File file,File file1){
try{
r=new BufferedReader(new FileReader(file));
w=new BufferedWriter(new FileWriter(file1));
while((str=r.readLine())!=null){
double r=0;
char[] a=str.toCharArray();
for(int i=0;i<str.length();i++){
double j = 0 ;
while(a[i]>='0'&&a[i]<='9') {
j=j*10+(double)(a[i]-48);
i++;
}
r += j ;
}
String s1=str+"-------------总分"+r+"分";
System.out.println(s1);
w.write(s1);
w.newLine();
}
w.close();
r.close();
}catch(IOException e){
}
}
}
方法三:使用正则表达式进行求法:
public class dafgsfhfjkdhfuksd {
public static void main(String[] args) throws IOException {
File file=new File("c:\\javas\\grate.txt");
File file1=new File("c:\\javas\\kk\\grates.txt");
BufferedReader br = new BufferedReader( new FileReader(file));
BufferedWriter bw = new BufferedWriter( new FileWriter(file1));
String str = null ;
while ( ( str = br.readLine() ) != null ) {
double scores = StudentScore.totalScore(str);
str = str + "总成绩:" + scores ;
System.out.println(str);
bw.write(str);
bw.newLine();
}
br.close();
bw.close();
}
}
class StudentScore{
public static double totalScore(String s) {
String regex = "[^0123456789]";//正则表达式,[^0123456789]相当于[^0-9]
String digitMess = s.replaceAll(regex, "*");
StringTokenizer st = new StringTokenizer(digitMess,"*");
double scores = 0;
while(st.hasMoreTokens()) {
double score = Double.parseDouble(st.nextToken());
scores += score;
}
return scores;
}
}
说明:
类 StringTokenizer 位于java.util.StringTokenizer包中
string tokenizer 类允许应用程序将字符串分解为标记。tokenization 方法比 StreamTokenizer 类所使用的方法更简单。
StringTokenizer 方法不区分标识符、数和带引号的字符串,它们也不识别并跳过注释。
hasMoreTokens() 测试此 tokenizer 的字符串中是否还有更多的可用标记。----- boolean
nextToken() 返回此 string tokenizer 的下一个标记。------String
想要了解该方法的更多内容可以自行查询API文档
方法四:使用split方法进行分割
import java.io.*;
public class I_O {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader( new FileReader( "c:\\javas\\grate.txt" ));
BufferedWriter bw = new BufferedWriter( new FileWriter( "c:\\javas\\kk\\ooooo.txt",true));
String str = null ;
while( (str=br.readLine())!=null ) {
String [] s = str.split(",") ;//使用逗号进行分割
int k = 0 , sum = 0 ;
for(String a : s ) {
if(k>=1&&k<=3) {
String b =a.substring(2,5);//根据下标获取字符串中的数字
//int c = Integer.valueOf(b);//转换为int类型
int c = Integer.parseInt(b);//转换为int类型
//System.out.println(c);此语句可进行验证,验证是否能够进行正常的输出
sum += c ;
}
k++;
}
// char [] ch = new char [1024];
bw.write(str+"-------------总分"+sum+"分");
bw.newLine();//换行
bw.flush();
}
bw.close();
br.close();
}
}
补充方法——正则表达式: