字节流
节点流FileInputStream的使用
构造方法:
FileInputStream fis = new FileInputStream("文件目录");
FileInputStream fis = new FileInputStream(文件对象);
常用方法
int fis.read() 读取一个字节的数据,并返回int类型,如果返回-1表示文件读完了
int fis.read(byte[] bys) 将读取的内容装进字节数组内,字节数组要提前初始化,一般设置为1024的整数倍,返回的是当次读取到的字节数
节点流FileOutputStream的使用
构造方法:
同上
常用方法
void fos.write(int b) 将指定字节b写入文件
void fos.write(byte[] bys) 将字节数组写入文件
void fos.write(byte[] bys, int off, int len) 将字节数组部分写入文件,并设置偏移量和长度,本方法常用!
文件拷贝
public static void copy(File src,File dest) throws IOException {
FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(dest);
byte[] bys = new byte[1024]; //自定义缓冲区
int len = 0;
while((len = fis.read(bys))!=-1) {
fos.write(bys,0,len);
}
fos.close();
fis.close();
}
套接流BufferedInputStream的使用
带缓冲区的字节流
构造法方法:
BufferedInputStream bis = new BufferedInputStream(InputStream的实现对象);
BufferedInputStream bis = new BufferedInputStream(InputStream的实现对象, int size); //自定义缓冲区大小,默认是8192字节8KB
常用方法:
使用方法同FileInputStream,但是由于自带缓冲区,读写效率极大提高,建议使用带缓冲区的流
套接方式:
该类可套接FileInputStream
套接流BufferedOutputStream的使用
构造方法
BufferedOutputStream bos = new BufferedOutputStream(InputStream的实现对象);
BufferedOutputStream bos = new BufferedOutputStream(InputStream的实现对象, int size); //自定义缓冲区大小,默认是8192字节8KB
常用方法:
使用方法同FileOutStream,但是由于自带缓冲区,读写效率极大提高,建议使用带缓冲区的流
该类可套接FileOutputStream
BufferedOutputStream和自定义缓冲区的FileOutputStream区别是
BufferedOutputStream在缓冲区不满的情况下不会写入操作,需要flush()方法
文件拷贝四种方法
public class Test {
public static void main(String[] args) throws IOException{
File srcFile = new File("C:\\Users\\liweihao\\Documents\\就业班课程15\\day9\\视频\\15_IO流小结.mp4");
File destFile = new File("myLesson\\qq.avi");
long beginTime = System.currentTimeMillis();
copy_02(srcFile,destFile);
long endTime = System.currentTimeMillis();
System.out.println("一共耗时:"+(endTime-beginTime));
}
public static void copy_01(File srcFile, File destFile) throws IOException {
//method 1
FileInputStream fis = new FileInputStream(srcFile);
FileOutputStream fos = new FileOutputStream(destFile);
int byt;
while((byt=fis.read())!=-1) {
fos.write(byt);
}
fis.close();
fos.close();
}
public static void copy_02(File srcFile, File destFile) throws IOException {
//method 1
FileInputStream fis = new FileInputStream(srcFile);
FileOutputStream fos = new FileOutputStream(destFile);
int len;
byte[] byts = new byte[8192];
while((len=fis.read(byts))!=-1) {
fos.write(byts,0,len);
}
fis.close();
fos.close();
}
public static void copy_03(File srcFile, File destFile) throws IOException {
//method 1
FileInputStream fis = new FileInputStream(srcFile);
FileOutputStream fos = new FileOutputStream(destFile);
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
int bys;
while((bys=bis.read())!=-1) {
bos.write(bys);
}
bis.close();
bos.close();
}
public static void copy_04(File srcFile, File destFile) throws IOException {
//method 1
FileInputStream fis = new FileInputStream(srcFile);
FileOutputStream fos = new FileOutputStream(destFile);
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
int len;
byte[] byts = new byte[1024];
while((len=bis.read(byts))!=-1) {
bos.write(byts,0,len);
}
bis.close();
bos.close();
}
}
字符流
套接流InputStreamReader
构造方法
InputStreamReader isr = new InputStreamReader(InputStream的实现对象);
InputStreamReader isr = new InputStreamReader(InputStream的实现对象,String charset); //指定编码方式,重要
套接方式:
该类可套接FileInputStream
套接流OutputStreamWriter
构造方法
OutStream不写了,。同上
该类可套接FileOutputStream
套接流FileReader和FileWriter
是InputStreamReader和OutputStreamWriter的继承类,本身不提供新方法,但是其构造函数可以直接传文件或文件目录,方便初始化流,一般作为中间件使用
构造方法:
套接流BufferedReader
字符缓冲流,不仅自带缓冲区,还提供了一些特有的方法
构造方法,传Reader类的对象,一般使用FileReader
BufferedReader br = new BufferedReader(FileReader("文件路径"));
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputstream("文件路径")));
特有方法:readLine( ) //读一行,但不包括换行符
套接流BufferedWriter
字符缓冲流,不仅自带缓冲区,还提供了一些特有的方法
构造方法,同上
特有方法:
write(String s) //可以直接写一行字符串,如果要换行则需要追加\r\n,但是不同操作系统换行符不一样,因此使用下面的方法更好
newLine() //根据不同的操作系统产生对应的换行符
public class BufferedCopyDemo {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("myLesson\\f.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("myLesson\\f1.txt"));
String str;
while((str = br.readLine())!=null) { //注意,读到文件末尾会返回null而不是-1
bw.write(str);
bw.newLine();
bw.flush();
}
br.close();
bw.close();
}
}
编码解码问题
字符串->字节数组 编码过程
字节数组->字符串 解码过程
public static void main(String[] args) throws UnsupportedEncodingException {
String s = "中国";
byte[] bys = s.getBytes("GBK");//指定编码字符集
System.out.println(Arrays.toString(bys));
String s2 = new String(bys,"GBK");//指定解码字符集
System.out.println(s2);
}
流的编码和解码问题
只能用字符流来处理编码问题
只有InputStreamReader/OutputStreamWriter 类可以处理,在调用构造函数时传入字符集名称作为第二参数
注意:所有自带缓冲区的流,在缓冲区不满/不空的时候是不会进行硬盘的访问操作的
标准输入流
常用的System.in本质上是InputStream,是一个字节流,可以外套字符流处理
可以手动使用套节后的字符流处理一行输入信息,不过Scanner类为我们封装好了这样的方法,使用的时候直接new Scanner(System.in)即可
标准输出流
PrintStream 打印流
构造方法:传入OutputStream的实现类
方法:
除了基本的write方法外,还有各种print方法,可以按数据实际类型打印
PrintWriter 字符打印流
构造方法:传入Writer的实现类
特点:可以在构造的时候指定自动刷新,再结合println方法,可以替代传统的write三连
bw.write("");
bw.newLine();
bw.flush();
特有方法:println() //直接输出一行,还会自动刷新(需要构造函数指定)
复制文件
public static void main(String[] args) throws IOException {
File srcFile = new File("C:\\Users\\liweihao\\Pictures\\wallhaven-673719.jpg");
File destFile = new File("myWork\\pic.jpg");
FileInputStream fis = new FileInputStream(srcFile);
FileOutputStream fos = new FileOutputStream(destFile);
byte[] buffer = new byte[1024];
int len;
while((len=fis.read(buffer))!=-1) {
fos.write(buffer,0,len);
}
fos.close();
fis.close();
}
递归遍历文件夹中所有文件
public class ShowDirectory {
public static void main(String[] args) {
File file = new File("C:\\Users\\liweihao\\Documents\\就业班课程15");
show(file);
}
public static void show(File file) {
File[] files = file.listFiles();
for(File f:files) {
if(f.isDirectory()) {
show(f);
}else if(f.isFile()) {
System.out.println(f.getAbsolutePath());
}
}
}
}
|
|