java 怎么读取文件中的字符和数据

如果有一个txt文件,里面的数据组织如下:
李明 40:50:60:70:80
刘胜 45:55:65:75:85

读取这个文件上的姓名与数字,输出到另一个txt文件上。提取数字,并求出总和,要求输出姓名与数字的总和。

怎么实现呢?希望能给出代码或指点。用正则表达式又该怎么实现?

JDK版本 1.5
测试结果
result.txt 文件中的内容如下

李明 40:50:60:70:80
姓名:李明 总成绩:300
刘胜 45:55:65:75:85
姓名:刘胜 总成绩:625

不明白+QQ 379821283

代码如下:

package com.rabbit.test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class TestFile {
public static void main(String[] args) throws Exception{
//获得文件输入流 假设目标文件名为data.txt
FileInputStream fin = new FileInputStream("data.txt");
InputStreamReader inR = new InputStreamReader(fin);
BufferedReader bfR = new BufferedReader(inR);
//获得文件输出流 假设目标文件名为resutl.txt 追加方式
FileOutputStream fout = new FileOutputStream("resutl.txt",true);
OutputStreamWriter outW = new OutputStreamWriter(fout);
BufferedWriter bfW = new BufferedWriter(outW);

String temp = "";//临时缓存 保存读取到的每一行记录
String[] tempArr = {};//临时缓存 保存用空格拆分该行记录得到的数组
String name="";//临时缓存 保存姓名
String[] scoreTemp = {};//临时缓存 保存分数串拆分后得到的数组
int totalScore = 0;//临时缓存 总成绩
//开始读文件
while((temp=bfR.readLine())!=null){
//正则表达式拆分读取到的每行 拆分成 姓名+分数串
tempArr = temp.split("[ ]+");
//得到姓名
name = tempArr[0];
//正则表达式拆分分数串得到分数数组
scoreTemp = tempArr[1].split(":");
//循环分数数组 得到总成绩
for(int i=0;i<scoreTemp.length;i++){
totalScore += Integer.parseInt(scoreTemp[i]);
}
//写入结果文件
bfW.write(temp+"\r\n");
bfW.write("姓名:"+name+" 总成绩:"+totalScore+"\r\n");
}
//关闭流
bfR.close();
bfW.close();
}

}

测试正常
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-06-05

  java中所有数据的传输都是通过字节流的形式,包括文件或图片。

  那么当你要读取一个文件时,首先将文件的绝对路径告诉java,调用对应的api就可以拿到该文件的字节流,下面是一段读取xml文件的例子

        SAXReader reader = new SAXReader();
        Document document = null;
        try {
            InputStream in = this.getClass().getResourceAsStream(xmlPath); 
            document = reader.read(in);
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }

  在这段代码中的SAXReader和Document是xml的工具类,无视就好了。

  重点是InputStream in = this.getClass().getResourceAsStream(xmlPath); 这句

  xmlPath就是文件的绝对路径,比如D:/abc/test.xml

  InputStream就是该文件的输入流,接下来就可以通过它得到文件里的数据,或者转存到其他地方。

  更多信息可以参看我的个人网站,详细介绍了I/O:

  http://www.mayee.net/blog/blogPage?b=4b570dfe3d8c4d47b71e65d729a99ced

第2个回答  2010-03-18
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class readStudentScore {
public static void main(String[] args) {

File in=new File("d:/1.txt");//成绩保存的文件。
File out=new File("d:/2.txt");//结果保存的文件
try {
BufferedReader br=new BufferedReader(new FileReader(in));//构造文件过滤流
BufferedWriter bw=new BufferedWriter(new FileWriter(out));//
String temp=new String();
while((temp=br.readLine())!=null){
String[]str=temp.split(" ");//以空格来划分姓名和成绩这两个字段
String name=str[0];
String[]score=str[1].split(":");//此处匹配的是全角的冒号,视情况自己改。
float scoreAll=0;
for(int i=0;i<score.length;i++){
scoreAll+=Float.valueOf(score[i]);//计算总成绩
}
String outStr=name+" "+scoreAll;
System.out.println(outStr);
bw.write(outStr);//把结果写入缓冲流
bw.newLine();//换行
bw.flush();//把缓冲流中数据写入文件
}
bw.close();//关闭流
br.close();
} catch(FileNotFoundException e) {
e.printStackTrace();
} catch (IOException ex){
ex.printStackTrace();
}

}

}
第3个回答  2010-03-17
可以使用 Scanner 这个类~ Scanner 类是以个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器。 具体看下java api~ 下面给你一小段代码

//将一个File对象作为Scanner的构造器参数,则Scanner读取文件内容
Scanner sc = new Scanner(new File("a.txt"));
System.out.println("a.txt文件内容如下:");
//判断是否还有下一行
while(sc.hasNextLine())
{
//输出文件中的一行
System.out.println(sc.nextLine());
}