// 示例程序:将一个Employee记录数组存储成一个文本文件,其中每个记录都保存在单独的一行中,
// 而实例的域彼此之间使用分隔符分离开。
// 众所周知:
// 以二进制格式写出数据,需要使用DataOutputStream
// 以文本格式写出数据,需要使用PrintWriter
// 你可能认为存在着与DataOutputStream类似的类允许我们以文本格式读入数据,与此最接近的类是Scanner。
// 但在Java SE 5.0之前,处理文本输入的唯一方式就是通过BufferedReader类,它拥有一个readLine方法,
// 使得我们可以读入一行文本。你需要将带缓冲区的读入器与输入源组合起来:
// BufferedReader in = new BufferedReader(new FileReader("employee.txt"));
// readLine方法在没有输入时返回null。然而,一个典型的输入循环类似于这样:
// String line;
// while((line = in.readLine())!= null) {
// do something with line
// }
// 然而,BufferedReader没有任何用于读入数字的方法,建议使用Scanner来读入文本输入。
package com.example.io; import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Scanner; public class TextFileTest {
public static void main(String[] args) {
Employee[] staff = new Employee[3]; staff[0] = new Employee("Carl Cracker", 75000, 1987, 12, 15);
staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);
staff[2] = new Employee("Tony Tester", 40000, 1990, 3, 15); try {
PrintWriter out = new PrintWriter("employee.dat");
writeData(staff, out);
out.close(); Scanner in = new Scanner(new FileReader("employee.dat"));
Employee[] newStaff = readData(in);
in.close(); for (Employee e : newStaff) {
System.out.println(e);
}
} catch (IOException e) {
e.printStackTrace();
}
} private static void writeData(Employee[] employees, PrintWriter out) throws IOException {
out.println(employees.length);
for (Employee e : employees) {
e.writeData(out);
}
} private static Employee[] readData(Scanner in) {
int n = in.nextInt(); //读入数组长度
in.nextLine(); //消耗掉行尾的回车换行符 Employee[] employees = new Employee[n];
for (int i = 0; i < n; i++) {
employees[i] = new Employee();
employees[i].readData(in);
}
return employees;
} } class Employee { public Employee() {
} public Employee(String n, double s, int year, int month, int day) {
name = n;
salary = s;
GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);
hireDay = calendar.getTime();
} public String getName() {
return name;
} public double getSalary() {
return salary;
} public Date getHireDay() {
return hireDay;
} public void raiseSalary(double byPercent) {
double raise = salary * byPercent / 100;
salary += raise;
} @Override
public String toString() {
return "Employee{" + "name=" + name + ", salary=" + salary + ", hireDay=" + hireDay + '}';
} public void writeData(PrintWriter out) {
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(hireDay);
out.println(name + "|" + salary + "|" + calendar.get(Calendar.YEAR) + "|"
+ (calendar.get(Calendar.MONTH) + 1) + "|" + calendar.get(Calendar.DAY_OF_MONTH));
} public void readData(Scanner in) {
String line = in.nextLine();
String[] tokens = line.split("\\|");//竖线在正则表达式中具有特殊的含义,因此需要用\字符来转义,而这个\又需要用另一个\来转义
name = tokens[0];
salary = Double.parseDouble(tokens[1]);
int y = Integer.parseInt(tokens[2]);
int m = Integer.parseInt(tokens[3]);
int d = Integer.parseInt(tokens[4]);
GregorianCalendar calendar = new GregorianCalendar(y, m - 1, d);
hireDay = calendar.getTime();
}
private String name;
private double salary;
private Date hireDay;
}

