java:IO-一个文件读写例子

本题涉及文件格式转换,要求将原始数据重新组织并输出到新文件中,同时需遵循特定的数据格式规范。
任务:文件格式转换。
---------------------
 
在本题号对应的文件夹中,有一个示例输入文件:in.txt”(编码方式为gb2312
其中的内容为参加某次大赛学校及其参赛学生的得分等信息
 
其基本格式如下:
 
aaa工程技术学院:010-21345673:na005:xijing
84:java:13553001115:张小林
67:c:13725330616:李自云
25:java:13312349988:肖为
bbb理工大学:094-32421233:km008:lushan
81:c:18997111533:徐路
92:java::曹丽
ccc传媒大学:041-44441233:mt009:linhai
88:c++:15900010002:夏侯艺人
 
 
第一行数据是院校信息,信息项以冒号(:)分开。
院校信息共有4项,从左到右依次是:
 
1. 院校名称,不多于15个字符,可能含有汉字。
2. 院校电话,不多于15个字符,只含有数字或空格或连字符(-)
3. 院校编号,不多于6个字符,只含有数字和字母。
4. 归属地,不多于8个字符。只含有字母。
 
接下来是若干行(至少1行,不多于100行)学生信息,直到遇到下一条院校信息。
院校信息与学生信息的区别是:第一项如果是一个0~100间的整数,则为学生信息,否则为院校信息。
 
学生信息一共4项,从左到右依次是:
 
成绩,1~100的整数。
参赛组别,不多于10个字符,只含英文和数字。
学生电话,不多于15个字符,只含有数字或空格或连字符(-),该信息可能为空。
学生姓名,不多于6个字符,可以包含汉字。
 
院校的信息不超过1000行,且每个参赛院校只有一条信息。
所有信息项,除了学生电话一项外,均不为空。
 
 
要求编程,读入in.txt文件,按照新的格式组织输出到out.txt
具体要求:
1. 编码方式为GB2312
2. 输出信息为每个学生占一行,包含其所属院校的信息。
3. 输出信息的顺序,按照信息在in.txt出现的先后顺序
4. 每个信息项占用固定的宽度(注意每个汉字的输出宽度为2),其宽度规格明细为:
  院校名称:30
  院校电话:16
  院校编号:6
  归属地:  8
  学生成绩:4
  参赛组别:10
  学生电话:16
  学生姓名:12
 
5. 每项信息在其宽度区间内左对齐,不足宽度用西文空格填充(注意不是用tab制表符)。
6. 归属地是如下字符串的,输出用等号后的汉字串代替:
  xijing=西京
  lushan=鲁山
  pingyang=平阳
  danling=丹凌
  xinyuan=新元  
 
 
如果输入文件如in.txt所示,输出则应为out.txt所示,即输出文件内容为:
 
na005 aaa工程技术学院               010-21345673    西京    张小林    java  84  13553001115     
na005 aaa工程技术学院               010-21345673    西京    李自云      c         67  13725330616     
na005 aaa工程技术学院               010-21345673    西京    肖为        java      25  13312349988     
km008 bbb理工大学                   094-32421233    鲁山    徐路        c         81  18997111533     
km008 bbb理工大学                   094-32421233    鲁山    曹丽        java      92                  
mt009 ccc传媒大学                   041-44441233    linhai  夏侯艺人    c++       88  15900010002   
 
 
选手注意:
1. 我们在评价您的代码的时候,用的是完全不同的测试数据,但其格式与in.txt相同。
2. 请把所有java类写在一个文件中,调试通过,拷贝至:“解答”文件夹下:“解答.txt”即可。
不要拷贝相关的工程、配置等文件。
3. 代码中只能使用jdk5.0兼容的API,不能使用更高版本的特性。代码中不要使用package语句。
 

public class T4 {
public static void main(String[] args) throws Exception{
    File f1 = new File("in.txt");
    BufferedReader read = new BufferedReader(new InputStreamReader(new FileInputStream(f1),"GB2312"));
    File f2 = new File("out.txt");
    f2.createNewFile();
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f2), "GB2312"));
    String strinfo; //存放一行信息
    String[] info; //存放一行信息以":"分解后
    String schoolInfo = ""; //存放学校信息
    while((strinfo = read.readLine()) != null) {
        info = strinfo.split(":");
        if(!isNumber(info[0])) { //如果是学校信息
            schoolInfo = String.format("%-6s%-"+(30-chineseNum(info[0]))+"s%-16s%-8s", info[2], info[0],             info[1], getGuiShuDi(info[3]));
        } else { //学生信息
            String studentInfo = String.format("%-"+(12-chineseNum(info[3]))+"s%-10s%-4s%-16s", info[3], info[1], info[0], info[2]);
            writer.write(schoolInfo + studentInfo);
            writer.newLine();
        }
    }
    read.close();
    writer.close();
}
 
public static boolean isNumber(String str) {
if(str.length()>2) return false;
for(int i=0; i<str.length(); i++) {
char c = str.charAt(i);
if(c<'0' || c>'9') {
return false;
}
}
return true;
}
public static String getGuiShuDi(String str) {
    if(str == "xijing") {
        return "西京";
    }
    if(str == "lushan") {
        return "鲁山";
    }
    if(str == "pingyang") {
        return "平阳";
    }
    if(str == "danling") {
        return "丹凌";
    }
    if(str == "xinyuan") {
        return "新元";
    }
    return "";
}
public static int chineseNum(String str) throws UnsupportedEncodingException { //获得汉字个数
    return str.getBytes("gb2312").length - str.length();
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值