前言
其实写io流类的文章有很多,不过近期要考试了,内容是io流,就当整理下来复习一下,也许写的和很多大佬相比相差很多,所以不足之处还请各位师傅不吝赐教。本博文代码主要参考b站:鸟哥JAVA零基础之IO流详解视频【IntelliJ IDEA版-输入输出流】以及自己的一些补充。
一、文件的简单操作
1.文件的创建
书上对于io流的讲解较为生涩,先从文件的处理入手,下面代码演示的是创建一个新的文件,是否成功取决于你电脑此路径下有没有这个文件,如果文件存在那么创建失败,如果不存在则创建成功。 同理,我们对于文件夹,以及文件夹下套文件夹,也就是多级文件夹都可以进行相似的操作,具体操作如代码所示。
package homework;
import java.io.File;
import java.io.IOException;
public class File_Demo01 {
public static void main(String[] args) {
try {
File file1 = new File("E:\\test.txt");
boolean flag1 = file1.createNewFile();
System.out.println(flag1?"文件创建成功":"文件创建失败");
File file2 = new File("E:\\java_test");
boolean flag2 = file2.mkdir();
System.out.println(flag2?"文件夹创建成功":"文件夹创建失败");
File file3 = new File("E:\\java_io\\io\\test");
boolean flag3 = file3.mkdirs();
System.out.println(flag3?"多级文件夹创建成功":"多级文件夹创建失败");
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果如图所示,你也可以在你的电脑对应路径下面找到相应的文件。
2.文件的删除
对于删除操作,这里先简单使用delete方法,我们直接让文件去调用即可。
package homework;
import java.io.File;
public class File_Demo02 {
public static void main(String[] args) {
File file1 = new File("E:\\test.txt");
boolean flag = file1.delete();
System.out.println(flag?"文件删除成功":"文件删除失败");
}
}
3.文件是否存在
原理也是比较简单的,我们先判断是否存在,使用exists方法。
package homework;
import java.io.File;
public class File_Demo03 {
public static void main(String[] args) {
File file = new File("E:\\test");
boolean flag = file.exists();
if(flag){
System.out.println("文件已经存在");
}else{
file.mkdir();
}
}
}
4.文件内所包含字节数
我们事先在file文件里面写入xiaolang,然后使用length方法去返回所含字节的大小。
String字符串:length(),返回字符串中字符的个数 数组,数组名.length ,属性,获取数组里面元素的个数 集合, 集合对象名.size(),返回集合中元素的个数
package homework;
import java.io.File;
import java.io.IOException;
public class File_Demo04 {
public static void main(String[] args) {
File file = new File("E:\\xiaolang.txt");
try {
file.createNewFile();
Long size = file.length();
System.out.println("size="+size);
} catch (IOException e) {
e.printStackTrace();
}
}
}
5.文件的名字和路径
package homework;
import java.io.File;
import java.io.IOException;
public class File_Demo04 {
public static void main(String[] args) {
File file = new File("E:\\xiaolang.txt");
try {
String fileName = file.getName();
System.out.println("fileName="+fileName);
String path = file.getPath();
System.out.println("path="+path);
} catch (Exception e) {
e.printStackTrace();
}
}
}
6.使用递归的方法扫描文件夹
思路就是:先判断文件是否是文件夹,是文件夹的话,选择某个文件夹下所有文件,如果不是文件夹,获取此文件夹的路径。
package homework;
import java.io.File;
public class File_Demo05 {
public static void showFile(String pathname){
File file = new File(pathname);
boolean flag = file.isDirectory();
if(flag){
File[] files = file.listFiles();
for(int i =0;files!=null&&i<files.length;i++){
boolean flag1 = files[i].isDirectory();
if(flag1){
showFile(files[i].getPath());
}else{
String filePath = file.getPath();
System.out.println("普通文件---》"+filePath);
}
}
}else{
String filePath = file.getPath();
System.out.println("普通文件---》"+filePath);
}
}
public static void main(String[] args) {
File_Demo05.showFile("E:\\");
}
}
我的E盘基本没有文件,所以比较容易看到所有的结果。
二、输入输出流
首先用一张图带你了解基本模式:
1.FileInputStream
代码部分注释掉的部分和下面引用中代码的意思是一样的,只不过更加简洁。
FileInputStream fileInputStream = new FileInputStream(“E:\xiaolang.txt”);
package homework;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class File_Demo06 {
public static void main(String[] args) {
try {
FileInputStream fileInputStream = new FileInputStream("E:\\xiaolang.txt");
int ch = 0;
while((ch=fileInputStream.read())!=-1){
System.out.println((char)ch);
}
fileInputStream.close();
} catch (Exception e) {
System.out.println("文件找不到");
}
}
}
2.FileOutputStream
下面的栗子是我在E盘创建了一个文件,然后把它拷贝到我们的D盘去,这里注意使用file去调用read方法,而使用file1去调用write方法,然后我们统计一下所需要耗费的时间。
package homework;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class File_Demo08 {
public static void main(String[] args) {
try {
long startTime = System.currentTimeMillis();
FileInputStream file = new FileInputStream("E:\\xiaolang.txt");
FileOutputStream file1 = new FileOutputStream("D:\\xiaolang.txt");
int ch = 0;
while ((ch = file.read()) != -1) {
file1.write(ch);
}
file.close();
file1.close();
long endTime = System.currentTimeMillis();
System.out.println("共消耗"+(endTime-startTime)+"ms");
} catch (Exception e) {
System.out.println("文件找不到");
}
}
}
3.BufferedInputStream
我们对上面的栗子进行一些改动,我们使用BufferedInputStream去更快的读取文件,BufferedInputStream继承于FilterInputStream,本质上是通过一个内部缓冲区数组实现的,用read读取输入流的数据时,BufferedInputStream会将该输入流的数据分批次的导入缓冲区。当缓冲区中的数据被读完后,输入流会再次填充缓冲区中的数据;如此循环往复下去,直到读完输入流数据结束。
package homework;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class File_Demo09 {
public static void main(String[] args) {
InputStream inputStream = null;
try {
inputStream = new FileInputStream("E:\\xiaolang.txt");
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
获取时间差和所含字节数:
package homework;
import jdk.swing.interop.SwingInterOpUtils;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class File_Demo09 {
public static void main(String[] args) {
InputStream inputStream = null;
try {
long startTime = System.currentTimeMillis();
inputStream = new FileInputStream("E:\\xiaolang.txt");
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
byte[] temp = new byte[1024];
int len = 0;
while((len = bufferedInputStream.read(temp))!=-1){
System.out.println(len);
}
long endTime = System.currentTimeMillis();
System.out.println("共消耗"+(endTime-startTime)+"ms");
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.FileReader读取文件所含字节数
package homework;
import java.io.FileNotFoundException;
import java.io.FileReader;
public class File_Demo10 {
public static void main(String[] args) {
try {
FileReader fileReader = new FileReader("E:\\xiaolang.txt");
char[] temp = new char[1024];
int len = 0;
while((len=fileReader.read(temp))!=-1){
System.out.println(len);
}
fileReader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
5.FileReader获取文本内容
package homework;
import java.io.FileNotFoundException;
import java.io.FileReader;
public class File_Demo10 {
public static void main(String[] args) {
try {
FileReader fileReader = new FileReader("E:\\xiaolang.txt");
char[] temp = new char[1024];
int len = 0;
while((len=fileReader.read(temp))!=-1){
String s = new String(temp,0,len);
System.out.println(s);
}
fileReader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
6.FileWriter修改文本内容
这个栗子是直接写入:“玛卡巴卡balabala”
package homework;
import java.io.FileWriter;
import java.io.IOException;
public class File_Demo11 {
public static void main(String[] args) {
try {
String s = "玛卡巴卡balabala";
FileWriter fileWriter = new FileWriter("E:\\makabaka.txt");
fileWriter.write(s);
fileWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
而这个是使用追加模式,将内容添加到上一次文本编辑的末尾,如果不使用append模式,那么你的文本文件会被新的文件内容给覆盖。
package homework;
import java.io.FileWriter;
import java.io.IOException;
public class File_Demo11 {
public static void main(String[] args) {
try {
String s = "这是新的内容";
FileWriter fileWriter = new FileWriter("E:\\makabaka.txt",true);
fileWriter.write(s);
fileWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
三、方法总结
1.输入流
InputStream类是字节输入流的抽象类,是所有字节输入流的父类。
read()方法:读取数据的下一个字节,如果到达流末尾而无可用字节,那么返回-1,返回值是0~255的int字节值。
read(byte[ ]b): 读取一定长度的字节,以整数形式返回字节数。
mark(int readlimit): 在当前位置放置一个标志,readlimit参数告知此输入流在标记位置失效前允许读取的字节数。
reset():将输入指针返回当前所作的标记处。
skip(long n):跳过输入流上的n个字节,并且返回实际跳过的字节数。
close(): 关闭此输入流,并且释放相关资源。
此处使用的InputStream来处理我们的字节,但是此方法并不适合用来处理所含字符的文本,对于字符的处理,我们使用的是java里面提供的Reader类去处理,这里的Reader类是字符输入流的抽象类,我们所有的字符输入流的实现都是它的子类。
2.输出流
write(int b):将指定的字节写入此输出流里面。
write(byte[ ] b):将b个字节从指定的byte数组写入此输出流内。
write(byte[ ] b, int off, int len):将指定的byte数组里面,从off的偏移量开始,读取len个字节写入此输出流里面。
flush():彻底完成输出并清空缓存区。
close():关闭输出流。
3.带缓存的输入、输出流
BufferedInputStream(InputStream in) : 此构造方法创建了一个带有32个字节的缓存流。 BufferedInputStream(InputStream in, int size) : 此方法按指定大小创建缓存区。
BufferedOutputStream(OutputStram in) : 创建一个有32个字节的缓存区。 BufferedOutputStream(OutputStream in, int size) : 以指定大小创建缓存区。
BufferedReader类常用方法: read( ) :读取单个字符。 readLine( ) : 读取一个文本行,并将其返回为字符串,当没有数据的时候,返回null。
BufferedWriter类常用方法: 此方法返回类型均为void 。 write(String s,int off, int len) : 写入字符串的某一个部分。 flush():刷新该流的缓存。 newLine():写入一个行分隔符。
4.数据输入、输出流
DataInputStream(InputStream in):使用指定的InputStream创建一个DataInputStream。 DataOutputStream(OutputStream out) : 创建一个新的数据输出流,将数据写入指定的输出流。
DataOutputStream类的三种写入字符串的方法: writeBytes(String s) : 将字符串里面的每一个字符的低字节内容写入目标设备。 (在编程语言中,字符一般是占16位,8位为一字节,所以有高位字节和低位字节。高字节就是指16进制数的前8位。低字节就是指16进制数的后8位。)
writeChars(String s) : 将字符串里面每一个字符的两个字节内容都写入目标设备里面。
writeUTF(String s) : 将字符串按照UTF编码后的字节长度写入目标设备里面。
还有很多操作没有在此写道,本博文只是记录了常用的方法,笔者才疏学浅,如有不足,欢迎各位师傅不吝赐教。
|