I/O流
IO流:
IO流:用于读写数据的(可以读写文件,或网络中的数据…)
I:指Input,称为输入流:负责把数据读到内存中去。
O:指Output,称为输出流:负责写数据出去。
IO流的分类:
按照流的方向:输入流、输出流。
按照流中数据的最小单位:字节流、字符流。
字节流:适合操作所有类型的文件。(比如:音频、视频、图片、文本文件的复制,转移等)
字符流:适合操作纯文本文件。(比如:读写txt、java文件等)
IO流四大流:字节输入流、字节输出流、字符输入流、字符输出流。
字节流:
字节流适合做一切文件数据的拷贝(音视频,文本);字节流不适合读取中文内容输出
FileOutputStream:
FileOutputStream:文件字节输出流。
作用:以内存为基准,把内存中的数据以字节的形式写出到文件中去。
构造器:
构造器 | 说明 |
---|---|
public FileOutputStream(File file) | 创建字节输出流管道与源文件对象接通 |
public FileOutputStream(String filepath) | 创建字节输出流管道与源文件路径接通 |
public FileOutputStream(File file,boolean append) | 创建字节输出流管道与源文件对象接通,可追加数据 |
public FileOutputStream(String filepath,boolean append) | 创建字节输出流管道与源文件路径接通,可追加数据 |
方法:
方法名称 | 说明 |
---|---|
public void write(int a) | 写一个字节出去 |
public void write(byte[] buffer) | 写一个字节数组出去 |
public void write(byte[] buffer , int pos , int len) | 写一个字节数组的一部分出去。 |
public void close() throws IOException | 关闭流。 |
注意:
public FileOutputStream(Stringname):创建文件字节输出流,使用字符串指定文件路径,文件不存在,会创建文件,文件存在会清空文件的内容
public FileoutputStream(Filefile):创建文件字节输出流,使用File对象指定文件路径
FileoutputStream fos= new FileoutputStream(“dayo9-io\abc\1.txt”,true);// append设置为true,不会润清空文件的内容
1.如果路径指定的是文件夹,会出现:FileNotFoundException:dayθ9-io\abc(拒绝访问。)
2.如果父路径不存在,会出现:FileNotFoundException:dayθ9-io\abc2\1.txt(系统找不到指定的路径。)
package com.ouyang.demo03;
import java.io.FileOutputStream;
import java.io.IOException;
public class demo01 {
public static void main(String[] args) throws IOException {
//1.创建文件字节输出流,关联文件
//public FileOutputStream(File file):创建文件字节输出流,使用File对象指定文件路径,文件不存在会创建文件,文件存在会清空文件的内容
// FileOutputStream fos1=new FileOutputStream(new File("day09\\abc\\1.txt"));
//public FileOutputStream(String name):创建文件字节输出流,使用字符申指定文件路径,文件不存在会创建文件,文件存在会清空文件的内容
FileOutputStream fos2=new FileOutputStream("day09\\abc\\1.txt");
//public FileOutputStream(String name, boolean append):append表示在原来的文件末尾追加内容
FileOutputStream fos3=new FileOutputStream("day09\\abc\\1.txt",true);
//2.调用方法把字节数据写到流
//public void write(int b):写一个字节到流中
fos2.write(65);
fos2.write(66);
byte[] bytes=new byte[]{97,98,99,100,101,102};
//public void write(byte b[]):写一个数组的多个字节到流中
fos2.write(bytes);
//public void write(byte b[],int off,int len):写一个字节数组的部分数据到流中,从off开始,长度为len
fos2.write(bytes,1,3);
//3.关闭流
fos2.close();
}
}
FileInputStream:
FileInputStream:文件字节输入流。
作用:以内存为基准,可以把磁盘文件中的数据以字节的形式读入到内存中去。
方法:
构造器 | 说明 |
---|---|
public FileInputStream(File file) | 创建字节输入流管道与源文件接通 |
public FileInputStream(String pathname) | 创建字节输入流管道与源文件接通 |
方法名称 | 说明 |
---|---|
public int read() | 每次读取一个字节返回,如果发现没有数据可读会返回-1. |
public int read(byte[] buffer) | 每次用一个字节数组去读取数据,返回字节数组读取了多少个字节,如果发现没有数据可读会返回-1. |
方法名称 | 说明 |
---|---|
public byte[] readAllBytes() throws IOException | 直接将当前字节输入流对应的文件对象的字节数据装到一个字节数组返回 |
如果文件过大,创建的字节数组也会过大,可能引起内存溢出。
一次读一个字节
package com.ouyang.demo03;
import java.io.FileInputStream;
import java.io.IOException;
public class demo02 {
public static void main(String[] args) throws IOException {
//1.创建文件字节输出流,关联文件
FileInputStream fis=new FileInputStream("day09\\abc\\2.txt");
//2.调用方法把文件数据输出到程序
//读取一个字节
// int b = fis.read();
// System.out.println("b = " + b);
//定义变量保存每次读取的数据
int data;
// 1.fis.read():从文件读取一个字节数据
// 2.data=fis.read():把读取的字节数据赋值给变量data
// 3.data!=-1:判断读取的数据是否是-1(表示文件已经没有数据可以读取了)
while((data=fis.read())!=-1){
System.out.println(data);
}
//3.关闭流
fis.close();
}
}
一次读多个字节
package com.ouyang.demo03;
import java.io.FileInputStream;
import java.io.IOException;
public class demo03 {
public static void main(String[] args) throws IOException {
//1.创建字节输入流,关联文件
FileInputStream fis=new FileInputStream("day09\\abc\\2.txt");
//定义变量保存读取的数量
int len;
//定义数组保存读取的数据(吃饭的碗),实际数组的长度1024的整数倍1024*8
byte[] bytes=new byte[3];
//fis.read(bytes):读取多个字节保存到数组中
//len=fis.read(bytes):读取的字节数量保存到len中
//len!=-1: 等于-1表示该文件已经没有数据可以读取了
while((len=fis.read(bytes))!=-1){
System.out.println("读取内容:"+new String(bytes,0,len));
}
//3.关闭流
fis.close();
}
}
一次性接收所有数据。
package com.ouyang.demo03;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;
public class demo04 {
public static void main(String[] args) throws IOException {
//1.创建字节输入流,关联文件
FileInputStream fis=new FileInputStream("day09\\abc\\2.txt");
byte[] bytes = fis.readAllBytes();
String s = new String(bytes);
System.out.println("s = " + s);
String s1 = Arrays.toString(bytes);
System.out.println("s1 = " + s1);
}
}
文件复制:
package com.ouyang.demo03;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class demo05 {
public static void main(String[] args) throws IOException {
//输入
FileInputStream fis=new FileInputStream("day09\\abc\\2.txt");
//输出
FileOutputStream fos =new FileOutputStream("day09\\abc\\22.txt");
byte[] bytes=new byte[3];
int len;
while((len=fis.read(bytes))!=-1){
fos.write(bytes,0,len);
}
//关流
fos.close();
fis.close();
}
}
释放资源:
try-catch-finally:
finally代码区的特点:无论try中的程序是正常执行了,还是出现了异常,最后都一定会执行finally区,除非JVM终止。
作用:一般用于在程序执行完成后进行资源的释放操作(专业级做法)。
package com.ouyang.demo03;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
//jdk1.7之前的写法
public class demo06 {
public static void main(String[] args) {
FileInputStream fis=null;
try {
fis=new FileInputStream("day09\\abc\\2.txt");
} catch (FileNotFoundException e) {
System.out.println("处理了异常" + e);
} finally {
if(fis!=null){
try {
fis.close();
} catch (IOException e) {
System.out.println("处理了异常" + e);
}
}
}
}
}
try-with-resource:
格式:
try (定义资源1;定义资源2;…){
可能出现异常的代码;
} catch (异常类名 变量名) {
异常的处理代码;
}
该资源使用完毕后,会自动调用其close()方法,完成对资源的释放。
try的 () 中只能放置资源,否则报错。
package com.ouyang.demo03;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class demo07 {
public static void main(String[] args) {
//try()括号里写的是实现了AutoCloseable接口的类
try (FileInputStream fis = new FileInputStream("day09\\abc\\2.txt");
FileOutputStream fos=new FileOutputStream("day09\\abc\\1.txt");
) {
} catch (FileNotFoundException e) {
System.out.println("处理了文件不存在异常 " + e);
} catch (IOException e) {
System.out.println("IO异常 " + e);
}
}
}