课程总结:
Java I/O:
在IO中涉及的设备文件包括文件、控制台、网络链接等,这其中又根据流的方向可以将两端的设备文件分为数据源对象和接收端对象:
数据源对象:有能力产出数据
接收端对象:有能力接收数据
而IO流实际上屏蔽了在实际设备中的处理数据的细节,这些处理方式也叫通信方式可以包括顺序、随机存取、缓冲、二进制、按字符、按字节、按行等。
流:
流是个抽象的概念,是对输入输出设备的抽象,输入流可以看作一个输入通道,输出流可以看作一个输出通道。
输入流是相对程序而言的,外部传入数据给程序需要借助输入流。
输出流是相对程序而言的,程序把数据传输到外部需要借助输出流。
字节流和字符流:
字节流--传输过程中,传输数据的最基本单位是字节的流。
字符流--传输过程中,传输数据的最基本单位是字符的流。
io默认都是直接操作字节的,多用于读取或书写二进制数据,这些类的基类为InputStream或OutputStream。而字符流操作的是为了支持Unicode编码,用于字符国际化,一个字符占用两个字节,这些类的基类为Reader或Writer。
【字节输出流:OutputStream】
如果要通过程序输入内容,可以使用java.io.OutputStream类,首先观察这个类的定义结构。
public abstract class OutputStream extends Object implements Closeable,Flushable
发现OutputStream类实现了Closeable、Flushable2个接口,这2个接口都有各自的方法:
Closeable:public void close() throw IOException
Flushable:public void flush() throw IOException
【字节输入流InputStream】
利用OutputStream实现了程序输出内容到文件的处理,现在需要通过程序读取文件内容,那么就要使用到InputStream类,这个类的定义如下:
public abstract class InputStream extends Object implements Closeable
发现InputStream类只实现了Closeable接口,InputStream类中提供了以下方法:
读取数据到字节数组:public int read(byte[] b) throws IOException
读取部分数据到字节数组:public int read(byte[] b,int off,int len) throws IOException
读取单个字节:public abstract int read() throws IOException
【字符输入流:Reader】
Reader也是一个抽象类,如果要读取文件使用FileReader子类。在Reader类中没有定义方法直接读取数据为字符串。此时只能够按照原始的方式通过数组来进行读取操作。字符流在进行单个数据读取的时候要比字节流更加方便的处理中文。
【字符输出流:Writer】
字符适合处理中文数据,Writer类是字符输出流的处理类,这个类的定义如下:
public abstract class Writer extends Object implements Appendable, Closeable, Flushable
与之前相比多了一个Appendable接口。
在Writer类里面提供有write()方法,而且该方法接收的类型都是char型,不过里面有一个直接输出字符串的方法:
输出内容:public void write(String str) throws IOException
管道流:
管道流的主要作用是可以进行两个线程间的通讯,分为管道输入流(PipeOutputStream)和管道输出流(PipeInputStream)。
如果要想进行管道输出,则必须把输出流连在输入流之上,在PipeOutputStream上有如下方法用于连接管道。
void connect(PipedInputStream snk)
将此管道输出流连接到接收者。
要想连接输入和输出,必须使用此方法、
PipeOutputStream输出方法:
void write(byte[] b, int off, int len)
将 len 字节从初始偏移量为 off 的指定 byte 数组写入该管道输出流。
PipeInputStream输入方法:读取文件的方法
将连接的PipeOutputStream对象实例的输入流的数据,通过read方法,把内容读取到数组中。
int read(byte[] b, int off, int len)
将最多 len 个数据字节从此管道输入流读入 byte 数组。
打印流:
打印流只能是输出流:
PrintStream: 字节打印流
PrintWriter: 字符打印流
-对于PrintWriter来说,当启用字段刷新之后,
调用println或者printf或者format方法,便会立马刷新操作(自动刷新).
如果没有开启自动刷新,则需要手动刷新或者当缓冲区满的时候,再自动刷新.(或直接调用close()方法,会自动刷新)
System类:
System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang包。
由于该类的构造方法是private的,所以无法创建该类的对象,也就是无法实例化该类。其内部的成员变量和成员方法都是static的,所以也可以很方便的进行调用。
标准输入输出, 如out、in、err
外部定义的属性和环境变量的访问,如getenv()/setenv()和getProperties()/setProperties()
加载文件和类库的方法,如load()和loadLibrary()、
快速拷贝数组的方法:arraycopy()
jvm操作:如gc()、runFinalization()、exit(),该部分并未在源码的java doc中提到,可能因为本身不建议主动调用吧。而且这几个方法都仅仅是Runtime.getRuntime()的调用,两者没有区别
获取时间方法:System.nanoTime 和 System.currentTimeMillis