JAVA--I/O流


这一章涉及到流的操作:介绍下流操作的规律;
流操作的规律:选用那一个流对象?
  通过两个明确: 
    1> 明确源和目的:
                  明确源   输入流:InputStream  Reader
                  目的      输出流 :  OutputStream  Writer
                 
    2> 操作的数据是否纯文本:
                          纯文本--》字符流      否--》字节流
                         
    3>当体系明确后,在确定使用哪个对象   
                通过源设备来进行区分:源设备-->内存、 键盘、硬盘
                                                    目的设备-->内存、硬盘、控制台
 分析一:将一个文件的内容复制到另一个文件
               源: 文件       数据  纯文本    使用 Reader
      FileReader fr = new FileReader("源文件名");
             是否使用缓冲区:     BufferedReader bufr = new BufferedReader(fr);                               
         
           目的 :文件       使用Writer
      FileWriter fw = new FileWriter("目的文件名");
      是否使用缓冲区:BufferedWreter bufw = new BufferedWriter(fw); 
     
                          使用循环复制            
练习:将一个图片文件中的数据存储到另一个文件;即复制文件

分析2: 将键盘录入的数据保存到一个文件中
              源:InputStream  Reader
               纯文本:Reader 
              设备 :键盘。对应的对象是 System.in(字节流)
          为了操作输数据文本的方便 ,转成字符流按照字符串操作是最方便的 ,
          即:将system.in 转换成Reader
          用到Reader体系中的转化流InputStreamReader
  例: 
     InputStreanReader isr = new InputStreamReadr(Sywtem.in);
          是否提高效率:
     BufferedReader bufr = new BufferedReader(isr);
    
        目的: OutputStream  Writer
       纯文本:  Writer
       设备:  硬盘  文件    使用  FileWeiter  
       FileWriter fw = new FileWriter("文件名");
       是否提高效率:
       BufferedWriter bufw = new BufferedWriter(fw);
           使用循环连续录入
 --------------------------------------------------------        
 扩展:把录入的数据按照指定的编码表(UTF-8),将数据存到文件中   
       目的: OutputStream  Writer
       纯文本:  Writer
       设备:  硬盘  文件    使用  FileWriter  
      但是 FileWriter使用的默认的编码表,GBK
      存储时,需要加入指定的编码表utf-8,而指定的编码表只用转化流可以指定
      所以要使用的是OutputStreamWriter。
      而转化流对象要接收一个字节输出流,而且还可以操作文件的字节输出流,FileOutputStream
 所以: //将读取到的(指定编码的)字节流转化为字符流
  OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("文件名","utf-8"));
  是否需要高效:
    BufferedWriter bufw = new BufferedWriter(osw);    
      转化流是字节与字符之间转化的桥梁,通常涉及到字符编码转换时,需要用到转化流               
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
流按操作分为:字节流、字符流
流按流向分为:输入流、输出流
字节流的两个基类:InputStream(输入流)、OutputStream(输出流)
字符流的两个基类:Reader(写入数据)、Writer(读出数据)
缓冲区是有助于提高数据的读写效率,缓冲区要结合流才可以使用,在流的基础上对流的功能进行了增强;
Reader对应的缓冲区:BufferReader;
Wrier对应的缓冲区:BufferWriter;
综合举例Reader和Writer:

<span style="font-size:18px;"><strong>public class Demo {
/*
在D盘加一个文件,将C盘的一个文件的内容写进去
*/	
	public static void main(String[] args) throws IOException {
		//读取C盘中的文件
		FileReader fr = new FileReader("D:\\Demo.java");
		//写入D盘中的文件
		FileWriter fw = new FileWriter("D:\\Demo_copy.java");
		
		char[] buf = new char[1024];
		int num = 0;
		while((num = fr.read(buf)) != -1){/读取数据/
			fw.write(buf,0,num);//写入数据
			System.out.println(new String(buf,0,num));
		}
		fr.close();关闭流//
		fw.close();
	}
}

举例BufferReader和BufferWriter:
public class BufferReaderDemo {

