JAVA 输入输出流 IO 总结

来源:互联网 发布:网站源码制作手机软件 编辑:程序博客网 时间:2024/06/10 03:09

字节流

InputStream 类系

类功能构造函数参数用法ByteArrayInputStream以缓冲区内存为 InputStream要从中提取出byte的那个缓冲区作为一种数据源,把它连接到 FilterInputStream,由后者提供接口StringBufferInputStream以String为InputStream需要一个String对象,实际内部用的是StringBuffer作为一种数据源FilterInputStream用来读文件一个表示文件名的String或者File,FileDescriptor 对象作为一种数据源PipedInputStream从 PipedOutputStream 提取数据,实现管道功能PipedOutputStream一种多线程环境下的数据源SequenceInputStream将两个或者多个 InputStream 合并成一个 InputStream两个 InputStream 对象或一个 InputStream 对象容器的 Enumerator作为一种数据源FilterInputStream一个给 decorator 提供接口作用的抽象类后面详解后面详解

OutputStream 类系

类功能构造函数参数用法ByteArrayOutputStream在内存里创建一个缓冲区,数据流写入到此缓冲区缓冲区初始大小,可选可通过 FilterOutputStream 为数据指定目标FileOutputStream将数据写入文件一个表示文件名的String或者File,FileDescriptor 对象,可选的是否在末尾添加的参数可通过 FilterOutputStream 为数据指定目标PipedOutputStream写入这个流的数据都会成为与之关联的 PipedInputStream 的数据源可通过 FilterOutputStream 为数据指定目标 FilterOutputStream一个给 decorator 提供接口作用的抽象类后面详解后面详解

字符流

Reader 类系

类名功能描述Reader读字符流的抽象类BufferedReader从字符流中读入文本,可在必要时缓冲字符LineNumberReader一个能记录行数的缓冲字符输入流InputStreamReader从字节流到字符流的桥梁,它能读字节并转换为字符FileReader能方便的读字符文件

Writer 类系

类名功能描述Writer写字符流的抽象类BufferedWriter经过字符缓冲将文本写入到一个字符输出流PrintWriter打印格式化对象内容到文本输出流.此类方法不抛出IO异常,但是可用 checkError检查错误OutputStreamWriter从字节流到字符流的桥梁,它能读字符转换为字节,然后将字节写入流FileWriter能方便的写字符文件

输入流和输出流的过滤

FilterInputStream 相关

类功能构造函数参数用法DataInputStream与 DataOutputStream 结合使用,这样能以一种 可携带的方式从流中读取 primitives数据(int,char,long 等)InputStream包含了一套从primitives读取数据的接口BufferedInputStream读取数据时进行缓冲InputStream,以及可选的缓冲区容量本身不提供接口,只是提供一个缓冲区LineNumberInputStream跟踪输入流的行号InputStream只是加一个行号PushbackInputStream有一个弹压单字节的缓冲区,能把最后读到的字节再压回去InputStream主要用于编译器的扫描程序

FilterOutputStream 相关

类功能构造函数参数用法DataOutputStream与 DataInputStream 配合使用,可用一种可携带的方式往流里写入 primitives数据OutputStream包括写入 primitives数据的接口PrintStream负责带格式的输出, DataOutputStream 负责数据的存储,而 PrintStream 负责数据的显示一个 OutputStream 和可选 boolean 值,表示要不要清空换行符后面的缓冲区OutputStream 的最终包覆层BufferedOutputStream输出数据时进行缓冲OutputStream,和一个可选的缓冲区大小本身不提供接口,只是提供一个缓冲区

字节流和字符流

  • 字节流以字节为基本单位处理数据的输入输出,一般都用于二进制数据的读写,如声音,图像等.
  • 字符流以字符为基本单位处理数据的输入输出,一般都用于对文本类型数据的读写,如文本文件,网络中发送的文本信息.

  • 虽然文本数据也可以看做二进制数据,但一般采用字符流处理文本数据比采用字符流效率更高,也更方便.

InputStream and OutputStream

