文件输入输出流
1.文件字节类
FileInputStream
,FileOutputStream
都属于字节流
FileInputStream
的父类是InputStream
(抽象类)
FileOutputStream
的父类是OutputStream
(抽象类)
(1)创建流:三种构造方法的重载
```cpp
InputStream fis= new FileInputStream("d:/readme.txt");
OutputStream fos=new FileOutputStream("d:/readme2.txt");
File file=new File("d:/readme.txt");
File file1 =new File("d:/readme2.txt");
InputStream fis2= new FileInputStream(file);
OutputStream fos2=new FileOutputStream(file1);
InputStream fis1= new FileInputStream(new File("d:/readme.txt"));
OutputStream fos1=new FileOutputStream(new File("d:/readme2.txt"));
(2)使用流
文件的读写操作必须要有一个中转站,不能一步完成读写操作。所以在进行读写操作时要首先创建一个中转站。
int m=fis.read();
这段代码中int m
就相当于一个中转站。因为文件是按字节读的,所以fis.read()
方法放回的就是读到的字节数。
fos.write(m);
fos.write(m);
就会把刚才的读到字节写到你指定的文件中。这样利用循环就可以实现一个文件的读写。
但上面的方法,中转站太小了,对于读取较大文件,效率较低。所以可以换一个较大的中转站。使用下面的方法
byte[] buf=new byte[1024];
int n=fis.read(buf);
do{
fos.write(buf,0,n);
n=fis.read(buf);
}while(n!=-1);
这里使用了字节数组,数组的长度时1024。
注意n=fis.read(buf);
方法,这也属于read
方法的重载,他会把读到的内容放入到buf
数组中,并放回读到的字节数。这里的n可以控制最后一次度数据时的长度,防止多读占据空间。
2.文件字符流
FileReader
,FileWriter
都属于字符流
FileReader
父类是Reader
(抽象类)
FileWriter
父类是Writer
(抽象类)
方法与基本字节类的输入输出流的相同。
Reader fr=new FileReader("d:/readme.txt");
Writer fw=new FileWriter("d:/readme2.txt",true);
这里解释一下
Writer fw=new FileWriter("d:/readme2.txt",true);
当我们不加后面的true,对就是对文件的覆盖。加上true这个参数时就是文件的追加。如果你的readme2.txt
文件中每有字符的话,追加就不会生效。
public static void main(String[] args) {
Reader fr=null;
Writer fw=null;
try{
//在业务上有逻辑的代码,可以写在一个try中
fr=new FileReader("d:/readme.txt");
fw=new FileWriter("d:/readme2.txt",true);
char[] cbuf=new char[1024];
int n=fr.read(cbuf);
while(n!=-1){
fw.write(cbuf,0,n);
n=fr.read(cbuf);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
//关闭流应该分开,写两个try
try {
if(fr!=null){
fr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (fw!=null){
fw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
1.只有字节流,没有字符流,字符流的底层还是字节流。字符流是对字节流的封装转换,更利于操作。
2.字节流可以处理任何类型的文件,而字符流只能操作文本文件
3.关闭流要分开处理。