------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
兴趣是学习编程最好的老师
不积跬步,无以至千里
这辈子没办法做太多事情,所以每一件都要做到精彩绝伦。
<IO流>
1.IO流概念
IO流用来处理设备之间的数据传输,Java对数据的操作是通过流的方式,流按流向分为两种:输入流,输出流。
流按操作类型分为两种:字节流与字符流。字节流可以操作任何数据,字符流只能操作纯字符数据,比较方便。
2.IO流常用父类
字节流的抽象父类:
InputStream ,OutputStream
字符流的抽象父类:
Reader , Writer
<字节流>
1.读取文件
创建FileInputStream对象, 指定一个文件. 文件必须存在, 不存在则会抛出FileNotFoundException
使用read()方法可以从文件中读取一个字节. 如果读取到文件末尾会读到-1
读取结束后需要释放资源, 调用close()方法关闭输入流
2.写出文件
创建FileOutputStream对象, 指定一个文件. 文件不存在会创建新文件, 存在则清空原内容. 如果需要追加, 在构造函数中传入true.
使用write()方法可以向文件写出一个字节.例如:FileOutputStream fos = new FileOutputStream("bbb.txt",true);
写出结束后同样需要调用close()
3.拷贝文件
可以从文件中逐个字节读取, 逐个字节写出, 但这样做效率非常低
我们可以定义一个数组作为缓冲区, 一次读取多个字节装入数组, 然后再一次性把数组中的字节写出
例如:拷贝一个txt文件。
class Demo{
public static void main(String[] agrs)throws FileNotFoundException, IOException{
FileInputStream fis = new FileInputStream("aaa.txt");
FileOutputStream fos = new FileOutputStream("bbb.txt");
int b;
while((b=fis.read()!=-1)){
fos.write(b);
}
fis.close;
fos.close;
}
}
4.常用方法
InputStream:
read() 读取一个字节
read(byte[]) 读取若干(数组长度)字节
available() 获取可读的字节数
close() 关闭流, 释放资源
OutputStream:
write(int) 写出一个字节
write(byte[]) 写出数组中的所有字节
write(byte[],start,len);
close() 关闭流, 释放资源
例如:
class Demo{
public static void main(String[] agrs)throws FileNotFoundException, IOException{
FlieInputStream fis = new FlieInputStream("aaa.txt");
FileOutputStream fos = new FileOutputStream("bbb.txt");
byte[] arr = new byte[1024*8]; //创建字节数组长度为1024*8
int len;
while((len = fis.read(arr)!=-1)){ //将数据读到字节数组中
fos.write(arr,0,len);} //从字节数组中写出去,写到文件上
fis.close();
fos.close();
}
}
5.BufferedInputStream
BufferedInputStream内置了一个缓冲区(数组)大小为:8192
当缓冲区中所有的都被使用完, 才重新从文件中读取8192
BufferedOutputStream
BufferedOutputStream也内置了一个缓冲区(数组)
程序向流中写出字节时, 不会直接写到文件, 先写到缓冲区中
直到缓冲区写满, BufferedOutputStream才会把缓冲区中的数据一次性写到文件里。如图:
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("aaa.mp3");
BufferedInputStream bis = new BufferedInputStream(fis); //包装输入流
FileOutputStream fos = new FileOutputStream("bbb.mp3");
BufferedOutputStream bos = new BufferedOutputStream(fos); //包装输出流
int b;
while((b = bis.read()) != -1) { //读一次先将缓冲区读满,再一个一个的返给b
bos.write(b); //写一次,是先将缓冲区装满,再一起写出
}
bis.close();
bos.close();
}
6.标准处理代码
public static void main(String[] args) throws IOException {
//demo1();
try(
FileInputStream fis = new FileInputStream("aaa.txt");
FileOutputStream fos = new FileOutputStream("bbb.txt");
MyClose mc = new MyClose();
){
int b;
while((b = fis.read()) != -1) {
fos.write(b);
}
}
}
<字符流>
1.字符流是可以直接读写字符的IO流,字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写出。
2.FileReader类的read()方法可以按照字符大小读取。
FileWriter类的write()方法可以自动把字符转为字节写出。
文件的拷贝:
class Demo{
public static void main(String[] agrs)throws FileNotFoundException, IOException{
FileReader fr = new FileReader("aaa.txt");
FileWriter fw = new FileWriter("bbb.txt");
int ch;
while((ch = fr.read()!=-1)){
fw.write(ch);
}
fr.close();
fw.close();
}
}
class Demo{
public static void main(String[] args)throws FileNotFoundException, IOException{
FileReader fr = new FileReader("aaa.txt");
FileWriter fw = new FileWriter("bbb.txt");
bety[] arr = new bety[1024*8];
int len;
while((len = fr.read(arr))!=-1){
fw.write(arr,0,len);
}
fr.close();
fw.close();
}
}
3.带缓冲的字符流
BufferedReader的read()方法读取字符时会一次读取若干字符到缓冲区, 然后逐个返回给程序, 降低读取文件的次数, 提高效率
BufferedWriter的write()方法写出字符时会先写到缓冲区, 缓冲区写满时才会写到文件, 降低写文件的次数, 提高效率
BufferedReader的readLine()方法可以读取一行字符(不包含换行符号)
BufferedWriter的newLine()可以输出一个跨平台的换行符号"\r\n"
BufferedReader br = new BufferedReader(new FileReader("aaa.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("copy.txt"));
int ch;
while((ch = br.read()) != -1) {
bw.write(ch);
//bw.flush();
//bw.close();
}
br.close();
bw.close();
}
4.LineNumberReader是BufferedReader的子类, 具有相同的功能, 并且可以统计行号
调用getLineNumber()方法可以获取当前行号
调用setLineNumber()方法可以设置当前行号
public static void main(String[] args) throws IOException {
LineNumberReader lnr = new LineNumberReader(new FileReader("aaa.txt"));
String line;
lnr.setLineNumber(100); //设置行号
while((line = lnr.readLine()) != null) {
System.out.println(lnr.getLineNumber() + ":" + line); //获取行号
}
lnr.close();
}
5.使用指定的码表读取字符
FileReader是使用默认码表读取文件, 如果需要使用指定码表读取, 那么可以使用InputStreamReader(字节流,编码表)
FileWriter是使用默认码表写出文件, 如果需要使用指定码表写出, 那么可以使用OutputStreamWriter(字节流,编码表)程序代码及示意图如下:
public static void main(String[] args) throws IOException {
BufferedReader br =
new BufferedReader(new InputStreamReader(new FileInputStream("day22笔记.txt"),"gbk"));
BufferedWriter bw =
new BufferedWriter(new OutputStreamWriter(new FileOutputStream("UTF-8.txt"),"UTF-8"));
int ch;
while((ch = br.read()) != -1) {
bw.write(ch);
}
br.close();
bw.close();
}