	public static void main(String[] args) throws IOException {
		//创建一个读取流对象
		FileReader fr = new FileReader("java.txt");
		//创建缓冲区对象,需将被提高效率的流对象作为参数传递给缓冲区的构造函数
		BufferedReader bufr = new BufferedReader(fr);
			//读取行的方法读出
			String line = null;
			while((line = bufr.readLine()) != null){
				System.out.println(line);
			}
		//按字节的方法读出
//		char[] buf = new char[1024];
//			int len = 0;
//			while((len = bufr.read(buf)) != -1){
//				System.out.println(new String(buf,0,len));
//			}
	}
}
public class BufferWriterDemo {
/*
 * 创建缓冲区之前必须先创建 流对象
 */	
	public static void main(String[] args) throws IOException {
		//创建流对象
		FileWriter fw = new FileWriter("java.txt");
		//创建缓冲区对象,需将被提高效率的流对象作为参数传递给缓冲区的构造函数
		BufferedWriter bufw = new BufferedWriter(fw);
			for(int x = 0; x < 5; x++){
				bufw.write("abc" + x);
				bufw.newLine();//换行操作
				bufw.flush();
			}
			bufw.close();
	}
}

综合举例BufferReader和BufferWriter:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Demo {
	
	public static void main(String[] args) throws IOException {
		//使用缓冲区读取指定数据
		BufferedReader bufr = new BufferedReader(new FileReader("G:\\a.txt")); 
		//使用缓冲将数据写入指定位置
		BufferedWriter bufw = new BufferedWriter(new FileWriter("G:\\a_copy.txt"));
				String line = null;
				while((line = bufr.readLine()) != null){//读取出所有数据
					bufw.write(line);//将读取的数据写入指定位置
				}
					bufr.close();//关闭流
					bufw.close();
	}
}</strong></span>

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
字节流:InputStream和OutputStream及相对应的缓冲区BufferedInputStream和BufferedOutputStream
综合举例InputStream和OutputStream

<span style="font-size:18px;"><strong>public class Demo {
	public static void main(String[] args) throws IOException {
		//读取指定的数据内容
		FileInputStream fis = new FileInputStream("G:\\A.gif");
		//写入指定的数据内容
		FileOutputStream fos = new FileOutputStream("G:\\b.gif");
					
			byte[] buf = new byte[1024];
			int len = 0;
			while((len = fis.read(buf)) != -1){//循环读出所用数据
				fos.write(buf,0,len);//写入读取的数据
			}
			fis.close();//关闭流
			fos.close();
	}
}</strong></span>

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
转化流是字节流转化为字符流的桥梁
InputStream对应转化流InputStreamReader
OutputStream对应的转化流OutputStreamWriter
综合举例转化流:

<span style="font-size:18px;"><strong>import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

public class Demo {
/*
 * 直接使用readLine方法来完成键盘录入的读取
 */	
	public static void main(String[] args) throws IOException {
		//获取键盘录入对象
		InputStream in = System.in;
		//将字节流对象转化成字符流对象,使用InputStreamReader
		InputStreamReader isr = new InputStreamReader(in);
		//为了提高效率,将字符串进行缓冲区技术高效操作。使用BufferReader
		BufferedReader bufr = new BufferedReader(isr);
		
		//获取键盘输出对象
		OutputStream out = System.out;
		//将字节流转化成字符流,使用OutputStreamWriter
		OutputStreamWriter osw = new OutputStreamWriter(out);
		//为了提高效率。将字符串进行缓冲区技术高效操作,使用BuffferWriter
		BufferedWriter bufw = new BufferedWriter(osw);
		
			String len = null;
			while((len = bufr.readLine()) != null){
				if("over".equals(len)){
					break;
				}
				//采用输出流的方式输出
				bufw.write(len.toUpperCase());
				bufw.newLine();
				bufw.flush();//刷新
//				System.out.println(len.toUpperCase());
			}
			bufr.close();
	}
}
键盘录入练习1:
public class Demo{
/*
 * 把键盘录入的数据存储到一个文件
 * 源:键盘
 * 目的:文件
 * 
 */
	public static void main(String[] args) throws IOException {
		//获取键盘录入数据
		BufferedReader bufr = new BufferedReader(new InputStreamReader((System.in)));
		//将录入数据写入到指定位置
		BufferedWriter bufw = new BufferedWriter(new FileWriter("G:\\b.txt"));
			String line = null;
			while((line = bufr.readLine()) != null){
				if("over".equals(line)){//设置关闭操作
					break;
				}
				bufw.write(line);//将数据写入
				bufw.newLine();//换行
				bufw.flush();//刷新数据
			}
			bufr.close();//关闭了流
			bufw.close();
	}
}
键盘录入练习2:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class Demo {
/*
 * 将文件的数据输出到控制台;
 * 源:文件
 * 目的:控制台
 */	
	public static void main(String[] args) throws IOException {
		//读取指定的数据
		BufferedReader bufr = new BufferedReader(new FileReader("G:\\b.txt"));
		//将读取的数据输出到控制台
		BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
			String line = null;
			while((line = bufr.readLine()) != null){//读取所有数据
				bufw.write(line);//写入所有数据
				bufw.newLine();//换行
				bufw.flush();//刷新数据
			}
			bufr.close();
			bufw.close();
	}
}</strong></span>

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


