实验6 输入输出流

一、实验目的

了解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();
			}
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值