</p>接下来又是我遇到的一个例子,这个例子也很明显的反应出缓冲区的问题。
9 E3 F+ f/ X1 s+ v- {5 X5 |; b) rimport java.io.BufferedReader;8 u2 O( i* S# m S1 ^
import java.io.FileReader;
$ K% \. D% s- d: w- vimport java.io.FileWriter;' ?2 s0 i) n) h; [/ ]4 v
import java.io.IOException;
" @ J* j Y) p5 Y# _import java.io.PrintWriter;
0 R# A# t/ V5 Z: k6 y. |3 w8 rimport java.util.Calendar;
1 \; k+ ~0 T9 d# [# Uimport java.util.Date;4 w! m" R |% c7 A2 y
import java.util.GregorianCalendar;2 ^# n" c% U! S/ j! T
import java.util.Scanner;
! w6 N/ O. y* G" x9 p6 yimport java.util.StringTokenizer;
' v8 j q2 G7 W" \/ e9 w" J4 Hpublic class StringTokenizerTest {
; w7 J1 f6 y- V* M: J9 R$ |0 L5 _ public static void main(String[] args) {
" X" B4 n/ y; M' F/ O. |, f/ j Employee[] e = new Employee[3];# k4 z, F6 W: f0 S8 F
e[0] = new Employee("Carl Cracker", 75000, 1987, 12, 15);
~: m' B! d5 ^4 z6 | e[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);. p+ h5 ^* [9 O( V# r
e[2] = new Employee("Tony Tester", 40000, 1990, 3, 15);
9 `2 y, p P1 M3 S) O1 i5 p7 i4 U try {
- I J2 r% V h; k/ W PrintWriter out = new PrintWriter(new FileWriter("1.txt"));0 B: m3 {8 C% q' v8 t, p3 Q3 o
writeData(e, out);" I( }0 t5 `& Y, B' s
// out.close();**********************************************************************
5 s2 V! r+ S) ~( F } catch (Exception e1) {1 U. h; B" M; R4 |
e1.printStackTrace();
/ y4 P! P! w" ]# e }! s2 E; M4 ~* b3 s
System.out.println("*******是否要读取数据?********");
: h; g* ~3 L, i$ i Scanner in1 = new Scanner(System.in);6 z J& m1 g/ |' Y0 p# u9 [9 A
String yes = in1.nextLine();
+ u" @+ c2 _2 M if (yes.equalsIgnoreCase("YES")) {. r6 _6 `: R! ]: y
try {
* C! L' T2 O+ d7 O- f BufferedReader in = new BufferedReader(new FileReader("1.txt"));
" T7 `2 X# u" Q, b Employee[] result = readData(in);+ K. ~3 f/ \$ J) M% |2 p k: U
for (int i = 0; i < result.length; i++)
& _* e/ z4 k0 `" P _: G1 B9 A H ` System.out.println(result);, h3 m- a$ Y* M8 {' q# b6 ?
in.close();; |7 L! {$ Z% c: F) z) R6 }: ~" H
} catch (Exception e2) {
! R4 i3 V$ I, } e2.printStackTrace();
) j6 a$ R2 K/ \7 i& c% R' `; D }
7 N0 u( n4 L/ p }
3 a# O" g3 G# o( `- z& t9 ~: W, ?. b }
# a4 i/ ?0 p! a) c/ s9 ? public static Employee[] readData(BufferedReader in) throws IOException {
2 u# P$ Y) F9 I9 e! V' L" } int length = Integer.parseInt(in.readLine());
% z: s6 [" p, ^ Employee[] e = new Employee[length];
2 q9 x/ T0 Q2 N3 i% j for (int i = 0; i < length; i++) {/ ^, b; n5 r5 h: w) l
String line = in.readLine();
$ ~! u0 `0 d [$ G StringTokenizer token = new StringTokenizer(line, "|");
+ R2 E9 e9 N* N" `/ ?7 }. A String name = token.nextToken();; d* o2 y7 v& i
double salary = Double.parseDouble(token.nextToken());$ n) t; U$ M5 x8 s: A; w
int year = Integer.parseInt(token.nextToken());# O o( Z, Q: Q9 j% W
int month = Integer.parseInt(token.nextToken());
9 B4 S$ F0 z5 d. ?+ s% l1 l3 { int day = Integer.parseInt(token.nextToken());+ f4 s2 b# n8 H2 Y4 A
e = new Employee(name, salary, year, month, day);
& O: D2 J4 |- K }' M( J. A/ l' A5 u+ N
return e;. Y2 f0 o( o* P% `. l, h
}
# @' u; \: w0 _) i; s* N public static void writeData(Employee[] e, PrintWriter out) {
( \! ?9 G, e/ ~" ? out.println(e.length);. t6 U2 n2 ]# A: z( a8 k# u8 O/ l; {
for (int i = 0; i < e.length; i++) {
! N# u0 R m+ b d) ~/ c" m5 y String name = e.getName();0 ^& l- k4 O; J6 u
double salary = e.getSalary();3 L& f- `' T0 T* c
Date date = e.getHireDay();
1 T% E& z- U- X9 ~ Calendar c = new GregorianCalendar();
& C# Y; T) X1 \! b c.setTime(date);8 c6 r$ e9 d6 K3 n( O
int year = c.get(Calendar.YEAR);! h( g% q- B% w! @
int month = c.get(Calendar.MONTH) + 1;
/ \7 f. W& D, Q1 Q9 J, c int day = c.get(Calendar.DAY_OF_MONTH);% ~ y2 d0 f- S2 p5 w
out.println(name + "|" + salary + "|" + year + "|" + month + "|"
+ z' s6 l P4 I+ o! g K) Y+ [ + day);
0 @6 Y( y, n1 H9 _7 S }* T! }/ N' x0 O. y# `4 _
System.out.println("********写入数据完毕********"); E. G' {) p, z# U6 J, x2 y
}5 l. G6 r7 ?3 m
}5 e7 G l! a6 P
class Employee {
$ n- |1 m. E- n6 j public Employee(String n, double s, int year, int month, int day) {& B: X7 _+ b* D
name = n;( [/ T; j4 ?4 z+ c8 y8 h7 _+ ?
salary = s;
* t, T* y; Y" O5 V) e) j: j GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);
$ a) z' i; B$ k6 Q2 w hireDay = calendar.getTime();
\' j4 d" E$ y }
: x ]+ U+ z- _6 J public String getName() {4 c( ^8 G5 D- x1 g2 F, }) n( k
return name;
+ n. p9 M, C9 [) j+ X0 g }9 W7 m4 g4 l" K6 X2 o
public double getSalary() { b8 k% q7 }, P" y! ]
return salary;8 u) m% c T" u t; m& \0 R5 m( k! D
}
/ b; V8 a4 r3 A/ R4 J public Date getHireDay() {
0 M. p, e3 o' X' Q( O$ C return hireDay;, _& c9 d0 m! @$ j
}
, U9 h$ T# c& ^% z public void raiseSalary(double byPercent) {9 G$ [( P m+ u$ ~+ m
double raise = salary * byPercent / 100;
/ v b* T7 Q) t- o. c# w salary += raise;
& }" r5 W* n* g8 O. l }
2 j( @/ K4 z6 ?0 z! x! K; X public String toString() {
0 A3 w& V4 X V P return getClass().getName() + "[name=" + name + ",salary=" + salary
" @/ f" e, A, g! }+ k" X* k! S' L" p( C) Q + ",hireDay=" + hireDay + "]";
; I b- J$ P' D. ?5 ^( N0 x }, _5 I/ k, t# p5 {4 s7 l
private String name;
8 t. Q' H' u% R1 P7 ]( E S private double salary;
' [% h1 h" F! n7 ~ private Date hireDay;, M/ u; X- l2 \* k0 {
}! k8 w5 N+ T" [- A5 {4 o; L3 ~
结果是没有向文件写入任何数据,为什么呢?2 n' D1 M2 f4 p4 m
唯一的错误就在main方法中没有调用out.close(),把数据从缓冲区刷新到文件。因此用完资源即时关闭是很重要的。 |