输入输出-总
1.File类
File类可以使用文件路径字符串来创建File实例,该文件路径字符串既可以是绝对路径,也可以是相对路径,默认情况下,系统总是依据用户的工作路径来解释相对路径,这个路径由系统属性“user.dir”指定,通常也就是运行Java虚拟机时所在的路径。
File不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。
----------------------------------------------------------------------------------------------
2.文件过滤器--FilenameFilter接口
在File的list方法中可以接受一个FilenameFilter参数,通过该参数可以只列出符合条件的文件。
FilenameFilter接口里包含了一个accept(File dir, String name)方法,该方法将依次对指定File的所有子目录、子文件夹进行迭代,如果该方法返回true则list方法会列出该子目录或者子文件。
3.
字符流--Reader\Writer
字节流--InputStream\OutputStream
在使用时都使用它们的实现类,以下常用的公共方法 Reader: int read() Reads a single character. int read(char[] cbuf) Reads characters into an array. abstract int read(char[] cbuf, int off, int len) Reads characters into a portion of an array. int read(CharBuffer target) Attempts to read characters into the specified character buffer. ----------------------------------------------------------------------------- InputStream: abstract int read() Reads the next byte of data from the input stream. int read(byte[] b) Reads some number of bytes from the input stream and stores them into the buffer array b. int read(byte[] b, int off, int len) Reads up to len bytes of data from the input stream into an array of bytes. ------------------------------------------------------------------ Writer Writer append(char c) Appends the specified character to this writer. Writer append(CharSequence csq) Appends the specified character sequence to this writer. Writer append(CharSequence csq, int start, int end) Appends a subsequence of the specified character sequence to this writer. abstract void close() Closes the stream, flushing it first. abstract void flush() Flushes the stream. void write(char[] cbuf) Writes an array of characters. abstract void write(char[] cbuf, int off, int len) Writes a portion of an array of characters. void write(int c) Writes a single character. void write(String str) Writes a string. void write(String str, int off, int len) Writes a portion of a string. ------------------------------------------------------------------ OutputStream void close() Closes this output stream and releases any system resources associated with this stream. void flush() Flushes this output stream and forces any buffered output bytes to be written out. void write(byte[] b) Writes b.length bytes from the specified byte array to this output stream. void write(byte[] b, int off, int len) Writes len bytes from the specified byte array starting at offset off to this output stream. abstract void write(int b) Writes the specified byte to this output stream.
-------------------------------------------------------------------------------------------------------------
4.输入/输出流体系
http://www.cnblogs.com/moonpool/p/5488463.html
文本文件的读写
用FileInputStream读文件
用FileOutputStream写文件
用BufferedReader读文本文件
用BufferedWriter写文本文件
二进制文件的读写
DataOutputStream
DataInputStream
----------------------------------------------------------------------------------------------------------------------
5.转换流--InputStreamReader OutputStreamWriter
转换流用于实现将字节流转换成字符流,其中InputStreamReader将字节输入流转换成字符输入流,OutputStreamWriter将字节输出流转换成字符输出流
------------------------------------------------------------------------------------------------------------------------------------------------
6.推回流--PushbackInputStream PushbackReader
提供了如下三个方法:
void unread(byte[]/char[] buf):将一个字节/字符数组内容的推回到推回缓冲区里,从而允许重复读取刚刚读取的内容。
void unread(byte[]/char[] b, int off, int len):将一个字节/字符数组里从off开始,长度为len字节/字符的内容推回到推回缓冲区里,从而允许重复读取刚刚读取的内容。
void unread(int b) :将一个字节/字符的推回到推回缓冲区里,从而允许重复读取刚刚读取的内容。
------------------------------------------------------------------------------------------------------------------------------------------
7.重定向标准输入/输出 System.in System.out
标准输入/输出的方法:
static void setErr(PrintStream err):重定向 “标准”错误输出流。
static void setIn(InputStream in):重新分配“标准”输入流。
static void setOut(PrintStream out):重定向 “标准”输出流。
------------------------------------------------------------------------------------------------
8.Java虚拟机读取其他进程的数据
用Runtime对象的exec方法可以运行平台上的其他程序,该方法产生一个Process对象,Process对象代表由该Java程序启动的子进程。
Process类提供下面三个方法让程序和其他子进程进行通讯。
InputStream getErrorStream():获取子进程的错误流
InputStream getInputStream():获取子进程的输入流
OututStream getOutputStream():获取子进程的输出流
-----------------------------------------------------------------------------------------------
9.RandomAccessFile类
它提供了众多的方法来访问文件内容,它既可以读取文件内容,也可以向文件输出数据。与普通的输入/输入流不同的是,RandomAccessFile支持“随机访问”的方式,程序可以直接跳转到文件的任意地方来读写数据。
RandomAccessFile对象也包含了一个记录指针,用以标识当前读写处的位置,当程序新创建一个RandomAccessFile对象时,该对象的文件记录指针位于文件头(也就是0处),当读/写了n个字节后,文件记录指针将会向后移动n个字节。除此之外,RandomAccessFile可以自由移动该记录指针,既可以向前移动,也可以向后移动。RandomAccessFile包含了如下两个方法来操作文件记录指针:
----long getFilePointer():返回文件记录指针的当前位置。
----void seek(long pos):将文件记录指针定位到pos位置。
RandomAccessFile类有两个构造器,其实这两个构造器基本相同,真是指定文件的形式不同而已:一个使用String参数来指定文件名,一个使用File参数来指定文件本身。除此之外,创建RandomAccessFile对象时还需要指定一个mode参数,该参数指定RandomAccessFile的访问模式。
-------------RandomAccessFile(File file, String mode) Creates a random access file stream to read from, and optionally to write to, the file specified by the File argument.
-------------RandomAccessFile(String name, String mode) Creates a random access file stream to read from, and optionally to write to, a file with the specified name.
该参数有如下四个值:
----"r":以只读方式打开指定文件。如果试图对该RandomAccessFile执行写入方法都将会抛出 IOException。
----"rw":以读取、写入方式打开指定文件。如果该文件尚不存在,则尝试创建该文件。
----"rws":以读取、写入方式打开指定文件。相对于对于 "rw"模式,还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
----"rwd":以读取、写入方式打开指定文件。对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。
RandomAccessFile依然不能向文件的指定位置插入内容,如果直接将文件记录指针移动到中间某位置后开始输出,则新输出的内容会覆盖文件中原有的内容。
如果需要向指定位置插入内容,程序需要先把插入点后面内容读入缓冲区,等将需要插入的数据写入文件后,再将缓冲区的内容追加到文件后面。
-----------------------------------------------------------------------------------------------------------------------
10.对象序列化--Serializable接口
序列化机制允许将实现序列化的Java对象转换为字节序列,这些字节序列可以被保存在磁盘上,或通过网络传输,以备以后重新恢复成原来的对象。序列化机制使得对象可以脱离程序的运行而独立存在。
对象的序列化(Serialize)指将一个Java对象写入IO流中,与此对应的是,对象的反序列化(Deserialize)则指从IO流中恢复该Java对象。
如果需要让某个对象可以支持序列化机制,必须让它的类是可序列化的(serializable),为了让某个类是可序列化的,该类必须实现如下两个接口之一:
----Serializable
----Externalizable
如下两个步骤来序列化对象。
(1)创建一个ObjectOutputStream,这个输出流是一个处理流,所以必须建立在其他节点流的基础之上。
(2)调用ObjectOutputStream对象的writeObject方法输出可序列化对象。
反序列化步骤
(1)创建一个ObjectInputStream,这个输入流是一个处理流,所以必须建立在其他节点流的基础之上。
(2)调用ObjectInputStream对象的readObject对象读取流中的对象,该方法返回一个Object类型的Java对象,如果程序知道该Java对象的类型,则可以将该对象强制类型转换成其真实的类型。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
自定义序列化--transient关键字
在属性前面加上transient关键字,可以指定Java序列化时无需理会该属性值。
在序列化和反序列化过程中需要特殊处理的类应该提供如下特殊签名的方法,这些特殊的方法用以实现自定义序列化:
private void writeObject(java.io.ObjectOutputStream out)throws IOException
private void readObject(java.io.ObjectInputStream in)throws IOException, ClassNotFoundException;
private void readObjectNoData()throws ObjectStreamException;
---------------------------------------------------------------------
11.NIO
Buffer缓冲
从内部结构上来看,Buffer就像一个数组,它可以保存多个类型相同的数据。Buffer是一个抽象类,其最常用的子类是ByteBuffer,它可以在底层字节数组上进行get/set操作,除了ByteBuffer之外,其他基本数据类型(boolean除外)都有相应的Buffer类:ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer
容量(capacity):缓冲区的 容量(capacity) 表示该Buffer的最大数据容量,即最多可以存储多少数据。缓冲区的容量不可能为负值,在创建后也不能改变。
界限(limit):第一个不应该被读出或者写入的缓冲区位置索引。也就是说,位于limit后的数据既不可被读,也不可被写。
位置(position):用于指明下一个可以被读出的或者写入的缓冲区位置索引(类似于IO流中的记录指针)。当使用Buffer从Channel中读取数据时,position的值恰好等于已经读到了多少数据。当刚刚新建一个Buffer对象时,其position为0,如果从Channel中读取了2个数据到该Buffer中,则postion为2,指向Buffer中第三个(第一个位置的索引为0)位置。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Channel通道
http://www.cnblogs.com/moonpool/p/5522479.html
Channel类似于传统的流对象,但与传统的流不同的是,Channel有两个主要的区别:
Channel可以直接将指定文件的部分或全部映射成Buffer。
程序不能直接访问Channel中的数据,包括读取、写入都不行,Channel只能与Buffer进行交互。也就是说,如果要从Channel中取得数据,必须先用Buffer从Channel中取出一些数据,然后让程序从Buffer中取出这些数据;如果要将程序中的数据写入Channel,一样先让程序将数据放入Buffer中,程序再将Buffer里的输入写入Channel中。
Channel是一个接口,位于java.nio.channels包下,系统为该接口提供了DatagramChannel、 FileChannel、Pipe.SinkChannel、Pipe.SourceChannel、SelectableChannel、ServerSocketChannel, SocketChannel等实现类,本节主要介绍FileChannel的用法,根据这些Channel的名字我们不难发现新IO里的Channel是按功能来划分的,例如Pipe.SinkChannel、Pipe.SourceChannel用于支持线程之间通信的管道Channel,而ServerSocketChannel、SocketChannel则是用于支持TCP网络通信的Channel。
Selector
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Charset
通常而言,把明文的字符串序列转换成计算机理解的字节序列(二进制文件,普通人看不懂)成为编码,把字节序列转化成普通人能看懂的明文字符串称为解码。
Charset里也提供了如下三个方法:
CharBuffer decode(ByteBuffer bb):将ByteBuffer中字节序列转换成字符序列的的便捷方法。
ByteBuffer encode(CharBuffer cb):将CharBuffer中的字符序列转换成字节序列的便捷方法。
ByteBuffer encode(String str):将String中的字符序列转换成字节序列的便捷方法。
FileLock
-----------------------------------------------------------------------------
12.NIO.2
Path\Paths\Files
Path - 接口,代表一个平台无关的目录。提供了大量的方法来操作目录。
Paths - 工具类。所有方法都是static的。
Files - 操作文件的工具类。提供了大量的方法来操作文件。该类所包含的大量方法可能与我们日常一般的期望有些出入。
FileVisitor
WatchService
java.nio.file.attribute--FileAttributeView接口
本文来自博客园,作者:月色深潭,交流群:733423266,转载请注明原文链接:https://www.cnblogs.com/moonpool/p/5503469.html