从文本文件中读入矩阵数据源JAVA版
时间:2010-05-20 来源:klkvuhs
很多程序中都会用到矩阵数据源,Java采用输入流的方式从文本文件中读入。输入流分为字符流和字节流,字符流用于读入字符,字节流可读入多种数据类型,如double,int,float等。
一个普通的文本文件里若储存的是人工输入的数字,采用字节输入流读入的实际是其ascii码,而不是单个数据,尤其是小数类型的数据。例如,文本文件中的3.18,读入的实际是“3.18”的字符串的ascii码。将一个以小数为元素的矩阵数据从文本文件中读入,思路为首先将单个数据以字符串的形式读入,然后转化为double型。通常在Java语言中,浮点数常量默认为double型,除非明确指定为float类型,如3.18F。
输出流中将一个数字存入文本文件中,在文本文件中显示出来的将是以该数字为ascii码的字符,这时候打开文本文件看到的一般是乱码。所以字节输入流多用于读取这种情况下存入的数据,此时不需要数据类型的变换即可。
下面详细介绍一下读入数据的类,我不是一个专业的程序员,这个程序是自己写的,可能存在很多不合理的地方,欢迎给出意见。
我的文本文件中的数据是这样的:
# 2.5 2.3 5.6 8.9 4.1
# 2.6 5.9 6.9 5.2 6.9
# 5.6 5.6 8.0 5.4 8.4
……
程序如下:
import java.io.*;
import java.util.*;
public class read_source
{
final int EOF=-1;
private double[][] source;//数据源矩阵
File f;
public read_source(String data_txt)
{
f=new File(data_txt);
}
public double[][] get_source() throws IOException
{
String a=new String();
String b=new String();
Vector v=new Vector();
int row=0;//数据源矩阵的行
int col=0;//列
FileReader in=new FileReader(f);
BufferedReader inTxt=new BufferedReader(in);
inTxt.mark((int)f.length()+1);//在文档开头设mark
/////////////////////////求二维数据的行和列//////////////////////////
while(inTxt.read()!=EOF)
{
row++;
inTxt.readLine();//readLine()是一个很有用的方法
}
inTxt.reset();//回到文档开头mark
a=inTxt.readLine();
StringTokenizer wordString=new StringTokenizer(a);
while(wordString.hasMoreTokens())
{
v.add(wordString.nextToken());//StringTokenizer类的nextToken()方法可以读入单个字符串,是个很有用
//的方法
}
col=v.size()-1;//去掉#
////////////////////////将文本文件中的数组读入存于double数组source///////////////////////
source=new double[row][col];//定义读入数据存放的数组
inTxt.reset();//回到文档开头mark
int i,j;
for(i=0;inTxt.read()!=EOF;i++)
{
a=inTxt.readLine();
StringTokenizer wordSS=new StringTokenizer(a);
for(j=0;wordSS.hasMoreTokens();j++)
{
b=wordSS.nextToken();
source[i][j]=Double.valueOf(b).doubleValue();//该方法将String类型的小数b转化double型(很关键)
//另一个可以用于该功能的是方法new Float(b).doubleValue()
}
}
in.close();
return source;
}
}
这个程序的弱点是没有检查矩阵是不是列对齐的,可以自行加上。希望对大家有帮助。