PrintWriter 和 Scanner 类的组合使用的更多相关文章

  1. Java API ——Scanner类

    1.Scanner类概述 JDK5以后用于获取用户的键盘输入,一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器.Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空 ...

  2. Java面向对象 第2节 Scanner 类和格式化输出printf

    §Scanner 类 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入. 1.创建 Scanner 对象的基本语法:Scanner s = ...

  3. Scanner类

    Scanner类:用于获取用户的键盘输入 成员方法: public boolean hasNextXxx():判断是否某种类型的元素 public Xxx nextXxx():获取该元素 常用方法: ...

  4. java中scanner类的用法

    在Eclipse中编写程序时,如果我们的变量是需要手动输入的时候,我们就可以用到scanner类了. Scanner类,这是一个用于扫描输入文本的新的实用程序.由于任何数据都必须通过同一模式的捕获组检 ...

  5. c语言中的scanf在java中应该怎么表达,Scanner类。

    1 java是面向对象的语言 它没有像C语言中的scanf()函数,但是它的类库中有含有scanf功能的函数 2 java.util包下有Scanner类 Scanner类的功能与scanf类似 3 ...

  6. Java中Scanner类和BufferReader类之间的区别

    java.util.Scanner类是一个简单的文本扫描类,它可以解析基本数据类型和字符串.它本质上是使用正则表达式去读取不同的数据类型. Java.io.BufferedReader类为了能够高效的 ...

  7. Java用Scanner类获取用户输入

    用Java编写程序时,有些数据需要用户输入,这个时候需要调用java提供的Scanner类,这个类在包java.util下,比如求一个矩形的面积,简单的看一下用法: import java.util. ...

  8. Scanner类的使用

    Scanner类的使用 (接受键盘输入) java.util.Scanner是Java5的新特征,主要功能是简化文本扫描.这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java AP ...

  9. C++:类的组合

    在类中定义的数据成员一般都是基本数据类型或服复合数据类型.但是还可以根据需要使用 其他类的对象作为正在声明的数据成员.复杂的对象还可以有比较简单的对象一某种方式组合 而成,复杂对象和组成它的简单对象之 ...

随机推荐

  1. gcc -lpthread

    转自:http://www.cnblogs.com/suntp/p/6473751.html 如果用gcc编译使用了POSIX thread的程序时,通常需要加额外的选项,以便使用thread-saf ...

  2. HTML5实现摇一摇的功能(实测后)--转

    eviceMotionEvent(设备运动事件)返回设备有关于加速度和旋转的相关信息.加速度的数据将包含三个轴:x,y和z(示意如下图所 示,x轴横向贯穿手机屏幕或者笔记本键盘,y轴纵向贯穿手机屏幕或 ...

  3. tophat-fusion 鉴定融合基因

    tophat-fusion 是一款利用RNA_seq 数据鉴定融合基因的工具,官网链接如下: http://ccb.jhu.edu/software/tophat/fusion_index.shtml ...

  4. python numpy 下载地址

    网上找了半天,终于把要安装的资料找到了.其他的不怎么全,就自己再次总结一下写.         我自己安装的是python 2.7.所以以下的东东都是针对2.7的软件. numpy :http://s ...

  5. .net 图片上传

      /// <summary>      /// asp.net上传图片并生成缩略图      /// </summary>      /// <param name=& ...

  6. 限制 Text Field 输入的内容类型:只允许输入数字

    效果如下: ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController< ...

  7. SharePoint 2013 显示“以其他用户身份登录”菜单项

    最近在SharePoint 2013的网站上发现,没有看到有切换不同用户登录的入口,在SharePoint 2010中是存在这样的菜单项能够很方便的进行用户切换的,不知道为什么,SharePoint ...

  8. SharePoint PowerShell创建一个GUID

    在编辑SharePoint后台XML架构时常需要在ID属性上填写一个GUID (Globally Unique Identifiers 全局唯一标识的简称): 我们可以打开SharePoint管理控制 ...

  9. dedecms 自增数使用方法

    [field:global name=autoindex runphp="yes"]@me=@me+1;[/field:global] {dede:global name=item ...

  10. PHP框架 Yii framework 用yiic命令时提示“php.exe”不是内部或外部命令

    解决方案 yii/framework/yiic.bat,修改 if "%PHP_COMMAND%" == "" set PHP_COMMAND=php.exei ...