java I/O———字节流与字符流—字节输出流(OutputStream)
- File类不支持文件内容处理,如果要处理文件内容,必须要通过流的操作模式来完成。流分为输入流和输出流。
- 在java.io包中,流分为两种:字节流与字符流
- 字节流:InputStream、OutputStream
- 字符流:Reader、Writer
字节流与字符流操作的本质区别只有一个:字节流是原生的操作,而字符流是经过处理后的操作。
在进行网络数据传输、磁盘数据保存所保存所支持的数据类型只有:字节。
而所有磁盘中的数据必须先读取到内存后才能进行操作,而内存中会帮助我们把字节变为字符。字符更加适合处理中文。
不管使用的是字节流还是字符流,其基本的操作流程几乎是一样的,以文件操作为例。
- 根据文件路径创建File类对象 ;
- 根据字节流或字符流的子类实例化父类对象 ;
- 进行数据的读取或写入操作
- 关闭流(close())。
对于IO操作属于资源处理,所有的资源处理操作(IO操作、数据库操作、网络)最后必须要进行关闭。
字节输出流(OutputStream)
如果要想通过程序进行内容输出,则可以使用java.io.OutputStream。
来观察OutputStream类的定义结构:
public abstract class OutputStream implements Closeable, Flushable
OutputStream类实现了Closeable,Flushable两个接口,这两个接口中的方法:
- Closeable: public void close() throws IOException;
- Flushable: public void flush() throws IOException;
在OutputStream类中还定义有其他方法:
- 将给定的字节数组内容全部输出:public void write(byte b[]) throws IOException
- 将部分字节数组内容输出:public void write(byte b[], int off, int len) throws IOException
- 输出单个字节:public abstract void write(int b) throws IOException;
由于OutputStream是一个抽象类,所以要想为父类实例化,就必须要使用子类。由于方法名称都由父类声明好了,所以我们在此处只需要关系子类的构造方法。如果要进行文件的操作,可以使FileOutputStream类来处理,这个类的构造方法如下:
- 接收File类(覆盖):public FileOutputStream(File file) throws FileNotFoundException
- 接收File类(追加):public FileOutputStream(File file, boolean append)
范例:实现文件的内容输出
package www.bit.java.io;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class TestIO {
public static void main(String[] args) throws Exception{
File file = new File(File.separator + "Users" + File.separator + "yuisama" +
File.separator + "Desktop"
+ File.separator + "hello.txt");
if (!file.getParentFile().exists()) { // 必须保证父目录存在
file.getParentFile().mkdirs() ; // 创建多级父目录
}
// OutputStream是一个抽象类,所以需要通过子类进行实例化,此时只能操 作File类
OutputStream output = new FileOutputStream(file) ;
// 要求输出到文件的内容
String msg = "I'm bad man" ;
// 将内容变为字节数组
output.write(msg.getBytes());
// 关闭输出
output.close();
}
}
在进行文件输出的时候,所有的文件会自动帮助用户创建,不在需要调用createFile()方法手工创建。
这个时候程序如果重复执行,并不会出现内容追加的情况而是一直在覆盖。如果需要文件内容追加,则需要调用FileOutputStream提供的另外一种构造方法。
范例:文件内容追加
package www.bit.java.io;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class TestIO {
public static void main(String[] args) throws Exception{
File file = new File(File.separator + "Users" + File.separator + "yuisama" +
File.separator + "Desktop"
+ File.separator + "hello.txt");
if (!file.getParentFile().exists()) { // 必须保证父目录存在
file.getParentFile().mkdirs() ; // 创建多级父目录
}
// OutputStream是一个抽象类,所以需要通过子类进行实例化,此时只能操 作File类
OutputStream output = new FileOutputStream(file,true) ;//**
// 要求输出到文件的内容
String msg = "I'm bad man\n" ;//**
// 将内容变为字节数组
output.write(msg.getBytes());
// 关闭输出
output.close();
}
}
范例:部分内容输出
package www.bit.java.io;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class TestIO {
public static void main(String[] args) throws Exception{
File file = new File(File.separator + "Users" + File.separator + "yuisama" +
File.separator + "Desktop"
+ File.separator + "hello.txt");
if (!file.getParentFile().exists()) { // 必须保证父目录存在
file.getParentFile().mkdirs() ; // 创建多级父目录
}
// OutputStream是一个抽象类,所以需要通过子类进行实例化,此时只能操 作File类
OutputStream output = new FileOutputStream(file,true) ;//**
// 要求输出到文件的内容
String msg = "I'm bad man\n" ;//**
// 将内容变为字节数组
output.write(msg.getBytes(),0,5);//*****
// 关闭输出
output.close();
}
}