来自:亿淘城_减肥榜 的个人笔记
谢谢你的支持(*^__^*) 嘻嘻„„
Java I/O原理
→基本概念:
I/O(Input/Output) 数据源(Data Source) 数据宿(Data Sink)
→Java中把不同的数据源与程序间的数据传输都抽象表述为“流”(Stream),java.io包中定义了多种I/O流类型实现数据I/O功能。 →I/O流分类:
输入流(Input Stream)和输出流(Output Stream) 节点流(Node Stream)和处理流(Processing Stream) 字符流(Character Stream)和字节流(Byte Stream) # 输入流(Input Stream)和输出流(Output Stream)
1.输入流只能从中读取数据,而不能向其写数据;
2.输出流则只能向其写出数据,而不能从中读取数据; 3.特例:java.io.RandomAccessFile类。
# 节点流(Node Stream)和处理流(Processing Stream)
1.节点流直接连接到数据源
2.处理流是对一个已存在的流的连接和封装,通过所封装的刘的功能调用实现增强的数据读写功能,处理流并不直接连到数据源
# 字符流(Character Stream)和字节流(Byte Stream)
1.字节流以字节为单位进行数据传输,每次传送一个或多个字节。 2.字符流以字符为单位进行数据传输,每次传送一个或多个字符。
※ Java命名惯例:
凡是以InputStream 或OutputStream结尾的类型均为字节流,凡是以Reader或Writer 结尾的均为字符流。
InputStream
抽象类java.io.InputStream 是所有字节输入流类型的父类,该类中定义了以字节为单位读取数据的基本方法,并在其子类中进行了分化和实现。 ◆ 三个基本的 read方法: Int read()
Int read(byte[] buffer)
Int read(byte[] buffer,int offset,int length) ◆ 其它方法: Void close() Int available() Skip(long n)
Boolean markSupported() Void mark(int readlimit) Void reset()
FileInputStream ObjectInputStream PipedInputStream SequenceInputStream InputStream DataInputStream PushbackInputStream BufferedInputStream LineNumberInputStream FilterInputStream StringBufferInputStream ByteArrayInputStream OnputStream
Java.io.OutputStream 与java.io.InputStream对应,是所有字节输出流类型的抽象父类。
◆ 三个基本的 write方法: Int write ()
Int write (byte[] buffer)
Int write (byte[] buffer,int offset,int length) ◆ 其它方法: Void close() Void flush() FileOutputStream ObjectOutputStream OutputStream PipedOutputStream DataOutputStream FilterOutputStream PrintStream ByteArrayOutputStream BufferedOutputStream Reader 抽象类java.io.Reader是所有字符输入流类型的父类,其中声明了用于读取字符流的有关方法。
◆ 三个基本的 read方法: Int read()
Int read(byte[] buffer)
Int read(byte[] buffer,int offset,int length)
◆ 其它方法: Void close() Int available() Skip(long n)
Boolean markSupported() Void mark(int readlimit) Void reset() Writer
抽象类java.io.Writer是所有字符输出流类型的父类。 ◆ 五个基本的 write方法: Void write (int c)
Void write (char[] buffer)
Void write (char[] buffer,int offset,int length) Void write(String string)
Void write(String stirng ,int offset,int length) ◆ 其它方法: Void close() Void flush()
常用的I/O流类型(1)
FileInputSteam/FileOutputSteam FileInputStream用于读取本地文件中字节数据。 FileOutputStream用于将字节数据写出到文件。
FileReader/FileWriter FileReader用于以字符为单位读取文本文件。 FileWriter用于将字符数据写出到文本文件中。
BufferedReader/BufferedWriter BufferedReader用于缓冲读取字符。
BufferedWriter则提供字符的缓冲写出功能。 常用的I/O流类型(2) InputStreamReader
1.InputStreamReader可封装字节输入流并从中读取字节数据,然后将之
转换为字符。
2.转换时所使用的字符编码可以再构造方法中显示指定,也可以使用平
台的默认字符编码。其构造方法格式为:
Public InputStreamReader(InputStream in)
Public InputStreamReader(InputStream in,String enc)
OutputStreamWriter
与InputStreamReader对应,OutputStreamWriter可按照特定的字符编码
规则吧字符转化为字节写出到她所封装的字节输出流。
常用的I/O流类型(3) PrintStream
PrintStream在OutputSteam基础之上提供了增强的功能,即可以方便的
输出各种类型数据(而不仅限于byte型)的格式化表示形式。PrintSteam 的方法从不抛出IOException.
PrintWriter
PrintWriter提供了PrintStream的所有的打印方法,其方法也从不抛出
IOException.
与PrintSteam的区别:作为处理流使用时,PrintStream只能封装
OutputStream类型的字节流,而PrintWriter既可以封装OutputStream,还能够封装Writer类型字符输出流并增强器功能。
常用的I/O流类型(4)
DataInputStream/DataOutputStream
1. 二者分别实现了DataInput/DataOutput接口
2. DataInputStream能够以一种与机器无关的方式,直接从底层字节输入
流读取Java基本类型和String类型的数据,常用方法包括: Public DataInputStream(InputSteam in) Public final boolean readBoolean() Public final byte readByte() Public final char readChar()
Public final double readDouble() Public final float readFloat() Public final int readLong() Public final long readLong() Public final short readShort() Public final String readUTF()
3. DataOutputSteam 则能够直接将Java基本类型和 String类型数据写出
到其他的字节输出流。 常用的I/O流类型(5) CharArrayReader
CharArrayReader实现了一个可用作字符输入流的字符缓冲区。
CharArrayWriter
CharArrayWriter实现了一个可当作Writer使用的字符输出缓冲区。
I/O应用专题
→标准I/O重定向 (标 准输入重定向)
import java.io.*r; import java.util.*; public class SetInput { public static void main(String[] args) { try {
FileInputStream fis=new FileInputStream (\"source.txt\"); System.setIn(fis); int avg=0; int total=0; int num=0; int i;
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String s=br.readLine();
while((s!=null)&&(!s.equals(\"\"))&&(!s.equals(\"over\"))) {
i=Integer.parseInt(s); num++; total+=i;
avg=total/num; System.out.println(\"num=\"+num+\"\total=\"+total+\"\avg=\"+avg); s=br.readLine();}} catch(Exception e) {
System.err.println(\"time error:\"+new Date()); System.err.println(\"info:\"); e.printStackTrace(System.err); }}}
(标 准输出重定向)
public class SetOutput { public static void main(String[] args) { PrintStream ps=null; PrintStream ps_error=null; try { ps=new PrintStream(new FileOutputStream(\"output.txt\ System.setOut(ps); ps_error=new PrintStream(new FileOutputStream(\"errorLog.txt\ System.setErr(ps_error); int avg=0; int total=0; int num=0; int i; BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String s=br.readLine(); while((s!=null)&&(!s.equals(\"over\"))) { i=Integer.parseInt(s); num++; total+=i; avg=total/num; System.out.println(\"num=\"+num+\"\total=\"+total+\"\avg=\"+avg); s=br.readLine(); } } catch(Exception e)
}
}
{ System.err.println(\"time error:\"+new Date()); System.err.println(\"info:\"); e.printStackTrace(System.err); }finally{ try { ps.close(); ps_error.close(); } catch (Exception e) { System.err.println(\"time error:\"+new Date()); System.err.println(\"info:\"); e.printStackTrace(System.err); } }
→属性信息导入/导出
(属性信息导入)
import java.io.*;
import java.util.Properties; public class SaveProperty { public static void main(String[] args) { try { Properties pro=new Properties(); //Properties pro=System.getProperties(); pro.setProperty(\"name\ pro.setProperty(\"password\ pro.setProperty(\"sex\ FileOutputStream fw=new FileOutputStream(\"props.txt\"); pro.store(fw, \"loginfo\"); fw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
(属性信息导出)
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException; import java.util.Properties; public class LoadProperty { public static void main(String[] args) {
}
}
try { Properties ps=new Properties(); FileInputStream fr=new FileInputStream(\"props.txt\"); ps.load(fr); fr.close(); ps.list(System.out);
} catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
→随机存取文件 实现文件随机存取操作
→临时文件 使用临时文件
对象序列化
→基本概念 对象的持久性(object Persistance)
长久保存一个对象的状态并在需要时获取该对象的信息以重新构造一个状态完全相同的对象。
对象序列化(object Serialization)
通过写出对象的状态数据来记录一个对象。 对象序列化的主要任务
写出对象的状态信息,并遍历该对象对其他对象的应用,递归的序列化所有被应用到的其他对象,从而建立一个完整的序列化流
→实现对象序列化 要序列化一个对象,其所属的类必须实现以下两种接口之一: Java.io.serializable Java.io.Externalizable
→java.io.ObjectOutputSteam/ObjectInputSteam类分别提供了对象的序列化和反序化功能。 →对象序列化过程中的数据保护 标记性接口Serializable
在对象序列化过程中,其所属类的static属性和方法代码不会被序列化处理。
对于个别不希望被序列化的非static属性,可以在属性声明时使用transient关键字进行标明。