--------- android培训、java培训、期待与您交流! ----------
Java中的I/O流
<1>Java中的流实际是数据(字节序列)流,使数据像流水一样通过用户规定的管道流淌汇聚。
<2>IO包中的File类负责操作文件的属性信息,流负责操作数据。
<3>Java中的流类型可以根据不同的角度进行分类。例如按数据流的方向分类,按处理数据的单位分类,按功能分类等等。
注意:Java中的IO包是按照装饰设计模式的思想来设计的。理解了这一点,可以更加容易掌握IO技术。
<4>按数据流的方向不同分为输入流和输出流。输入流就是把外部数据读到程序中来,输出流就是把程序中的数据写出去。
字节流的抽象基类:InputStream OutputStream (二进制数据)
字符流的抽象基类:Reader Writer (字符数据)
<5>按处理数据的单位不同分为字节流和字符流。字节流就是以字节为最小的传输单位,字符流就是以字符为数据的最小传输单位。
<6>按功能的不同分为节点流和包装流。节点流是底层流,对应着数据的来源和目的地的对象,节点流也是最终调用操作系统资源的流,包装流是对底层流做包装的上层流,也叫装饰流。
<7>字节流中派生出的节点流子类和对应的目标类型:
FileInputStream FileOutputStream:磁盘文件的输入,输出
ByteArrayInputStream ByteArrayOutputStream:内存数组的输入,输出
PipedInputStream PipedOutputStream:管道的输入,输出,用在多线程
<8>字符流中派生出的节点流子类和对应的目标类型:
FileReader FileWriter:磁盘文件的输入,输出
CharArrayReader CharArrayWriter:内存数组的输入,输出
StringReader StringWriter:内存字符串的输入,输出
PipedReader PipedWriter:管道输入,输出,用在多线程
<9>包装流也叫装饰流,可以将节点流封装在装饰流中使用,使其具有更加强大的数据读写功能和其他附加功能,相当于在节点流的外面又进行了包装。包括缓冲流,转换流,基本数据流,打印流,序列化流等等。
<10>当你想要玩字符编码时,应该使用可以加入编码表的流对象,转换流:
InputStreamReader 字节到字符的桥梁
OutputStreamWriter 字符到字节的桥梁
<11>RandomAccessFile类的对象支持对文件的随机读取和写入,这个类也支持直接输入,输出各种数据类型。(RandomAccessFile类实现了DataInput和DataOutput接口,可以访问在DataInputStream和DataOutputString中所有的read() 和 write()方法)
RandomAccessFile类的行为类似存储在文件系统中的一个大型byte数组,存在着指向该隐含数组的光标或索引,称为文件指针。你可以通过seek()方法调整文件指针的位置来实现随机读写。通过getFilePointer()来获取文件指针的位置。
一个文本复制程序:
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyText
{
/**
* @param args
* @throws Exception
*/
// 将一个盘中的文本文件复制到另一个盘中
public static void main(String[] args) throws Exception
{
copy_2();
}
public static void copy_2()
{
// 第二种使用先读到数组里,再一次性写出来的方式 , 效率高很多 ,建议使用 异常处理
FileReader fr = null;
FileWriter fw = null;
try
{
fr = new FileReader("FileReaderDemo.java");
fw = new FileWriter("FileReaderDemo_COPY2.java");
char[] buffer = new char[1024];
int length = 0;
while ((length = fr.read(buffer)) != -1)
{
fw.write(buffer, 0, length);
}
}
catch (IOException e)
{
throw new RuntimeException("读写失败");
}
finally
{
try
{
if (fr != null)
fr.close();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
try
{
if (fw != null)
fw.close();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void copy_1() throws Exception
{
// 第一种采取度一个字符,写一个字符的方式,效率极低,不建议使用
FileReader fr = new FileReader("FileReaderDemo.java");
FileWriter fw = new FileWriter("FileReaderDemo_COPY.java");
int ch = 0;
while ((ch = fr.read()) != -1)
{
fw.write(ch);
}
fr.close();
fw.close();
}
}