File类基本功能:
/*
 * 创建: boolean createNewFile()  创建文件,如果已经存在则不创建
 *     boolean mkdir()//创建文件夹
 *     boolean mkdirs()//创建多级文件夹
 * 删除:
 * boolean delete();删除失败返回false,当文件正在使用时不能删除
 * void deleteOnExit()当文件退出时删除给文件(用于临时文件)
 *
 * 判断:boolean exists()文件是否存在
 * boolean isDirectory()判断是此文件是否是一个目录
 * boolean isFile()判断此文件是够是一个标准文件
 *
 * 获取:
 * getName:
 * getPath://返回绝对路径
 * getPaent://返回绝对路径的上一层目录
 * getAbsolutePath(获取绝对路径):
 *
 * static File[]  File.listRoots():获取系统的有效盘符(返回数组)
 * String[] list();获取指定路径的所有文件和目录(返回数组)
 *
 * File[] listFiles(); (返回路径名数组,可对象进行操作)获取目录下的文件
 */

 

<span style="font-size:18px;"><strong>代码练习:
import java.io.File;
import java.io.IOException;
public class Demo {
	
	public static void main(String[] args) throws IOException {
		//将file.txt封装成对象,可以将已有的和未有的文件或文件夹封装成对象
		File f = new File("file.txt");
//		System.out.println(f.getName());
//		System.out.println(f.getPath());//获取相对路径
//		System.out.println(f.getAbsolutePath());//获取绝对路径
		
		File f1 = new File("G:\\abc\\a.txt");//在G盘下创建abc文件夹又在abc文件夹次啊创建a.txt文件夹
		System.out.println(f1.mkdirs());//创建文件夹
//		System.out.println(f1.isDirectory());
		System.out.println(f.createNewFile());//创建文件,如果已经存在则不创建
//		System.out.println(f.isFile());//判断此文件是否是一个标准文件
//		System.out.println(f.delete());//判断此文件是否是一个目录
//		System.out.println(f.canExecute());//判断文件是否可执行
//		System.out.println(f.exists());//判断文件是否存在
		
		//listRoots方法
		File[] files = File.listRoots();//返回系统的所有盘符
		for(File k : files){
			System.out.println(k);
		}
		//listFiles方法
		File f2 = new File("D:\\");
		File[] s = f2.listFiles();//返回D盘下的所有文件和目录
		System.out.println(s.length);
		for(File str : s){
			System.out.println(str.getPath() + "-->" +str.getName());
		}
	}
}
import java.io.File;
import java.io.IOException;
public class Demo {
	
	public static void main(String[] args) throws IOException {
		//将file.txt封装成对象,可以将已有的和未有的文件或文件夹封装成对象
		File f = new File("file.txt");
//		System.out.println(f.getName());
//		System.out.println(f.getPath());//获取相对路径
//		System.out.println(f.getAbsolutePath());//获取绝对路径
		
		File f1 = new File("G:\\abc\\a.txt");//在G盘下创建abc文件夹又在abc文件夹次啊创建a.txt文件夹
		System.out.println(f1.mkdirs());//创建文件夹
//		System.out.println(f1.isDirectory());
		System.out.println(f.createNewFile());//创建文件,如果已经存在则不创建
//		System.out.println(f.isFile());//判断此文件是否是一个标准文件
//		System.out.println(f.delete());//判断此文件是否是一个目录
//		System.out.println(f.canExecute());//判断文件是否可执行
//		System.out.println(f.exists());//判断文件是否存在
		
		//listRoots方法
		File[] files = File.listRoots();//返回系统的所有盘符
		for(File k : files){
			System.out.println(k);
		}
		//listFiles方法
		File f2 = new File("D:\\");
		File[] s = f2.listFiles();//返回D盘下的所有文件和目录
		System.out.println(s.length);
		for(File str : s){
			System.out.println(str.getPath() + "-->" +str.getName());
		}
	}
}</strong></span>


