Java - I/O 操作
I/O类库的基本架构
Java的I/O操作类在包java.io下,有将近80个类。
按数据格式分类:
① 面向字节(Byte)操作的 I/O 接口:InputStream 和 OutputStream
② 面向字符(Character)操作的 I/O 接口:Writer 和 Reader
按作用位置分类:
① 基于磁盘操作的 I/O 接口:File
② 基于网络操作的 I/O 接口:Socket(不在java.io中)
一、 I/O数据格式
(1)面向字节:操作以8位为单位对二进制数据进行操作,不对数据进行转换。这些类都是InputStream 和 OutputStream的子类。以InputStream/OutputStream为后缀的类都是字节流,可以处理所有类型的数据。
(2)面向字符:操作以字符为单位,读时将二进制数据转换为字符,写时将字符转换为二进制数据Writer 和 Reader的子类,以Writer/Reader为后缀的都是字符流。
硬盘上所有的文件都是以字节形式保存,字符只在内存中才会形成。即只在处理纯文本文件时,优先考虑使用字符流,除此之外都用字节流。
其中:
字符流:InputStreamReader/OutputStreamWriter 是字节流转化为字符流的桥转换器。
BufferReader/BufferWriter 逐行读写流,可用于较大的文本文件。是过滤流,需要用其他的节点流做参数构造对象。
字节流:FileInputStream/FileOutputStream 文件输入输出流。
PipedInputStream/PipedOutputStream 管道里,线程交互时使用。
ObjectInputStream/ObjectOutputStream 对象流,实现对象序列化
读写操作实例:
// 使用FileReader进行读取文件,然后FileWriter写入另一个文件
public void testFileReaderAndFileWriter() throws IOException {
FileReader fileReader = new FileReader("h:\\haha.txt");
char[] buff = new char[512];
StringBuffer stringBuffer = new StringBuffer();
while (fileReader.read(buff) > 0) {
stringBuffer.append(buff);
}
System.out.println(stringBuffer.toString());
FileWriter fileWriter = new FileWriter("h:\\haha2.txt");
fileWriter.write(stringBuffer.toString().trim());
fileWriter.close();
System.out.println("写入文件成功");
}
// 使用InputStreamReader进行读取文件,然后用OutputStreamWriter写入文件
public void testInputStreamReader() throws IOException {
//操作数据的方式是可以组合的,此处FileInputStream读出的字节流用InputStreamReader转化为了字符流对象
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("h:\\haha.txt"), "utf-8");
char[] buff = new char[512];
StringBuffer stringBuffer = new StringBuffer();
while (inputStreamReader.read(buff) > 0) {
stringBuffer.append(buff);
}
System.out.println(stringBuffer.toString());
//写文件时,要指定写入的地方(网络或本地)、路径
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("h:\\haha2.txt"), "utf-8");
outputStreamWriter.write(stringBuffer.toString().trim());
outputStreamWriter.close();
}
public void testIntputStream2() throws IOException {
InputStreamReader inputStreamReader = new InputStreamReader(new StringBufferInputStream("hello world"));
char[] buff = new char[512];
int n = inputStreamReader.read(buff);
System.out.println(n);
System.out.println(buff);
}
FileReader类继承了InputStreamReader,FileReader读取文件流,通过StreamDecoder解码成char,其解码字符集使用的是默认字符集。在Java中,我们应该使用File对象来判断某个文件是否存在,如果我们用FileOutputStream或者FileWriter打开,那么它肯定会被覆盖。
上一篇: 用exec实施cmd命令返回为空