您的位置:首页 > 编程语言 > Java开发

学习实战完全笔记--JavaSE----流与文件(Streams and Files)

2015-04-10 13:49 489 查看
[b] 1.流与文件的定义[b][b] :一个对象,可以从中读入一组字节,就叫输入流;一个对象,可以从中输出一组字节,就叫输出流。[/b]

( In the Java API, an object from which we can read a sequence of bytes is called an input stream. An object to which we can write a sequence of bytes is called an output stream.)[/b][/b]

[b] 2.java.io中的类都将相对路径以用户工作目录开始,如下面代码输出的就是笔者的工作目录:[b][b] D:\eclipse\workspace_jse_1\JSE_StudyNote_1[/b]



[/b][/b]

String userDir=System.getProperty("user.dir");
        System.out.println(userDir)


3.下面的代码完整展示了将对象信息存入本地文本文件(Windows平台下 .bat ),然后将其读取出来,展示在命令行中。


[b] 下面代码一共包括三个类:[/b]



1. Employee.java
  2. EmployeeTextFile.java
  3. EmployeeTextFileTest.java


</pre><p></p><p><span style="font-size:18px;"><strong>较好的体现了Java面向对象的思想,以及封装与装饰的特性,在笔者的电脑上亲测可用。</strong></span></p><p></p><span style="font-size:18px;"><strong><1>新建一个员工类</strong></span><pre name="code" class="java"><span style="font-size:18px;"><strong>
import java.util.Date;
import java.util.GregorianCalendar;
/**
 * 流与文件:本程序以一个员工记录表演示了以文本格式存储对象的例子
 * (原文参考:《Java核心技术》第九版)
 * @author lijtaos
 * @version 1.0 2015-04-10
 * @Email lijtaos@sina.com
 *
 */
/**
 * 每条记录单独占一行,每个记录的实例字段之间用 -|- 作为分隔符(假定我们的字段值没有这种符号)
 * */
/*这是一个员工类*/
public class Employee
{
    //-----------------员工类的私有字段--------------------
    private String name;
    private double salary;
    private Date hireDate;
    //无参数构造器
    public Employee(){}
    //包含参数构造器
    public Employee(String name,double salary,int year,int month,int day)
    {
        
        this.name=name;
        this.salary=salary;
        //GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。
        // 在系统中month是从0开始的,故而传入的参数需要-1
        GregorianCalendar calendar=new GregorianCalendar(year,month-1,day);
        hireDate=calendar.getTime();
    }
    //私有字段的getters
    public String getName()
    {
        return name;
    }
    public double getSalary()
    {
        return salary;
    }
    public Date getHireDate()
    {
        return hireDate;
    }
    //涨工资的方法:参数是百分比
    public void raiseSalary(int byPersent)
    {
        double raise=salary*byPersent/100;
        salary+=raise;
    }
    //重写toString方法
    @Override
    public String toString()
    {
        return " \t 姓名:"+name+" \t 工资:"+salary+" \t 入职时间:"+hireDate+" \t ";
    }
}</strong></span>

<2>提供了四个方法,对员工信息进行存取操作

<span style="font-size:18px;"><strong>
/**
 * 流与文件:本程序以一个员工记录表演示了以文本格式存储对象的例子
 * (原文参考:《Java核心技术》第九版)
 * @author lijtaos
 * @version 1.0 2015-04-10
 * @Email lijtaos@sina.com
 * 
 */
