1.IO流
在java中把不同的输入/输出源(键盘、文件、网络连接等)抽象表述为“流”,通过流的方式允许java程序使用相同的方式来访问不同的输入/输出源。
1.1流的分类
按照不同的分类方式,可以将流分为不同类型。
(1)输入流和输出流
按照流的流向来分,可以分为输入流和输出流。
输入流:只能从中读取数据,而不能向其写入数据。
输出流:只能向其写入数据,而不能从中读取数据。
这里的输入、输出都是从程序运行所在内存的角度来划分的。数据从内存到硬盘,通常称为输出流。
1.2字节流和字符流
字节流和字符流的用法几乎完全一样,区别在于字节流和字符流所操作的数据单元不同。字节流操作的数据单元是8位的字节,而字符流操作的数据单元是16位的字符。
字节流主要由InputStream和OutputStream作为基类,而字符流则主要由Reader和Writer作为基类。
1.3节点流和处理流
可以从/向一个特定的IO设备(如磁盘/网络)读/写数据的流,称为节点流,节点流也被称为低级流。
处理流用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据读写功能。处理流也被称为高级流。(java使用处理流来包装节点流是一种典型的装饰器设计模式,通过使用处理流来包装不同的节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入/输出功能。)
2.字节输出流OutputStream
OutputStream此抽象类,表示输出字节流所有类的父类,操作的数据都是字节。
2.1FileOutputStream
FileOutputStream类,即文件输出流,是用于将数据写入File的输出流。
构造方法:
2.2FileOutputStream写入数据到文件中
示例:
package com.xupt.fos;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStream01 {
public static void main(String[] args) throws IOException {
File file=new File("F:\\AAA\\aa.txt");
FileOutputStream fos=new FileOutputStream(file);
fos.write("既然选择了远方,那么留给世界的只能是背影".getBytes());
fos.close();
}
}
3.字节输入流InputStream
InputStream此抽象类,是表示字节输入流的所有类的父类,定义了字节输入流的基本共性功能方法。
int read():读取一个字节并返回,没有字节返回-1.
int read(byte[]): 读取一定量的字节数,并存储到字节数组中,返回读取到的字节数。
3.1FileInputStream
FileInputStream 从文件系统中的某个文件中获得输入字节。
构造方法:
3.2 FileInputStream读取数据
在读取文件中的数据时,调用read方法,实现从文件中读取数据。
(1)一次读取一个字节
示例:
package com.xupt.fos;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputStream01 {
public static void main(String[] args) throws IOException {
File file=new File("F:\\AAA\\a.txt");
FileInputStream fis=new FileInputStream(file);
int len=0;
while((len=fis.read())!=-1){
System.out.print((char)len);
}
fis.close();
}
}
(2)一次读取一个字节数组
package com.xupt.fos;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputStream02 {
public static void main(String[] args) throws IOException {
File file=new File("F:\\AAA\\a.txt");
FileInputStream fis=new FileInputStream(file);
byte[] b=new byte[1024];
int len=0;
while((len=fis.read(b))!=-1){
System.out.println(new String(b,0,len));
}
fis.close();
}
}
3.3复制文件
方式一:
package com.xupt.fos;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class copyFile {
public static void main(String[] args) throws IOException {
File srcFile=new File("F:\\AAA\\a\\1.jpg");
File destFile=new File("F:\\AAA\\b\\1.jpg");
FileInputStream fis=new FileInputStream(srcFile);
FileOutputStream fos=new FileOutputStream(destFile);
int len=0;
while((len=fis.read())!=-1){
fos.write(len);
}
fos.close();
fis.close();
}
}
方式二:
package com.xupt.fos;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class copyFile02 {
public static void main(String[] args) throws IOException {
File srcFile=new File("F:\\AAA\\a\\2.jpg");
File destFile=new File("F:\\AAA\\b\\2.jpg");
FileInputStream fis=new FileInputStream(srcFile);
FileOutputStream fos=new FileOutputStream(destFile);
//定义一个缓冲区
byte[] b=new byte[1024];
int len=0;
while((len=fis.read(b))!=-1){
//将数组中的指定长度的数据写入到输出流中
fos.write(b,0,len);
}
fos.close();
fis.close();
}
}
4.字符输入流Reader
Reader是字符输入流的抽象父类,本身并不能创建实例来执行输入。
read():读取单个字符并返回
read(char[]):将数据读取到数组中,并返回读取的个数。
4.1FileReader
构造方法:
FileReader读取文本文件:
package com.xupt.reader;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderTest01 {
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("a.txt");
int len=0;
while((len=fr.read())!=-1){
System.out.print((char)len);
}
fr.close();
}
}
5.字符输出流Writer
Writer是字符输入流的抽象父类,其方法如下:
5.1FileWriter
构造方法:
FileWriter将中文写入文本文件中:
package com.xupt.writer;
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterTest01 {
public static void main(String[] args) throws IOException {
FileWriter fw=new FileWriter("a.txt");
fw.write("我可以等在这路口,不管你会不会经过");
fw.flush();
fw.close();
}
}
写入字符到文件中,先进行流的刷新,再进行流的关闭。
5.2flush()和close()的区别
flush():将流中的缓冲区缓冲的数据刷新到目的地中,刷新后,流还可以继续使用。
close():关闭资源,但在关闭前会将缓冲区中的数据先刷新到目的地,否则丢失数据,然后在关闭流。流不可以使用。如果写入数据多,一定要一边写一边刷新,最后一次可以不刷新,由close完成刷新并关闭。
6.字符流复制文本文件
package com.xupt.copy;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyFile {
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("a.txt");
FileWriter fw=new FileWriter("b.txt");
char[] c=new char[1024];
int len=0;
while((len=fr.read(c))!=-1){
fw.write(c, 0, len);
fw.flush();
}
fw.close();
fr.close();
}
}