我觉得最重要的就是这个readFile函数了
package File;
import java.util.StringTokenizer;
import java.io.*;
public class ReadFile
{
public Student[] readFile(String fileName)
{
String firstLine;//第一行的表头数据
String message;//每一行的数据
//获取行的信息
int lineNumber=0;//初始化行数为0
try//注意这里也要用一个try,catch
{
FileReader in=new FileReader(fileName);
LineNumberReader lnr=new LineNumberReader(in);//用LineNumberReader对象,这个对象的参数要是FileReader
while(lnr.readLine()!=null)//LineNumberReader对象的readLine()函数
{
lineNumber++;
}
lnr.close();//关闭流
}catch(IOException ioe) {System.out.println("输入输出错误!");}
//System.out.println(lineNumber);
Student stu[]=new Student[lineNumber-1];//注意创建数组的大小要比行数小一,以为表头不存,否则会出现空指针问题
RandomAccessFile inAndOut=null;//创建并且初始化一个随机读写流对象
try
{
inAndOut=new RandomAccessFile(fileName,"rw");
//读入第一行并借此机会进行分类
firstLine=inAndOut.readLine();
byte a[]=firstLine.getBytes("iso-8859-1");//防止中文乱码
firstLine=new String(a);
//System.out.println("这是第一行的内容:");
//System.out.println(firstLine);
long length=inAndOut.length();
//System.out.println("这是随机读写流对象的长度:");
//System.out.println(length);
long position=inAndOut.getFilePointer();
//System.out.println("这是当前指针的位置:");
//System.out.println(position);
int num=0;//记录除了表头的行数
while(position<length)//注意随机存取流的遍历写法
{
if(firstLine.contains("导师"))//读入的文件时研究生类
{
message=inAndOut.readLine();
byte b[]=message.getBytes("iso-8859-1");
message=new String(b);
position=inAndOut.getFilePointer();//注意随机存取流的遍历写法
StringTokenizer fenxi=new StringTokenizer(message);
// 暂时的对象赋值
int id=Integer.parseInt(fenxi.nextToken());
String name=fenxi.nextToken();
int mathScore=Integer.parseInt(fenxi.nextToken());;
int computerScore=Integer.parseInt(fenxi.nextToken());;
String tutor=fenxi.nextToken();
String area=fenxi.nextToken();
stu[num]=new Postgraduate(id,name,mathScore,computerScore,tutor,area);
num++;
}
else//读入的文件是本科生类
{
message=inAndOut.readLine();
byte b[]=message.getBytes("iso-8859-1");
message=new String(b);
//System.out.println(message);
position=inAndOut.getFilePointer();
//System.out.println(position);
StringTokenizer fenxi=new StringTokenizer(message);
// 暂时的对象赋值
int id=Integer.parseInt(fenxi.nextToken());
String name=fenxi.nextToken();
int mathScore=Integer.parseInt(fenxi.nextToken());
int computerScore=Integer.parseInt(fenxi.nextToken());
//System.out.println(id);
//System.out.println(name);
//System.out.println(mathScore);
//System.out.println(computerScore);
stu[num]=new Undergraduate(id,name,mathScore,computerScore);
num++;
}
}
inAndOut.close();/*!!!注意这个关闭流一定是在catch前面那个大括号,因为位置写错了改了整整一个小时才发现错误*/
}catch(IOException ioe) {System.out.println("第二个输入输出错误!");}
return stu;
}
}
j
1.引用StringTokenizer类的时候,要import java.util.StringTokenizer类,用的时候要StringTokenizer fenxi=new StringTokenizer(message);
新建一个分析器对象,括号里是被分隔开的字符串,默认是各种空格的组合、换行符、回车符、tab键,要是自己又想法,就在string后边自己加。
这个读出来的是字符串,要变成int要用Integer.ParseInt()函数自己转化
2.try
{
}
catch(IOException){System.out.println("输入输出错误!");}
3.读取行数:LIneNumberReader类有个readLine函数,可以直接读取行数,但参数一定要是FileReader
4.空指针错误在java中我总是会出现,原因就是输出print函数循环的次数多了,数组没有那么大,回去找数组定义,数量是不是定义大了
5.这个把文件读进来之后怎么判断本科生还是研究生这个是找老师问的,第一种方法是判断读入的第一行里有没有“导师”这个词,第二种方法是判断第一行的数量,我咋就没想到呢。
6.注意转码写法