Java io概述
内容来源:http://ifeve.com/java-io/
Java IO 概述
输入流可以理解为向内存输入,输出流可以理解为从内存输出
Java的IO包主要关注的是从原始数据源的读取以及输出原始数据到目标媒介。以下是最典型的数据源和目标媒介:
- 文件
- 管道
- 网络连接
- 内存缓存
- System.in, System.out, System.error(注:Java标准输入、输出、错误输出)
Java IO的用途和特征
Java IO中包含了许多InputStream、OutputStream、Reader、Writer的子类。这样设计的原因是让每一个类都负责不同的功能。这也就是为什么IO包中有这么多不同的类的缘故。各类用途汇总如下:
- 文件访问
- 网络访问
- 内存缓存访问
- 线程内部通信(管道)
- 缓冲
- 过滤
- 解析
- 读写文本 (Readers / Writers)
- 读写基本类型数据 (long, int etc.)
- 读写对象
Java IO类概述表
Java IO: InputStream
read()
read()方法返回从InputStream流内读取到的一个字节内容
InputStream包含了2个从InputStream中读取数据并将数据存储到缓冲数组中的read()方法,他们分别是:
- int read(byte[])
- int read(byte, int offset, int length)
一次性读取一个字节数组的方式,比一次性读取一个字节的方式快的多,所以,尽可能使用这两个方法代替read()方法。
Java IO: OutputStream
Write(byte)
write(byte)方法用于把单个字节写入到输出流中。
write(byte[])
OutputStream同样包含了将字节数据中全部或者部分数据写入到输出流中的方法,分别是write(byte[])和write(byte[], int offset, int length)。
write(byte[])把字节数组中所有数据写入到输出流中。
write(byte[], int offset, int length)把字节数据中从offset位置开始,length个字节的数据写入到输出流。
flush()
OutputStream的flush()方法将所有写入到OutputStream的数据冲刷到相应的目标媒介中。比如,如果输出流是FileOutputStream,那么写入到其中的数据可能并没有真正写入到磁盘中。即使所有数据都写入到了FileOutputStream,这些数据还是有可能保留在内存的缓冲区中。通过调用flush()方法,可以把缓冲区内的数据刷新到磁盘(或者网络,以及其他任何形式的目标媒介)中。
Java IO: FileInputStream
FileInputStream可以以字节流的形式读取文件内容。
// FileInputStream是InputStream的子类,这意味着你可以把FileInputStream当做InputStream使用(FileInputStream与InputStream的行为类似)。 InputStream input = new FileInputStream("c:\\data\\input-text.txt"); File file = new File("c:\\data\\input-text.txt"); // 其中一个FileInputStream构造函数取一个File对象替代String对象作为参数。这里是一个使用该构造函数的例子: InputStream input = new FileInputStream(file);
Java IO: FileOutputStream
FileOutputStream可以往文件里写入字节流
文件内容的覆盖Override VS追加Appending
当你创建了一个指向已存在文件的FileOutputStream,你可以选择覆盖整个文件,或者在文件末尾追加内容。通过使用不同的构造函数可以实现不同的目的。
// 其中一个构造函数取文件名作为参数,会覆盖任何此文件名指向的文件。 OutputStream output = new FileOutputStream("c:\\data\\output-text.txt"); // 另外一个构造函数取2个参数:文件名和一个布尔值,布尔值表明你是否需要覆盖文件。这是构造函数的例子: OutputStream output = new FileOutputStream("c:\\data\\output-text.txt", true); //appends to file OutputStream output = new FileOutputStream("c:\\data\\output-text.txt", false); //overwrites file
Java IO: Reader And Writer
Java IO的Reader和Writer除了基于字符之外,其他方面都与InputStream和OutputStream非常类似。他们被用于读写文本。
Reader类是Java IO中所有Reader的基类。子类包括BufferedReader,PushbackReader,InputStreamReader,StringReader和其他Reader。
Reader reader = new FileReader("c:\\data\\myfile.txt");
Writer类是Java IO中所有Writer的基类。子类包括BufferedWriter和PrintWriter等等。
Writer writer = new FileWriter("c:\\data\\file-output.txt");
整合Reader与InputStream
一个Reader可以和一个InputStream相结合。如果你有一个InputStream输入流,并且想从其中读取字符,可以把这个InputStream包装到InputStreamReader中。
// InputStream传递到InputStreamReader的构造函数中: Reader reader = new InputStreamReader(inputStream);
整合Writer和OutputStream
与Reader和InputStream类似,一个Writer可以和一个OutputStream相结合。把OutputStream包装到OutputStreamWriter中,所有写入到OutputStreamWriter的字符都将会传递给OutputStream。
Writer writer = new OutputStreamWriter(outputStream);
整合Reader和Writer
和字节流一样,Reader和Writer可以相互结合实现更多更有趣的IO,工作原理和把Reader与InputStream或者Writer与OutputStream相结合类似。举个栗子,可以通过将Reader包装到BufferedReader、Writer包装到BufferedWriter中实现缓冲。
Reader reader = new BufferedReader(new FileReader(...)); Writer writer = new BufferedWriter(new FileWriter(...));
Java IO: RandomAccessFile
创建一个RandomAccessFile
// 在使用RandomAccessFile之前,必须初始化它。这是例子: RandomAccessFile file = new RandomAccessFile("c:\\data\\file.txt", "rw"); // 请注意构造函数的第二个参数:“rw”,表明你以读写方式打开文件。请查阅Java文档获知你需要以何种方式构造RandomAccessFile。
在RandomAccessFile中来回读写
在RandomAccessFile的某个位置读写之前,必须把文件指针指向该位置。通过seek()方法可以达到这一目标。可以通过调用getFilePointer()获得当前文件指针的位置。
RandomAccessFile file = new RandomAccessFile("c:\\data\\file.txt", "rw"); file.seek(200); long pointer = file.getFilePointer(); file.close();
RandomAccessFile中的任何一个read()方法都可以读取RandomAccessFile的数据。
RandomAccessFile中的任何一个write()方法都可以往RandomAccessFile中写入数据。