一、实验目的
了解JAVA预定义的I/O流类;熟悉用I/O流类进行文本文件的读写和二进制文件的读写。
二、实验要求
1.分析程序的输出结果
import java.io.*;
public class E {
public static void main(String args[]) {
try{
FileOutputStream out=new FileOutputStream("hello.txt");
FileInputStream in=new FileInputStream("hello.txt");
byte content[]="ABCDEFG".getBytes();
StringBuffer bufferOne=new StringBuffer();
StringBuffer bufferTwo=new StringBuffer();
int m=-1;
byte tom[]=new byte[3];
out.write(content);
out.close();
while((m=in.read(tom,0,3))!=-1){
String s1=new String(tom,0,m);
bufferOne.append(s1);
String s2=new String(tom,0,3);
bufferTwo.append(s2);
}
in.close();
System.out.printf("%s\n",bufferOne);
System.out.printf("%s\n",bufferTwo);
}
catch(IOException e){}
}
}
输出结果:
ABCDEFG
ABCDEFGEF
2.读写文本文件
从键盘输入n(n值由键盘输入,n>2)个学生的JAVA课程成绩,并将成绩写入到d:\javagrade.txt文件中。然后,从该文件中找出最高分和最低分并输出到屏幕。
package t6_2;
import java.util.Arrays;
import java.util.Scanner;
import java.io.*;
import java.util.regex.*;
public class mymain6_2 {
public static void main(String args[]) throws IOException{
//输入部分
System.out.print("输入学生数n:");
Scanner reader = new Scanner(System.in);
int n = reader.nextInt();
System.out.print("输入这n个学生的JAVA课程成绩:");
Scanner reader2 = new Scanner(System.in);
String score = reader2.nextLine();
reader.close();
reader2.close();
//写入文件
String filename = "d:\\javagrade.txt";
FileWriter writer = new FileWriter(filename);
writer.write(score);
writer.close();
//读取文件
BufferedReader in = new BufferedReader(new FileReader(filename));
String line = in.readLine(); //读取一行内容
in.close();
//分离n个分数并保存到数组s[]中
String regex = "[0-9.]+";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(line);
int s[] = new int[n];
int i = 0;
while(m.find()){
s[i] = Integer.parseInt(m.group());
i++;
}
//数组元素升序排序
Arrays.sort(s);
//输出
System.out.print("最高分:"+s[s.length - 1]+"\n");
System.out.print("最低分:"+s[0]);
}
}
3.分析成绩单
现在有如下格式的成绩单(文本格式)score.txt:
姓名:张三,数学77分,物理67分,英语70分。
姓名:李四,数学82分,物理90分,英语85分。
姓名:王五,数学80分,物理85分,英语75分。
要求按行读取成绩单,统计每个学生的总成绩,并写入totalscore.txt文件中,总成绩的格式为:
张三,总分214分。
李四,总分257分。
王五,总分240分。
破题用了我5个小时
package t6_3;
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class mymain6_3 {
public static void main(String args[]) throws Exception{
String fromfile = "d://score.txt";//提前把文件放到D盘
//BufferedReader from = new BufferedReader(new FileReader(fromfile));
//读文件的时候汉字是乱码,所以正则表达式什么也匹配不上
InputStreamReader isr = new InputStreamReader(new FileInputStream(fromfile), "UTF-8");
BufferedReader from = new BufferedReader(isr);
String line = from.readLine();
int n = 0; //n行,即n个人
int personalsubscore[] = new int[3];
int personalallscore[] = new int[10]; //假设文件里的学生小于10
String name[] = new String[10];
while (line != null) {
//分离成绩
String regex1 = "[0-9.]+";
Pattern p = Pattern.compile(regex1);
Matcher m = p.matcher(line);
int i = 0;
int allscore = 0;
while(m.find()){
personalsubscore[i] = Integer.parseInt(m.group());
allscore += personalsubscore[i];
personalallscore[n] = allscore;
i++;
}
//分离姓名
String regex2 = ":.+?,";
Pattern p2 = Pattern.compile(regex2);
Matcher m2 = p2.matcher(line);
StringBuffer s3 = new StringBuffer();
//不能直接String s3 = null;String对象是不可修改的,不能给s3赋值
while(m2.find()){
s3.append(m2.group());
}
String regex3 = "[\u4e00-\u9fa5]+";
Pattern p3 = Pattern.compile(regex3);
Matcher m3 = p3.matcher(s3); //张三
StringBuffer subname = new StringBuffer();
while(m3.find()){
subname.append(m3.group());
name[n] = subname.toString();
}
//继续读取下一行
line = from.readLine();
n++;
}
from.close();
String tofile = "d://totalscore.txt";
BufferedWriter to = new BufferedWriter(new FileWriter(tofile));
for(int i = 0; i < n; i++){
to.write(name[i]+",总分"+personalallscore[i]+"分");
to.newLine();
}
to.close();
}
}
4.随机流读取二进制文件
在d:\logo.png文件中,保存的是中国石油大学(华东)的Logo图片。读取该图片文件中的第n(n值由键盘输入)个字节输出到屏幕。
package t6_4;
import java.util.Scanner;
import java.io.*;
public class mymain6_4 {
public static void main(String args[]) throws Exception{
String filename = "d:\\logo.png";
RandomAccessFile out = new RandomAccessFile(filename, "r");
long logolength = out.length();
System.out.print("请输入一个0~"+logolength+"的整数:");
Scanner reader = new Scanner(System.in);
long n = reader.nextLong();
reader.close();
out.seek(n);
System.out.print("该图片的第"+n+"个字节是:"+out.readByte());
out.close();
}
}
5.综合应用
在C:\newFile文件夹下存放有两类文件:.txt文本文件和.jpg图片文件。现在需要将C:\newFile文件夹中的.txt文件中的内容读出并显示到屏幕,将C:\newFile文件夹中的.jpg图片文件复制到D:\newFile文件夹中。然后删除C:\newFile文件夹中的.jpg图片文件。
提示:
通过BufferedReader读文本文件;
通过BufferedInputStream和BufferedOutputStream对象读写图片文件;
通过File类的delete()方法删除文件。
package t6_5;
import java.io.*;
public class mymain6_5 {
public static void main(String args[]) throws Exception{
//提前在C盘和D盘建好newFile文件夹,提前在C盘的newFile文件夹里建好.txt文件和.jpg文件
File file = new File("c:\\newFile");
File[] filename = file.listFiles();//目录
for(int i = 0; i < filename.length; i++){
if(filename[i].getName().endsWith(".txt")){
//读取txt文件
BufferedReader cfile = new BufferedReader(new FileReader(file+"\\"+filename[i].getName()));
String line = cfile.readLine();
while(line != null){
System.out.print(line);
line = cfile.readLine();
}
cfile.close();
}
else{
//读写jpg文件
BufferedInputStream cjpgfile = new BufferedInputStream(new FileInputStream(file+"\\"+filename[i].getName()));
BufferedOutputStream djpgfile = new BufferedOutputStream(new FileOutputStream("d:\\newFile\\"+filename[i].getName()));
int reader = cjpgfile.read();
while(reader != -1){
djpgfile.write(reader);
reader = cjpgfile.read();
}
cjpgfile.close();
djpgfile.close();
}
}
//删除jpg文件
for(int i = 0; i < filename.length; i++){
if(filename[i].getName().endsWith(".jpg")){
filename[i].delete();
}
}
}
}