import java.io.PrintWriter;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Scanner;
public class EmployeeTextFile 
{
	/*
	 * 把数组里的员工对象全部输出到输出流
	 * */
	public static void writeData(Employee[] employees,PrintWriter out)
	{
		//先把员工的数量写入文件第一行
		out.println(employees.length);
		for(Employee emp : employees)
		{
			writeEmployee(emp,out);
		}
			
	}
	/*
	 * 返回一个员工对象数组
	 * */
	public static Employee[] readData(Scanner in)
	{
		//获取数组长度
		int n=in.nextInt();
		System.out.println(" \t 员工总数:"+n);
		in.nextLine();
		Employee[] employees=new Employee
;
		for(int i=0;i<n;i++)
		{
			employees[i]=readEmployee(in);
		}
		return employees;
	}
	/*把员工对象信息写入PrintWriter
	 * @param out:PrintWriter的对象
	 * @param employee:Employee的对象
	 * */
	public static void writeEmployee(Employee employee,PrintWriter out)
	{
		GregorianCalendar calendar=new GregorianCalendar();
		//Sets this Calendar's time with the given Date. 
		calendar.setTime(employee.getHireDate());
		//在输出流中格式化输出对象信息
		out.println(employee.getName()+"-|-"+employee.getSalary()+"-|-"+
				calendar.get(Calendar.YEAR)+
				"-|-"+calendar.get(Calendar.MONTH)+
				"-|-"+calendar.get(Calendar.DAY_OF_MONTH));
	}
	/*
	 * 读取Employee对象到Scanner(一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器)
	 * @param in Scanner
	 * @return Employee
	 * */
	public static Employee readEmployee(Scanner in)
	{
		//读取一个对象的信息
		String line=in.nextLine();
		//根据指定的正则表达式把输入的对象信息字符串存入数组
		String[] takens=line.split("\\-\\|\\-");
		String name=takens[0];
		double salary=Double.parseDouble(takens[1]);
		int year=Integer.parseInt(takens[2]);
		int month=Integer.parseInt(takens[3]);
		int day=Integer.parseInt(takens[4]);
		return new Employee(name,salary,year,month,day);
	}
}</strong></span>
[b]<3>测试了对员工信息进行存取操作的类[/b]

<span style="font-size:18px;"><strong>import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;

/**
 * 测试类
 */
public class EmployeeTextFileTest {

	public static void main(String[] args) throws IOException
	{
		//员工对象数组
		Employee[] employees=new Employee[5];
		employees[0]=new Employee("刘彻",77000,2010,12,31);
		employees[1]=new Employee("李渊",8000,2015,2,11);
		employees[2]=new Employee("赵匡胤",6900,2000,12,31);
		employees[3]=new Employee("忽必烈",6500,2011,10,30);
		employees[4]=new Employee("朱棣",7000,2010,02,01);
		//AutoCloseable接口的try语句:需要jdk1.7及以上的编译环境
		//try(PrintWriter out=new PrintWriter("employees.dat","UTF-8"))
		PrintWriter out=null;
		Scanner in=null;
		try
		{
			
			//把所有的员工记录保存到employees.dat文件内
			out=new PrintWriter("employees.dat","UTF-8");
			EmployeeTextFile.writeData(employees, out);
			//如果没有调用flush()方法(或close()方法),缓冲区的内容将无法被读取,下面从文件读取员工记录的方法将会出错
			//flush()方法:刷新此输出流并强制写出所有缓冲的输出字符。这将通知所有 reader,告知它们管道中的字符处于等待中。 
			out.flush();
			//从文件读取员工记录,然后保存到新的员工数组里并遍历此数组
			in=new Scanner(new FileInputStream("employees.dat"),"UTF-8");
			Employee[] newEmployees=EmployeeTextFile.readData(in);
			for (Employee employee : newEmployees)
			{
				System.out.println(employee);
			}
		}	
		//释放资源
		finally
		{
			//防止抛出 java.lang.NullPointerException
			if(out!=null)
			{
				out.close();
			}
			if(in!=null)
			{
				in.close();
			}
		}
		/*
		try
		{
			//从文件读取员工记录,然后保存到新的员工数组里并遍历此数组
			in=new Scanner(new FileInputStream("employees.dat"),"UTF-8");
			Employee[] newEmployees=EmployeeTextFile.readData(in);
			for (Employee employee : newEmployees)
			{
				System.out.println(employee);
			}
		}
		if(in!=null)
			{
				in.close();
			}
		*/

		
	}

}
</strong></span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