流与文件
InputStream
Abstract int read()
OutputStream
Abstract void write(int b)
输入和输出流的层次结构
DataInputStream和DataOutputStream能够读写所有的基本java类型,InputStream和OutputStream仅能读写单个字节和字节数组。ZipOutputStream和ZipInputStream读写ZIP格式的压缩文件。
对于Unicode文本,可以使用Reader和Writer中派生出来的类。
InputStream、OutputStream、Reader、Writer都实现了Closeable接口,OutputStream、Writer实现Flushable接口。Writer实现Appendable接口。
Appendable append(CharSequence csq) throws IOException;
在Appendable对象后追加csq中所有代码单元,返回当前对象。
Appendable append(char c) throws IOException;
FileInputStream、FileOutputStream、能够把输入输出流与磁盘文件关联起来。只能读取字节。
DataOutput接口和DataInput接口声明了所有读写Java基本类型的方法。
RandomAccessFile流类能够在文件的任何位置查找或写入数据。RandomAccessFile实现了DataOutput接口和DataInput接口。
InputStreamReader类可将特殊字符编码方案的输入流转换成Unicode字符,OutputStreamWriter类能将Unicode字符流转换成特殊字符编码方案的字节流。
public InputStreamReader(InputStream in, String charsetName)
Charset cset = Charset.forName("ISO-8859-1");
Set<String, Charset> charsets = Charset.availableCharsets();
for (String name : charsets.keySet())
System.out.println(name);
将Unicode字符串进行编码
String str = . . .;
ByteBuffer buffer = cset.encode(str);
byte[] bytes = buffer.array();
对一个字节序列解码,需要一个字节缓冲区。
byte[] bytes = . . .;
ByteBuffer bbuf = ByteBuffer.wrap(bytes, offset, length);
CharBuffer cbuf = cset.decode(bbuf);
String str = cbuf.toString();
java.nio.charset.Charset 1.4
ByteBuffer encode(String str)
encodes the given string into a sequence of bytes.将给定字符串编码成一个字节序列。
文本输出PrintWriter以文本格式打印字符串和数值,但没有定义目的地。一个PrintWriter必须与一个Writer结合使用。
PrintWriter out = new PrintWriter(new FileWriter("employ.txt"));
或者
PrintWriter out = new PrintWriter(new FileOutputStream("employ.txt"));
写入PrintWriter,可以使用System.out的print和println方法。
PrintWriter out = new PrintWriter(new FileWriter("employee.txt"), true); // autoflush自动刷新
二进制格式写入数据时,使用DataOutputStream
文本格式写入数据时,使用PrintWriter
文本格式读取数据时,使用BufferedReader
BufferedReader in = new BufferedReader(new FileReader("employee.txt"));
FileReader类已经把字节转化为Unicode字符。对于其他输入源,需要使用InputStreamReader,与PrintWriter不同,InputStreamReader没有包含自动弥补字节与Unicode字符之间差别的方法。
BufferedReader in2 = new BufferedReader(new InputStreamReader(System.in));
BufferedReader in3 = new BufferedReader(new InputStreamReader(url.openStream()));
String line;
while ((line = in.readLine()) != null)
{
do something with line
}
Zip文件流读取
ZipInputStream zin = new ZipInputStream(new FileInputStream(zipname));
//通过将一个FileInputStream对象传给ZipInputStream
ZipEntry entry;
while ((entry = zin.getNextEntry()) != null)
{
analyze entry;
read the contents of zin;
zin.closeEntry();
}
zin.close();
或者
BufferedReader in = new BufferedReader(new InputStreamReader(zin));
String s;
while ((s = in.readLine()) != null)
do something with s;
Zip文件流写入
FileOutputStream fout = new FileOutputStream("test.zip");
ZipOutputStream zout = new ZipOutputStream(fout);
//把FileOutputStream传递给ZipOutputStream
for all files
{
ZipEntry ze = new ZipEntry(filename);
zout.putNextEntry(ze);
send data to zout;
zout.closeEntry();
}
zout.close();
StringBuilder类
StringBuilder避免每次重新分配空间,它管理着一个可以根据需求增长或缩短的字符数组char[]
writeFixedString和readFixedString读写指定长度的Unicode字符串。
对象流
存储对象
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("employee.dat"));
Employee harry = new Employee("Harry Hacker", 50000, 1989, 10, 1);
out.writeObject(harry);
读取对象
ObjectInputStream in = new ObjectInputStream(new FileInputStream("employee.dat"));
Employee e1 = (Employee) in.readObject();
对于任意需要在对象流中存储和恢复的类,必须实现Serializable接口
class Employee implements Serializable { . . . }
对象序列化使用一种特殊的文本格式来存储对象。