「java在文件中读取数组」java在文件中读取数组数据
今天给各位分享java在文件中读取数组的知识,其中也会对java在文件中读取数组数据进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
java关于文件读取和数组问题
从文件格式来看,数据是以空格作为列间隔,以换行作为行间隔。
所以,
在读取数据的时候,第一行忽略,然后按照。
姓名 年龄 国家 日期 项目 金 银 铜 总数 这个顺序去读取字符。
并且转义成你要的数据结构。
读完全部行后,你就有了一个list,或者数组。
最后就是统计了。
可以参考:
package zhidao;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
public class ReadFile {
/**
* main方法
*
* @param args
* @throws IOException
*/
public static void main(String args[]) {
File file = new File("src/zhidao/olympics.txt");
BufferedReader reader = null;
try {
reader = readFile(file);
} catch (IOException e) {
e.printStackTrace();
System.out.println("无法读取文件,可能文件不存在");
return;
}
ListRecord records = new ArrayListRecord();
try {
/**
* 这里过滤第一条(行)记录
*/
String str = reader.readLine();
str = reader.readLine();
for (; str != null; str = reader.readLine()) {
// System.out.println(str);
Record record = wrapData(str);
if (record == null) {
continue;
} else {
records.add(record);
}
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("读取文件的过程中发生了错误");
return;
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
System.out.println("文件无法关闭!");
return;
}
}
}
// System.out.println(records.size());
if (records == null || records.size() == 0) {
System.out.println("没有任何记录");
return;
}
MapString, Integer map = countMedals(records);
IteratorString iterator = map.keySet().iterator();
while (iterator.hasNext()) {
String key = (String) iterator.next();
System.out.println(key + ":" + map.get(key));
}
}
/**
* 统计每个国家获得的奖牌数量
*
* @param records
* @return
*/
public static MapString, Integer countMedals(ListRecord records) {
MapString, Integer map = new HashMapString, Integer();
for (int i = 0; i records.size(); i++) {
Record record = records.get(i);
Integer old = map.get(record.getCountry());
if (old != null) {
map.put(record.getCountry(), old + record.getTotle());
} else {
map.put(record.getCountry(), record.getTotle());
}
}
return map;
}
/**
* 将一条记录(String)转换成一个记录(Record)
*
* @param str
* @return
*/
public static Record wrapData(String str) {
if (str == null) {
return null;
}
Record record = null;
/**
* 这里我只是用空格做分隔符,你也可以重写这段代码,使得tab或其它不可见字符也可以做分隔符。
*/
StringTokenizer st = new StringTokenizer(str, " ");
// System.out.println(st.countTokens());
if (st.countTokens() == 10) {
record = new Record((String) (st.nextElement()),
(String) (st.nextElement()), (String) (st.nextElement()),
(String) (st.nextElement()), (String) (st.nextElement()),
(String) (st.nextElement()), (String) (st.nextElement()),
(String) (st.nextElement()), (String) (st.nextElement()),
(String) (st.nextElement()));
return record;
}
return null;
}
/**
* 读文件
*
* @param file
* @return
* @throws IOException
*/
public static BufferedReader readFile(File file) throws IOException {
BufferedReader reader = null;
FileInputStream fileInputStream = null;
InputStreamReader inputStreamReader = null;
try {
fileInputStream = new FileInputStream(file);
inputStreamReader = new InputStreamReader(fileInputStream);
reader = new BufferedReader(inputStreamReader);
return reader;
} catch (FileNotFoundException e) {
e.printStackTrace();
// if (fileInputStream != null) {
// fileInputStream.close();
// }
// if (fileInputStream != null) {
// fileInputStream.close();
// }
// if (reader != null) {
// reader.close();
// }
throw e;
}
}
}
/**
* 获奖记录的数据结构
*
* @author Administrator
*
*/
class Record {
private String name;
private int age;
private String country;
/*
* 关于日期,这里就直接使用String了,如果你有需要,可以自己转义一下。比如使用SimpleDateFormat("yyyy/MM/dd")或(
* "yyyy")等等
*/
private String year;
private String date;
private String sport;
private int gold;
private int silver;
private int copper;
private int totle;
public Record(String name, String age, String country, String year,
String date, String sport, String gold, String silver,
String copper, String totle) {
this.name = name;
this.age = Integer.valueOf(age);
this.country = country;
this.year = year;
this.date = date;
this.sport = sport;
this.gold = Integer.valueOf(gold);
this.silver = Integer.valueOf(silver);
this.copper = Integer.valueOf(copper);
this.setTotle(Integer.valueOf(totle));
}
public Record() {
}
public Record(String name, int age, String country, String year,
String date, String sport, int gold, int silver, int copper,
int totle) {
super();
this.name = name;
this.age = age;
this.country = country;
this.year = year;
this.date = date;
this.sport = sport;
this.gold = gold;
this.silver = silver;
this.copper = copper;
this.setTotle(totle);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getSport() {
return sport;
}
public void setSport(String sport) {
this.sport = sport;
}
public int getGold() {
return gold;
}
public void setGold(int gold) {
this.gold = gold;
}
public int getSilver() {
return silver;
}
public void setSilver(int silver) {
this.silver = silver;
}
public int getCopper() {
return copper;
}
public void setCopper(int copper) {
this.copper = copper;
}
public int getTotle() {
return totle;
}
public void setTotle(int totle) {
this.totle = totle;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
}
文件:因为读文件对格式的要求很高,所以这里将中间空白部分全部替换成了空格,你也可以在代码中做判断,如果是tab或者其它空白字符也可以做分隔符。
姓名 年龄 国家 年 日期 项目 金 银 铜 总数
RohullahNikpai 25 Afghanistan 2012 8/12/2012 Taekwondo 0 0 1 1
RohullahNikpai 21 Afghanistan 2008 8/24/2008 Taekwondo 0 0 1 1
AmarBenikhlef 26 Algeria 2008 8/24/2008 Judo 0 1 0 1
SorayaHaddad 23 Algeria 2008 8/24/2008 Judo 0 0 1 1
MohamedAllalou 26 Algeria 2000 10/1/2000 Boxing 0 0 1 1
TaoufikMakhloufi 24 Algeria 2012 8/12/2012 Athletics 1 0 0 1
结果:
Afghanistan:2
Algeria:4
想起以前在学校的时候做过C语言版本的类似东西,这里我就帮你写一个Java版本的吧。采用了面向对象的设计,很多代码已经抽取出来了。
没怎么做过测试。代码的健壮性你自己慢慢搞吧。关键是文件的格式一定不能错。当然你也可以在代码中对文件格式增加包容。
Java从文件中读取数据存入一个数组中
// 直接给一个只读一行的吧,呵呵,数字之间以空格来分隔public static void main(String[] args) throws Exception {File file = new File("src/test.txt");double[] a = getLineFromTxt(file," ");for(int i = 0; i a.length; i++){System.out.println("a["+i+"] = "+a[i]);}} test中的数据以空格隔开 12 32 32.02 public static double[] getLineFromTxt(File file, String split) throws Exception{BufferedReader br = new BufferedReader(new FileReader(file));String firstLine = br.readLine(); //就读第一行哦String[] arrs = firstLine.split(" ");//将字符数组转为double数组double[] arr = new double[arrs.length];for(int i = 0; i arr.length; i++){arr[i] = Double.parseDouble(arrs[i]);}if(br!= null){br.close();br = null;}return arr;}
用java从文件中读取二维数组
纠正下,文件中是没有二维数组的概念的,也就是说必须将文件中的内容转换为二维数组中的内容。
可以通过BufferedReader 流的形式进行流缓存,之后通过readLine方法获取到缓存的内容。
BufferedReader bre = null;
try {
String file = "D:/test/test.txt";
bre = new BufferedReader(new FileReader(file));//此时获取到的bre就是整个文件的缓存流
while ((str = bre.readLine())!= null) // 判断最后一行不存在,为空结束循环
{
System.out.println(str);//此处将读取到的内容根据需要的规则,写入到二维数组中即可
};
备注: 流用完之后必须close掉,如上面的就应该是:bre.close(),否则bre流会一直存在,直到程序运行结束。
Java读取TXT文件数据到数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.Arrays;
public class FileToAry {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new FileReader("c:\\test.txt"));//使用BufferedReader 最大好处是可以按行读取,每次读取一行
int n = 0;//定义n
int m = 0;//定义m
int[] U = null;//定义数组
int[] S = null;//定义数组
int index = 0;//索引
String temp;//定义字符串,用于保存每行读取到的数据
while ((temp = br.readLine()) != null) {
int[] ary = aryChange(temp);//通过函数吧字符串数组解析成整数数组
if (index == 0) {
n = ary[0];
m = ary[1];
}
if (index == 1) {
U = ary;
}
if (index == 2) {
S = ary;
}
index++;
}
br.close();// 关闭输入流
// 测试输出
System.out.println("n=" + n + "\tm=" + m + "\n数组U=" + Arrays.toString(U) + "\n数组S=" + Arrays.toString(S));
}
static int[] aryChange(String temp) {// 字符串数组解析成int数组
String[] ss = temp.trim().split("\\s+");// .trim()可以去掉首尾多余的空格
// .split("\\s+")
// 表示用正则表达式去匹配切割,\\s+表示匹配一个或者以上的空白符
int[] ary = new int[ss.length];
for (int i = 0; i ary.length; i++) {
ary[i] = Integer.parseInt(ss[i]);// 解析数组的每一个元素
}
return ary;// 返回一个int数组
}
java从文件中读数组
从流里面读出文件包含的长字符串,然后处理这个字符串,用split() 拆分成数组
java在文件中读取数组的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java在文件中读取数组数据、java在文件中读取数组的信息别忘了在本站进行查找喔。
发布于:2022-11-26,除非注明,否则均为
原创文章,转载请注明出处。