abstract  class InputStream{//从数据中读入一个字节,并返回该字节,碰到流尾部返回-1 abstract  int read(); //读入一个字节数组并返回读入的字节数,碰到流尾部返回-1,最多读入b.length个字节 int read(byte []b); //读入一个字节数组并返回实际读入的字节数,,流尾部返回-1,off 为在b中偏移量,len为最大字节数 int read(byte []b,int off,int lne); //跳过n个字节,返回实际跳过的字节数 long skip(long n); //返回再不阻塞的情况下可以提取的字节数 int available(); //关闭这个输入流 void close(); //在输入流的当前位置标记(并非所有流支持这个特性),如果输入流已经读入的字节多余readlimit个,允许忽略这个标记 void mark(); //返回到最后一个标记,随后对read的调用将重新读入这些字节,没有任何标记则该流不被重置 void reset(); //返回该流是否支持标记 boolean markSupported();}abstract class OutputStream{//写出一个字节的数据abstract void write();void write(byte []b);void write(byte []b,int off,int len);//冲刷并关闭输出流void close();//冲刷输出流,也就是将所有缓冲数据发送到目的地.void flush();}

几个接口

interface Closeable{//关闭这个Closeable,可能会抛出 IOExceptionvoid close();}interface Flushable{//冲刷这个 Flushablevoid flush();}interface Readable{//尝试这从cb读入其可持有的char值,返回读入的char值的数量,无法继续读入返回-1int read(CharBuffer cb);}interface Appendable{Appendable  append(char c);//向这个Appendable追加指定码元或指定序列所有码元,返回thisAppendable append(CharSequence cs);}interface CharSequence{//返回指定索引处的码char charAt(int index);//返回这个序列中的码元的数量int length();//返回存储在 startIndex 和 endIndex-1之间的 所有码元构成的 CharSequenceCharSequence subSequence(int startIndex,int endIndex);//返回这个序列中所有码元构成的字符串String toString();}

读取字符

PrintWriter

class PrintWriter{PrintWriter(Writer out);PrintWriter(Writer out ,boolean autoFlush);//构建一个新的PrintWriter,可选是否自动冲刷PrintWriter(OutputStream);PrintWriter(OutputStream,boolean autoFlush);//通过构造必要的中介 OutputStreamReader 从OutputStream 构造 PrintWriterPrintWriter(String fileName);PrintWriter(File file);//通过构造必要的中介 FIleWriter 从文件构造 PrintWritervoid print(Object obj);void print(String s);void println(String s);void print(char []s);void print(int i);void print(long l);void print(float  f);void print(double d);void print(boolean b);//格式化输出void printf(String format,Object...args);//如果产生格式化输出错误返回true,一旦一个流遇到了错误,它将会收到污染,并对所有 checkError调用返回 trueboolean checkError();}

字符集相关

class CharSet{//获取这个虚拟机可以使用的所有字符集,返回一个映射表,键是字符集名字,值是字符集static SortedMap availableCharSet();//获取给定名字的字符集static CharSet forName(String name);//返回这个字符集的别名Set aliases();//给定字符串编码为字节序列ByteBuffer encode(String str);//解码给定字节序列,无法识别的输入将被转换成Unicode的替代字符 '\uFFFD'CharBuffer decode(ByteBuffer buffer);}class ByteBuffer{byte []array();//返回这个缓冲区管理的字节数组static ByteBuffer wrap(byte []bytes);static ByteBuffer wrap(byte []bytes,int offset,int length);//返回管理给定字节数组的某个范围的字节缓冲区}class CharBuffer{ //返回这个缓冲区管理的码元数组char []array();//返回给定索引处的码元char charAt();//返回这个缓冲区管理的码元构成的字符串String toString();}//more code ...Charset charset=Charset.forName("utf-8");String content="字符集";ByteBuffer byteBuffer=charset.encode(content);byte []bytes=byteBuffer.array();ByteBuffer bbuf=ByteBuffer.wrap(bytes);CharBuffer cbuf=charset.decode(bbuf);String string=cbuf.toString();System.out.println(string);//more code ...


读写二进制数据

DateInput and DataOutput

interface DataInput{boolean readBoolean();byte readByte();char readChar();double readDouble();int readInt();long readLong();short readShort();//读入给定类型的数据void readFully(byte []b);//读入字节到数组b,其间阻塞直至所有字节都读入void readFully(byte []b,int off,int len);//读入字节到数组b,其键阻塞直至所有字节都读入, off数据起始位置偏移量,len读入数据最大数量String readUTF();//读入由修订过的 UTF-8 格式的字符构成的字符串int skipBytes(int n);//跳过n个字节,其间阻塞直至所有字节都被跳过}interface DataOutput{void writeBoolean(boolean b);void writeByte(byte b);void writeChar(char c);void writeDouble(double d);void writeFloat(float f);void writeInt(int i);void writeLont(long l);void writeShort(short s);void writeChars(String s);void writeUTF(String s);}

RandomAccessFile 

class RandomAccessFile{RandomAccessFile(String file,String mode);RandomAccessFile(File file,String mode);// "r" 表示只读, "rw" 表示读写 ,"rws"表示每次更新时对数据和元数据的写磁盘操作进行同步的读写模式// "rwd" 表示每次更新时,只对数据的写磁盘操作进行同步的读写模式long getFilePointer();//返回文件指针的当前位置void seek(long pos);//将文件指针设置到距离开头的pos个字节处long length();//返回文件按照字节来衡量的长度}

Zip

未完待续...

对象序列化

class People implements Serializable{String name;int age;People(String name,int age){this.name=name;this.age=age;}public String toString() {return name+" "+age;}}public static void testSerializable(){People []peoples=new People[]{new People("Mike",15),new People("Jack", 16)};try(FileOutputStream fout=new FileOutputStream("/home/yzr/desktop/dat.txt")){ObjectOutputStream oout=new ObjectOutputStream(fout);oout.writeObject(peoples);}catch (IOException e) {e.printStackTrace();}try(FileInputStream fin=new FileInputStream("/home/yzr/desktop/dat.txt");){ObjectInputStream oin=new ObjectInputStream(fin);People [] cPeoples=(People[])oin.readObject();for(People people:cPeoples)System.out.println(people);}catch (IOException  e) {e.printStackTrace();} catch (ClassNotFoundException ce) {ce.printStackTrace();}}

利用对象序列化深拷贝

class SerialClonable implements Serializable ,Cloneable{public Object clone(){try {ByteArrayOutputStream bout=new ByteArrayOutputStream();ObjectOutputStream oout=new ObjectOutputStream(bout);oout.writeObject(this);oout.close();ByteArrayInputStream bin=new ByteArrayInputStream(bout.toByteArray());ObjectInputStream oin=new ObjectInputStream(bin);Object ret=oin.readObject();oin.close();return ret;} catch (Exception e) {return null;}}}


0 0
原创粉丝点击