递归:获取指定目录文件夹或文件,包含子目录中的内容(列出指定目录下的所有文件)
 *
 * 因目录中还有目录,只要使用同一个列出目录功能的函数完成即可
 * 当列出的功能还是目录时,可以再次此奥用本功能。也就是自身调用自身的函数
 * 这种表现形式称为递归

<span style="font-size:18px;"><strong>递归练习:将文件夹中的某种类型数据存储到另一个文件中
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class Demo {
	
	public static void main(String[] args) throws IOException {
		
		File f = new File("G:\\shipin");
		List<File> al = new ArrayList<File>();//建立集合
		show(f,al);//调用方法
		BufferedWriter bufw = new BufferedWriter(new FileWriter("G:\\ab.txt"));//设置存储位置
		
			for(File k : al){
				String path = k.getAbsolutePath();
				bufw.write(path);//将过滤的文件写入指定的文件中
				bufw.newLine();//换行
				bufw.flush();//刷新
			}
			bufw.close();
	}
	public static void show(File dir,List<File> list){
		File[] files = dir.listFiles();//获取目录下的所有文件
		for(File file : files){
			if(file.isDirectory()){//判断是否是文件夹
				show(file,list);//再次调用自身方法
			}else{
				if(file.getName().endsWith(".flv")){//过滤文件
					list.add(file);
				}
			}
		}
	}
}</strong></span>


------------------------------------------------------------------------------------
Properties是HashTable的子类,具有Map集合的特点,并且里面存储的键值对都是字符串
 * 是集合中和IO技术相结合的集合容器;
 * 该对象的特点:可以用键值对形式的配置文件
Properties练习1:

 

<span style="font-size:18px;"><strong>import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
import java.util.Set;
/*
 * 如何将流中的数据存储到集合中:
 * 1、用一个流和文件关联a.txt
 * 2、读取一行数据,将该行数据用=号进行分割
 * 3、等号左边为键,右边为为值,存入到Properties中即可
 */
public class Demo {
	
	public static void main(String[] args) throws IOException {
		//转化流
		BufferedReader bufw = new BufferedReader(new FileReader("a.txt"));
				
			String line = null;
			Properties prop = new Properties();//新建集合
			
			while((line = bufw.readLine()) != null){
				String[] arr = line.split("=");//以=号分割
				prop.setProperty(arr[0],arr[1]);//将数据添加到集合中
//				System.out.println(arr[0] + "--" + arr[1]);
			}
			bufw.close();//关闭流
			System.out.println(prop);
			Set<String> name = prop.stringPropertyNames();//将姓名存取到集合
			for(String k : name){//获取所有的姓名
				System.out.println(k + ":" + prop.getProperty(k));
			}
	}
}
Properties:练习2
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
/*
 * 用于记录应用程序运行的次数,如果使用 次数已到,那么给出注册提示
 * 
 * 程序结束时,该技术器的值也存在;
 * 下次程序启动时,会先加载计数器的值并加1后重新存储起来
 * 所以要建立一个配置文件,用于记录该文件的使用次数
 * 
 * 该配置文件使用键值对形式,便于阅读,并操作数据
 * 数据时以文件形式存储,使用IO技术
 * 那么map +IO = properties
 * 配置文件可以实现应用程序的数据共享
 */

public class Demo {

	public static void main(String[] args) throws IOException {
		Properties prop = new Properties();
		
		File file = new File("coun.ini");
			if(!file.exists()){
				file.createNewFile();
			}
		FileInputStream fis = new FileInputStream(file);
		
		prop.load(fis);
		int count = 0;
		String value = prop.getProperty("time");
		if(value != null){
			count = Integer.parseInt(value);
			if(count >= 5){
				System.out.println("次数已到,请充值");
				return;
			}
		}
			count++;
			prop.setProperty("time", count+"");
			FileOutputStream fos = new FileOutputStream(file);
			prop.store(fos, "");
			fos.close();
			fis.close();
	}
}</strong></span>

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

和并流:将几个流放入一个文件中;


<span style="font-size:18px;"><strong>举例:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;
import javax.sound.midi.Sequence;
public class Demo {
	
