Java I/O

-- Start

数据从其他地方流入我们的程序叫做输入流, 数据从我们的程序中流到其他地方叫做输出流, 由此可见, 所谓的输入输出是相对我们的程序而言的. Java 用 InputStream 类来表示输入流, 用 OutputStream 类来表示输出流, 由于它们是以字节(byte)为单位处理的, 所以在处理 Unicode 编码的信息时很不方便, 因此, Java 还提供了处理双字节(char)为单位的字符输入流(Reader) 和字符输出流(Writer).

Java I/O 库为我们提供了丰富的流类, 但同时也增大了我们学习的难度, 事实上如果你理解了装饰模式(Decorator), 那么学习 I/O 是非常容易的, 因为大部分流是为了包装另一个流, 从而提供额外的功能. 下面是 Java I/O 库为我们提供的流.

InputStream

ByteArrayInputStream从 byte 数组中读取数据
FileInputStream从文件中读取数据
SequenceInputStream连接一系列InputStream, 如linux命令 cat a.txt b.txt, 可以一次读取多个文件
PipedInputStream连接一个PipedOutputStream, 通常一个线程读取数据, 另一个线程输出数据
ObjectInputStream用来还原一个序列化后的对象
BufferedInputStream包装另一个InputStream, 提供缓冲功能
PushbackInputStream包装另一个InputStream, 提供了预查看的功能
DataInputStream包装另一个InputStream, 以二进制形式读取Java原始数据类型和String


OutputStream

ByteArrayOutputStream将数据输出到byte数组
FileOutputStream将数据输出到文件
PipedOutputStream连接一个PipedInputStream, 通常一个线程读取数据, 另一个线程输出数据
ObjectOutputStream用来序列化对象
BufferedOutputStream包装另一个OutputStream, 提供缓冲功能
DataOutputStream包装另一个InputStream, 以二进制形式输出Java原始数据类型和String
PrintStream包装另一个OutputStream, 提供格式化的功能


Reader

CharArrayReader从 char 数组中读取数据
StringReader从String变量中读取数据
FileReader从文件中读取数据
BufferedReader包装另一个Reader, 提供缓冲功能
LineNumberReader包装另一个Reader, 提供缓冲和获取行号的功能
PushbackReader包装另一个Reader, 提供了预查看的功能
PipedReader连接一个PipedWriter, 通常一个线程读取数据, 另一个线程输出数据
InputStreamReader将字节输入流转换为字符输入流


Writer

CharArrayWriter将数据输出到 char 数组中
StringWriter将数据输出到 String 变量中
FileWriter将数据输出到文件中
BufferedWriter包装另一个Writer, 提供缓冲功能
PrintWriter包装另一个Writer, 提供了格式化的功能
PipedWriter连接一个PipedReader, 通常一个线程读取数据, 另一个线程输出数据
OutputStreamWriter将字节输出流转换为字符输出流


RandomAccessFile提供了随机读写文件的能力


通常, 系统与系统之间的交互方式之一是通过 FTP 发送文件, A 系统生成一个文件, 然后通过 FTP 发送给 B 系统, B 系统读取这个文件, 通常文件的格式有分隔符和定长两种, 下面的例子演示了如何输出和读取文件.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

public class Test {

	public static void main(String[] args) throws Exception {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Service s = new Service();

		
		// 从数据库中获取数据
		List<User> users = s.getUsersFromDB();

		
		// 输出数据到文件
		// PrintWriter 和 BufferedWriter 包装了 FileWriter, 提供了缓冲和格式化的功能
		PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("user.csv")));
		for (User user : users) {
			out.printf("%1$s,%2$tF%n", user.getName(), user.getBirthday()); // 分隔符文件
			// out.printf("%1$-20s%2$-10tF%n", user.getName(), user.getBirthday()); // 定长文件
		}
		out.close();

		
		// 从文件中读取数据, 然后重新构造成对象
		// BufferedReader 包装了 FileReader, 提供了缓冲功能
		users.clear();
		BufferedReader in = new BufferedReader(new FileReader("user.csv"));
		String line;
		while ((line = in.readLine()) != null) {
			String[] fields = line.split(",");
			users.add(new User(fields[0].trim(), sdf.parse(fields[1].trim())));
		}
		in.close();

	}

}

class Service {
	public List<User> getUsersFromDB() {
		Calendar birthday = Calendar.getInstance();
		List<User> users = new ArrayList<User>();

		//
		birthday.set(Calendar.YEAR, 1980);
		birthday.set(Calendar.MONTH, 0);
		birthday.set(Calendar.DAY_OF_MONTH, 1);
		User u1 = new User("ZhangSan", birthday.getTime());
		users.add(u1);

		//
		birthday.set(Calendar.YEAR, 1990);
		birthday.set(Calendar.MONTH, 5);
		birthday.set(Calendar.DAY_OF_MONTH, 4);
		User u2 = new User("LiSi", birthday.getTime());
		users.add(u2);

		//
		return users;
	}
}

class User {
	private String name;
	private Date birthday;

	public User() {
	}

	public User(String name, Date birthday) {
		this.name = name;
		this.birthday = birthday == null ? null : (Date) birthday.clone(); // 保护性 copy
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Date getBirthday() {
		return birthday == null ? null : (Date) birthday.clone(); // 保护性 copy
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday == null ? null : (Date) birthday.clone(); // 保护性copy
	}
}


--- 更多参见: Java 精萃
-- 声 明:转载请注明出处
-- Last Updated on 2012-06-06
-- Written by ShangBo on 2012-06-06
-- End
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值