Java I/O系统
1、File既能代表一个特定文件的名称,又能代表一个目录下的一组文件的名称。File类代表的是文件路径,它的list()方法返回的是一个字符数组而不是一个容器,因为它包含的元素个数是固定的,不会再改变。File类用于文件或者目录的描述信息,例如生成新目录,修改文件名,删除文件,判断文件所在路径等。
2、编程语言的IO类库中常使用流这个抽象概念,它代表任何有能力产出数据的数据流对象或者是有能力接收数据的接收端对象。
3、任何自Inputstream或Reader派生而来的类都含有名为read()的基本方法,任何自OutputStream或Writer派生而来的类都含有名为write()的基本方法。但我们通常不会用到这些方法,我们很少使用单一的类来创建流对象,而是通过叠合多个对象的提供所期望的功能。
4、InputStream的作用是用来表示那些从不同数据源产生输入的类 。包含的类型如下
类 |
功能 |
构造器参数 |
如何使用 |
ByteArrayInputStream |
允许将内存的缓冲区当作InputStream使用 |
缓冲区,字节将从中取出 |
作为一种数据源:将其与FilterInputStream对象相连以提供有用接口 |
StringBufferInputStream |
将String转换成InputStream |
字符串。底层实现实际使用StringBuffer |
作为一种数据源:将其与FilterInputStream对象相连以提供有用接口 |
FileInputStream |
用于从文件读取信息 |
字符串,表示文件名、文件或FileDescriptor对象 |
|
PipedInputStream |
产生用于写入相关PipedOutputStream的数据。实现“管道化”概念 |
PipedOutputStream |
作为多线程中的数据源:将其与FilterInputStream对象相连以提供有用接口 |
SequenceInputStream |
将两个或多个InputStream对象转换成单一InputStream |
两个InputStream对象或一个容纳InputStream对象的容器Enumeration |
作为一种数据源:将其与FilterInputStream对象相连以提供有用接口 |
FilterInputStream |
抽象类,作为“装饰器”的接口。其中,“装饰器”为其他的InputStream类提供有用功能。 |
见FilterInputStream类型表 |
5、OutputStream决定了输出所要去往的目标:字节数组(但不是String)、文件或管道。包含的类型如下
类 |
功能 |
构造器参数 |
如何使用 |
ByteArrayOutputStream |
在内存中创建缓冲区。所有送往“流”的数据都要放置在此缓冲区 |
缓冲区初始化尺寸(可选的) |
用于指定数据的目的地:将其与FilterOutputStream对象相连以提供有用接口 |
FileOutputStream |
用于将信息写至文件 |
字符串,表示文件名、文件或者FileDescriptor对象 |
指定数据的目的地:将其与FilterOutputStream对象相连以提供有用接口 |
PipedOutputStream |
任何写入其中的信息都会自动作为相关PipedInputStream的输出。实现“管道化”概念 |
PipedInputStream |
指定用于多线程的数据的目的地:将其与FilterOutputStream对象相连以提供有用接口 |
FilterOutputStream |
抽象类,作为“装饰器”的接口。其中,“装饰器”为其他的InputStream类提供有用功能。 |
6、FilterInputStream类型
类 |
功能 |
构造器参数 |
如何使用 |
DataInputStream |
与DataOutputStream搭配使用,因此我们可以按照可移植方式从流读取基本数据类型(int,char,long等) |
InputStream |
包含用于读取基本类型数据的全部接口 |
BufferedInputStream |
使用它可以防止每次读取时都得进行实际写操作。代表“使用缓冲区” |
InputStream,可以指定缓冲区大小(可选的) |
本质上不提供接口,只不过是向进程中添加缓冲区所必须的。与接口对象搭配 |
LineNumberInputStream |
跟踪输入流中的行号;可调用getLineNumber()和setLineNumber(int) |
InputStream |
仅增加了行号,因此可能要与接口对象搭配使用 |
PushbackInputStream |
具有“能弹出一个字节的缓冲区”。因此可以将读到的最后一个字符回退 |
InputStream |
通常作为编译器的扫描器,之所以包含在内是因为Java编译器的需要,我们基本上用不到 |
7、FilterOutputStream类型
类 |
功能 |
构造器参数 |
如何使用 |
DataOutputStream |
与DatInputStream搭配使用,因此我们可以按照可移植方式从流读取基本数据类型(int,char,long等) |
OutputStream |
包含用于写入基本类型数据的全部接口 |
PrintStream |
用于产生格式化输出。其中OutputStream处理数据的存储,PrintStream处理显示 |
OutputStream,可以用boolean值指示是否每次换行时情况缓冲区(可选的)应该是对OutputStream对象的“final”封装。可能会经常使用到它 |
|
BufferedOutputStream |
使用它以避免每次发送数据时都要进行实际的写操作。代表“使用缓冲区”。可以调用flush()清空缓冲区 |
OutputStream,可以指定缓冲区大小(可选的) |
本质上并不提供接口,只不过向进程中添加缓冲区所必需的。与接口对象搭配 |
8、操作纯文本,使用字符流 Reader,Writer ;非纯文本,使用字节流 InputStream,OutputStream。
9、
InputStream(二进制格式操作):抽象类,基于字节的输入操作,是所有输入流的父类。定义了所有输入流都具有的共同特征。
OutputStream(二进制格式操作):抽象类。基于字节的输出操作。是所有输出流的父类。定义了所有输出流都具有的共同特征。
Reader(文件格式操作):抽象类,基于字符的输入操作。
Writer(文件格式操作):抽象类,基于字符的输出操作。
RandomAccessFile(随机文件操作):可以从文件的任意位置进行存取(输入输出)操作。
10、
11、InputStreamReader 和OutputStreamWriter 这两个类能够把字节流转换为字符流,并且可以指定编码格式,在构造函数中传入编码格式即可。InputStreamReader 的子类FileReader 构造函数就是调用父类不指定编码格式的构造函数。
new InputStreamReader(new FileInputStream(file), "GBK");//指定编码格式
new InputStreamReader(new FileInputStream(file)); //不指定编码格式
new FileReader(file); //无法指定编码格式
new FileReader(file,"GBK"); //无此构造函数
FileReader类的构造函数:
public FileReader(File file) throws FileNotFoundException {
super(new FileInputStream(file)); //FileReader是FileInputStream的子类
}
ps.好像只有这两个类可以指定编码格式
12、字节流可以处理任何类型文件,而字符流在处理文本类型时更具优点。
13、如果想要打开一个文件用于字符输入,可以使用以String或File对象作为文件名的FileInputReader构造器。为了提高速度,可以将产生的引用给一个BufferedReader构造器。使用BufferedReader的readLine方法读取文件。
BufferedReader in = new BufferedReader(
new FileReader(filename));
String s;
StringBuilder sb = new StringBuilder();
while((s = in.readLine())!= null)
sb.append(s + "\n");
in.close();
return sb.toString();
14、read()是以int形式返回下一个字节,因此必须类型转换为cahr才能正确输出。
15、通过对FileChannel调用tryLock()或lock(),就可以获得整个文件的FileLock。
16、java的对象序列化将那些实现了serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列完全恢复为原来的对象。serializable接口仅是一个标记接口,不包括任何方法。
17、NIO引入了Channels概念,所有的 IO 在NIO 中都从一个Channel 开始。通道中的数据总是要先读到一个Buffer中,然后再从buffer中获取。
18、FileChannel 从文件中读写数据;DatagramChannel 能通过UDP读写网络中的数据;SocketChannel 能通过TCP读写网络中的数据;ServerSocketChannel可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。