	public static void main(String[] args) throws IOException {
		
		Vector<FileInputStream> v = new Vector<FileInputStream>();
			v.add(new FileInputStream("G:\\a.txt"));
			v.add(new FileInputStream("G:\\b.txt"));
			v.add(new FileInputStream("G:\\c.txt"));
			
		Enumeration<FileInputStream> en = v.elements();
		SequenceInputStream sis = new SequenceInputStream(en);
		FileOutputStream fos = new FileOutputStream("G:\\d.txt");
			
			byte[] buf = new byte[1024];
			int len = 0;
			while((len = sis.read(buf)) != -1){
				fos.write(buf,0,len);
			}
			fos.close();
			sis.close();
	}
}</strong></span>


合并流:将几个流放入一个文件中;

 

<span style="font-size:18px;"><strong>举例:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;
import javax.sound.midi.Sequence;
public class Demo {
	
	public static void main(String[] args) throws IOException {
		
		Vector<FileInputStream> v = new Vector<FileInputStream>();
			v.add(new FileInputStream("G:\\a.txt"));
			v.add(new FileInputStream("G:\\b.txt"));
			v.add(new FileInputStream("G:\\c.txt"));
			
		Enumeration<FileInputStream> en = v.elements();
		SequenceInputStream sis = new SequenceInputStream(en);
		FileOutputStream fos = new FileOutputStream("G:\\d.txt");
			
			byte[] buf = new byte[1024];
			int len = 0;
			while((len = sis.read(buf)) != -1){
				fos.write(buf,0,len);
			}
			fos.close();
			sis.close();
	}
}</strong></span>

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


对象的序列化:
将内存的对象存储到硬盘上 (对象的持久化存储)
 * ObjectInputStream 和 ObjectOutputStream是成对出现的
 * oos写入文件的数据只有ois能读出来;a
代码举例:


<span style="font-size:18px;"><strong>public class Person implements Serializable{//实现序列化接口
	private String name;
	private int age;//被tranaient修饰的变量不能被序列化
	static String country = "cn";//静态变量不能被序列化
	public Person(String name, int age){
		this.name = name;
		this.age = age;
	}
	public String toString(){
		return name + "::" + age;
	}
}
public class Demo {

	public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
		writeObj();
		readObj();
	}
	public static void readObj() throws FileNotFoundException, IOException, ClassNotFoundException{
		//读取指定文件夹的数据
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("G:\\oos.txt"));
			Person p = (Person)ois.readObject();
			System.out.println(p);
			ois.close();
	}
	public static void writeObj() throws FileNotFoundException, IOException{
		//将数据存储到指定文件中
		ObjectOutputStream oos = new ObjectOutputStream(
				new FileOutputStream("G:\\oos.txt"));
		//写入对象
		oos.writeObject(new Person("Lili",20));
		oos.close();
	}
}</strong></span>


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 

<span style="font-size:18px;"><strong>字符流的编码举例:
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
public class Demo {
	
	public static void main(String[] args) throws IOException {
		//调用方法
		writeShow();
		readShow();
	}
	
	public static void readShow() throws IOException{
		//以指定的编码格式读取指定文件里的数据
		InputStreamReader isr = new InputStreamReader(new FileInputStream("G:\\utf.txt"),"GBK");
			char[] buf = new char[1024];
			int len = 0;
			while((len = isr.read(buf)) != -1){
				String str = new String(buf,0,len);
				System.out.println(str);
			}
			isr.close();	
	}
	public static void writeShow() throws IOException{
		//以指定的编码格式将数据写入指定的文件
		OutputStreamWriter osr = new OutputStreamWriter(new FileOutputStream("G:\\utf.txt"),"utf-8");
		osr.write("你好,欢迎光临");//写入数据
		osr.close();
	}
}
------------------------------------------------------------------------------
字节编码:
 编码:字符串变成字节数组;
 解码:字节数组变成字符串
 * String-->byte[];    str.getBytes(charsetName);
 * 
 * byte[]-->String;   new String(byte[],charsetName);

练习代码:
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Array;
import java.util.Arrays;
public class Demo {

	public static void main(String[] args) throws UnsupportedEncodingException {
		//编码和解码同一种格式
		String s = "欢迎光临";
		byte[] b = s.getBytes("gbk");//编码
		String s1 = new String(b,"gbk");//解码
		System.out.println(s1);
		
		String str = "你好";
		byte[] by = str.getBytes("utf-8");//utf-8编码
		String st = new String(by,"ISO8859-1");//解用ISO8859-1解码,出现乱码
		byte[] by1 = st.getBytes("ISO8859-1");//继续用ISO8859-1编码
		String str1 = new String(by1,"utf-8");//再用utf-8解码
		System.out.println(str1);
	}
}</strong></span>

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


