一? 流的基本概念
? 一个流(Stream)是一个有序的字节序列。当进行输入和输出数据操作时,数据从信息源流向目的地。流中的字节具有严格的顺序,按先进先出的要求操作。因此流式输入/输出(流式I/O)是一种顺序存取方式。?
Java中的流式I/O类都在java.io包中。有各种不同的流类来满足不同性质的输入/输出需求。?
按数据流向分为:输入/输出
按操作方法分为:字节(0/1)/字符流
字符流:Reader(抽象类) : (实现类)FileReader(普通输入)? BufferedReader(高效输入)(缓冲)
? ? ? ? ? ? ? ?Writer : FileWriter(普通输出)? BufferedWriter(高效输出)?
字节流:InputStream: FileInputStream(普通输入)? BufferedInputStream(高效输入)
? ? ? ? ? ? ? OutputStream:FileOutputStream(普通输出)? BufferedOutnputStream(高效输出)
二? File? 文件或文件夹
构造方法:?
File(String pathname)?//根据字符串形式的路径
File(String parent , String child) // 根据父目录与子目录
Flie(File parent , String child) //父目录是file的对象
成员方法:
创建功能://如果不存在,就创建返回true,否则就不创建,返回false
creatNewFile(); //创建文件 使用时需要注意异常:路径可能错误 可用throws在方法名后抛出异常
mkdir 或 mkdirs(); //创建目录(文件夹)mkdir : make directory的缩写
//mkdir 创建单级目录 //mkdirs 创建多级目录(也可以单级目录)
判断功能:
isDirectory(); //判断File对象是否为目录(文件夹)
isFile(); //判断file对象是否为文件
exists(); //判断file对象是否存在的
获取功能:
getAbsolutePath(); //获取绝对路径 绝对路径:以盘符开头的路径是固定死的 例如:D:/1.txt
getPath(); //获取相对路径 相对路径:一般指相对于当前项目的路径 例如 1.txt
getName(); //获取文件名
list(); //获取指定目录下所有文件(夹)名称数组
listFiles(); //获取指定目录下所有文件(夹)file数组
注意: list() 的返回值是 String[] 字符串数组 在输出时需要使用for
例:String[] name = file2.list();
for(String names: name){
System.out.println(names);
}
listFiles()的返回值是 file[] File数组 相当于返回了File对象 即可调用file方法
例:File[] files = file2.listFiles();
for (File file : files) {
System.out.println(file);
}
注意:
- 盘符不区分大小写。
- Java中的 " \ "有特殊作用(被称为转义字符:转义后面一个字符)所以在写路径时要写? ? ? ? “? \\ "? 或是 “ / ”。
三? 字符流读写文件
字符流读数据--按单个字符读取
创建字符流读文件对象:
Reader reader = new FileReader("文件路径"); //Reader为抽象类 不能实例化
调用方法读取数据:
int date = reader.read(); //读取一个字符返回该字符代表的整数,若是达到末尾则返回 -1
异常处理:
throws IOExpection //也可try catch
关闭资源:
reader.close();
使用while简化
int a = reader.read();
while (a != -1){
System.out.println(a);
a = reader.read();
}
注意:reader 每读取一次字符,指针向后移动一位。所以一次while里面只能读一次。
字符流读数据--按字符数组读取
创建字符流读文件对象:
Reader reader = new FileReader("文件路径");
调用方法读取数据
char[] chs = new char[];
int len = reader.read(chs); //读取字符到数组中,返回读取的有效字符数,读不到有效则返回-1
异常处理:
throws IOException
关闭资源:
reader.close();
使用while 简化代码:
char[] a = new char[1];
while ((reader.read(a) != -1)){
System.out.print(a);
}
可得到全部文本
?字符流写数据--按单个字符写入
创建字符流写文件对象:
Writer writer = new FileWriter("路径");
调用方法写入数据:
char x = '中';
writer.write(x);
异常处理:
throws IOException;
关闭资源:
writer.close();
字符流写数据--按字符数组写入
创建字符流写文件对象:
Writer writer = new FileWriter("路径");
调用方法写入数据:
char[] chs = {'中' , '国' ,‘好’};
writer.write(chs);
异常处理:
throws IOException;
关闭资源:
writer.close();
字符流写数据--按字符串写入
创建字符流写文件对象:
Writer writer = new FileWriter("路径");
调用方法写入数据:
String s = " "
writer.write(s);
异常处理:
throws IOException;
关闭资源:
writer.close();
注意:使用新对象写入文件后会将原文件内容覆盖
字符流拷贝文件--按单个字符写入
先创建字符流读文件对象:
Reader reader = new FileReader("数据源文件的路径");
再创建字符流写文件对象:
Writer writer = new FileWriter(“目的地文件的路径”);
调用方法读取文件:
int date = reader.read();
调用方法写文件:
writer.write("date"); //需要while循环
int len = reader.read();
while (len != -1){
writer.write(len);
len = reader.read();
}
异常类处理:
throws IOExpection;
关闭资源:
reader.close();
writer.close();
核心6步:
1 创建输入流对象,关联数据源文件。
2 创建输出流对象,关联目的地文件。
3 定义变量,记录读取到的内容。
4 循环读取,只要条件满足,就一直读,并将读取到的内容赋值给变量。
5 将读取到的内容,写入目的地文件。
6 资源释放。
注意:当目的地文件不存在时可自动创建。
字符流拷贝文件--按字符数组写入
先创建字符流读文件对象:
Reader reader = new FileReader("数据源文件的路径");
再创建字符流写文件对象:
Writer writer = new FiLeWriter(“目的地文件的路径”);
调用方法读取文件:
char[] chs = new char[2048]; //长度定义为1024的整数倍
调用方法写文件:
int len;
while(len = reader.read(chs) != -1){
writer.write(chs , 0 , len);
}
异常类处理:
throws IOExpection;
关闭资源:
reader.close();
writer.close();
四? 字符缓冲流读写文件
字符缓冲流拷贝文件的标准代码
先创建字符流读文件对象:
Reader reader = new BufferedReader(new FileReader(“数据源文件的路径”));
再创建字符流写文件对象:
Writer writer = new BufferedWriter(new FileWriter(“目的地文件的路径”));
调用方法读取文件:
调用方法写文件:
int len = reader.read();
while (len != -1){
writer.write(len);
len = reader.read();
}
异常类处理:
throws IOExpection;
关闭资源:
reader.close();
writer.close();
注意:字符缓冲区的大小为16KB,底层按照字符数组读写
字符缓冲流拷贝文件的独有方法:一次读一行
BufferReader:
成员方法: public String readLine(); //一次读取一行并返回读取内容,读不到就返回null
BufferWriter:
成员方法: public void newLine(); //根据当前操作系统给出对应的换行符
//使用BufferedReader声明,调用其特有方法
BufferedReader br = new BufferedReader(new FileReader("lib/1.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("lib/3.txt"));
String s;
while ((s = br.readLine()) != null){
bw.write(s);
bw.newLine();
}
br.close();
bw.close();
注意:字符流只能拷贝纯文本文件 txt
五? 字节流读写文件:
字节流拷贝文件--按单个字节读写:
创建字节流读文件对象:
InputStream is = new FileInputStream("文件源路径"); //InputStream为抽象类 不能实例化
创建字节流写文件对象:
OutputStream os = new FileOutputStream("目的地路径");
异常处理:
throws IOExpection
使用while循环读写数据
int a;
while ((a = is.read()) != -1){
os.write();
}
关闭资源:
is.close();
os.close();
注意:reader 每读取一次字节,指针向后移动一位。所以一次while里面只能读一次。
字节流拷贝文件--按字节数组读写:
创建字节流读文件对象:
InputStream is = new FileInputStream("文件源路径"); //InputStream为抽象类 不能实例化
创建字节流写文件对象:
OutputStream os = new FileOutputStream("目的地路径");
异常处理:
throws IOExpection
定义字节数组:
byte[] b = new byte[1024];
使用while循环读写数据
int len;
while ((len = is.read(b)) != -1){
os.write(b , 0 ,len);
}
关闭资源:
is.close();
os.close();
六? 字节缓冲流读写文件
创建字节流读文件对象:
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("文件源"));
创建字节流写文件对象:
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("目的地"));
异常处理:
throws IOExpection
使用while循环读写数据
int a;
while ((a = bis.read()) != -1){
bos.write(a);
}
关闭资源:
bis.close();
bos.close();
字节缓冲区大小为8kb,底层按照字节数组读写
?总结:拷贝文件txt使用字符流,其他(图片,音频,视频)使用字节流
|