| 输入流 | 输出流 |
字节流 | InputStream | OutputStream |
字符流 | Reader | Writer |
一、FileOutputStream(文件字节输出流)
FileOutputStream extends OutputStream。
构造方法:
FileOutputStream(String name):创建一个向具有指定名称的文件中写入数据的输出流文件流。
FileOutputStream(File file):创建一个向指定File对象表示的文件中写入数据的文件输出流。
1.构造方法的作用:
(1).创建一个FileOutputStream对象。
(2).会根据构造方法中传递的文件或文件路径,创建一个空的文件。
(3).会把FileOutputStream对象指向创建好的文件。
2.字节输出流的使用步骤:
(1).创建一个FileOutputStream对象,构造方法中传递写入数据的目的地。
(2).调用FileOutputStream对象中的方法write,把数据写入文件中。
(3).释放资源。
代码示例:
try {
FileOutputStream fos = new FileOutputStream("E:\\iostream\\a.txt");
fos.write('a');
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
写入多个字节:
try {
FileOutputStream fos = new FileOutputStream(new File("E:\\iostream\\b.txt"));
//byte[] bytes = {65,66,67,68,69};
byte[] bytes = "hello world!".getBytes();
fos.write(bytes);
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
3.字节输出流的续写和换行
try {
FileOutputStream fos = new FileOutputStream(new File("E:\\iostream\\c.txt"),true);
for (int i = 0; i < 10; i++) {
fos.write("hello world!".getBytes());
fos.write("\r\n".getBytes());//换行 window:\r\n,linux:/n
}
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
二、FileInputStream(文件字节输入流)
FileInputStream extends InputStream
构造方法:
FileInputStream(String name):
FileInputStream(File file):
1.构造方法的作用:
(1).创建一个FileInputStream对象。
(2).会把FileInputStream对象指定构造方法中要读取的文件。
2.字节输入流的使用步骤:
(1).创建FileInputStream对象,构造方法中绑定要读取的数据源。
(2).使用FileInputStream对象中的方法read,读取文件。
(3).释放资源。
示例代码:
try {
FileInputStream fis = new FileInputStream("E:\\iostream\\b.txt");
//fis.read();//读取文件中的一个字节并返回,读取到文件的末尾返回-1
int len = 0;
while ((len = fis.read())!= -1){
System.out.print((char)len);//循环读取单个字节
}
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
3.文件复制
思想:
(1).创建一个字节输入流对象,构造方法中绑定要读取的数据源。
(2).创建一个字节输出流对象,构造方法中绑定要写入的目的地。
(3).使用字节输入流对象中的方法read读取文件。
(4).使用字节输出流中的方法write,把读取到的字节写入到目的地的文件中。
(5).释放资源。
代码示例:
try {
FileInputStream fis = new FileInputStream("E:\\iostream\\c.txt");
FileOutputStream fos = new FileOutputStream("E:\\iostream\\d.txt");
//一个字符一个字符复制效率比较低
/*int len;
while ((len = fis.read())!= -1){
fos.write((char)len);
}*/
//将要读取的内容放到byte数组中缓冲
byte[] bytes = new byte[1024];
int len = 0;
while((len = fis.read(bytes)) != -1){
fos.write(bytes,0,len);
}
fis.close();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
三、FileReader(文件字符输入流)
FileReader extends InputStreamReader extends Reader
把硬盘中文件中的数据以字符的方式读取到内存中。
构造方法:
FileReader(String fileName)
FileReader(File file)
构造方法的作用:
1.创建一个FileReader对象。
2.会把FileReader对象指向要读取的文件。
字符输入流的使用步骤:
1.创建FileReader对象,构造方法中绑定要读取的数据源。
2.使用FileReader对象中的方法read读取文件。
3.释放资源。
代码示例:
try {
FileReader fr = new FileReader("E:\\filereader.txt");
int len = 0;
while((len = fr.read())!=-1){
System.out.print((char) len);
}
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
四、FileWriter(文件字符输出流)
FileWriter extends OutputStreamWriter extends Writer
把内存中的字符数据写入到文件中
构造方法:
FileWriter (File file)
FileWriter (String name)
构造方法的作用:
1.创建一个FileWriter对象。
2.根据构造方法中传递的文件/文件路径创建文件。
3.把FileWriter对象指向创建好的文件。
字符输出流的使用步骤:
1.创建一个FileWriter对象,构造方法中绑定写入数据的目的地。
2.使用FileWriter中的方法Write,把数据写入到内容缓冲区中(字符转换为字节的过程)。
3.使用FileWriter中的flush,把内存缓冲区中的数据刷新到文件中。
4.释放资源,把内存缓冲区中的数据刷新到文件中。
flush和close的区别:
它们两个都可以把内存缓冲区中的数据刷新到文件中。
flush:刷新缓冲区,流对象可以继续使用。
close:先刷新缓冲区,然后通知系统释放资源,流对象不可以灾被使用。
代码示例:
FileWriter fw = null;
try {
fw = new FileWriter(new File("E:\\fileWriter"),true);//true可以续写
char[] crs = {'a','b','c'};
fw.write(97);
fw.flush();
fw.write(crs);
fw.write("哈哈哈哈哈###");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}