Core Java学习笔记 流与文件

Posted on 2009-07-19 16:23 eric_xu 阅读(384) 评论(0)  编辑  收藏 所属分类: Java

流与文件

InputStream

    Abstract int read()

OutputStream

    Abstract void write(int b)

输入和输出流的层次结构


DataInputStreamDataOutputStream能够读写所有的基本java类型,InputStreamOutputStream仅能读写单个字节和字节数组。ZipOutputStreamZipInputStream读写ZIP格式的压缩文件。

对于Unicode文本,可以使用ReaderWriter中派生出来的类。

InputStreamOutputStreamReaderWriter都实现了Closeable接口,OutputStreamWriter实现Flushable接口。Writer实现Appendable接口。

Appendable append(CharSequence csq) throws IOException;

Appendable对象后追加csq中所有代码单元,返回当前对象。

Appendable append(char c) throws IOException;

 

FileInputStreamFileOutputStream、能够把输入输出流与磁盘文件关联起来。只能读取字节。

 

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.outprintprintln方法。

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[]

 

writeFixedStringreadFixedString读写指定长度的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 { . . . }

对象序列化使用一种特殊的文本格式来存储对象。


只有注册用户登录后才能发表评论。


网站导航:
 

posts - 37, comments - 5, trackbacks - 0, articles - 0

Copyright © eric_xu