IO流的综合练习:
* 有个五个学生,每个学生有三门成绩;
 * 从键盘输入以上数据(包括姓名和三门成绩)
 * 输入的格式:如 :zhangsan,30,40,60计算出总成绩
 * 并把学生的信息和计算出的分数按高低顺序存放在磁盘文件中"stud.txt"中
 *
 * 思考:
 * 1、通过键盘录入一行数据,将该行中的信息取出并封装成对象
 * 学生很多。需用存储,用到集合,欧诺更是对学生进行排序
 * 3、将集合的信息写入到一个文件
代码如下:

 

<span style="font-size:18px;"><strong>public class Student implements Comparable<Student>{
	
	private String name;
	private int cn,ma,en;
	private int sum;
	public Student() {}
	public Student(String name, int cn, int ma, int en) {
		super();
		this.name = name;
		this.cn = cn;
		this.ma = ma;
		this.en = en;
		sum = en+ma+cn;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getCn() {
		return cn;
	}
	public void setCn(int cn) {
		this.cn = cn;
	}
	public int getMa() {
		return ma;
	}
	public void setMa(int ma) {
		this.ma = ma;
	}
	public int getEn() {
		return en;
	}
	public void setEn(int en) {
		this.en = en;
	}
	public int getSum() {
		return sum;
	}
	public void setSum(int sum) {
		this.sum = sum;
	}
	public String toString() {
		return "Student [cn=" + cn + ", en=" + en + ", ma=" + ma + ", name="
				+ name + ", sum=" + sum + "]";
	}
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + cn;
		result = prime * result + en;
		result = prime * result + ma;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result + sum;
		return result;
	}
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (cn != other.cn)
			return false;
		if (en != other.en)
			return false;
		if (ma != other.ma)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (sum != other.sum)
			return false;
		return true;
	}
	public int compareTo(Student s) {
		int num = new Integer(this.sum).compareTo(new Integer(s.sum));
		if(num == 0){
			return this.name.compareTo(s.name);
		}
			return num;		
	}
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
public class StudentTools {

	public static Set<Student> getStudent() throws IOException{
		getStudent(null);//没有比较器的方法
		return null;
	}
	public static Set<Student> getStudent(Comparator<Student> cmp) throws IOException{
		BufferedReader bufr = new BufferedReader(
				new InputStreamReader(System.in));
		String line = null;
		Set<Student> stus = null;
		if(cmp == null){//判断是否调用有比较器的方法
			stus = new TreeSet<Student>();
		}else{
			stus = new TreeSet<Student>(cmp); 
		}
		while((line = bufr.readLine()) != null){
			if("over".equals(line)){//设置结束命令
				break;
			}
			String[] info = line.split(",");//以,为分隔符,切割
			Student stu = new Student(info[0],Integer.parseInt(info[1]),
											Integer.parseInt(info[2]),
											Integer.parseInt(info[3]));
			
			stus.add(stu);//将键盘输入的数据添加到集合
		}
		bufr.close();
		return stus;
	}
	
	public static void writeFile(Set<Student> stus) throws IOException{
		BufferedWriter bufw = new BufferedWriter(new FileWriter("G:\\stuinfo.txt"));
		for(Student k : stus){//遍历结合取出所有的数据
			bufw.write(k.getName()+'\t');//将姓名写入文件
			bufw.write(k.getSum()+"");//加""目的变成字符串的形式
			bufw.newLine();//换行
			bufw.flush();//刷新
			System.out.println(k.toString()+"-->"+k.getSum());
		}
		bufw.close();
	}
}
import java.io.IOException;
import java.util.Collections;
import java.util.Comparator;
import java.util.Set;	
public class Demo {

	public static void main(String[] args) throws IOException {
		
		//设置比较器的强转方法
		Comparator<Student> cmp = Collections.reverseOrder();
		//调用将输入的数据放入集合的方法
		Set<Student> stu = StudentTools.getStudent(cmp);
		//将集合的数据写入指定文件
		StudentTools.writeFile(stu);
	}
}</strong></span>


 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值