1.什么是File类
File类就是当前系统中,文件或文件夹的抽象表示
2.File的绝对路径和相对路径
绝对路径是从盘符开始
相对路径是不带盘符,默认到当前工程下的目录寻找文件
File file1 = new File("D:\demo\a.txt");
File file=new File(FileTest.class.getResource("/application.yml").getFile());
3.File的常用方法
| 方法名称 | 说明 |
| public boolean isDirectory() | 测试此抽象路径名表示的File是否为文件夹 |
| public boolean isFile() | 测试此抽象路径名表示的File是否为文件 |
| public boolean exists() | 测试此抽象路径名表示的File是否存在 |
| public boolean createNewFile() | 测试此抽象路径名表示的File是否存在,不存在创建新文件 |
| public boolean delete() | 删除此抽象路径名表示的文件或目录 |
| public String getName() | 返回由此抽象路径名表示的文件或目录的名称 |
| public boolean mkdir() | 只能创建一级文件夹 |
| public String[] list() | 返回由此抽象路径名表示的文件或目录的名称 |
| public File[] listFiles() | 遍历当前文件夹下的一级文件对象 |
1.什么是IO流
I表示intput,是数据从硬盘文件读入到内存的过程,称之输入,负责读。
O表示output,是内存程序的数据从内存到写出到硬盘文件的过程,称之输出,负责写
2.IO流的分类
字节流和字符流的区别:
字节流的操作不会经过缓冲区而是直接操作文件,字符流的操作会经过缓冲区然后通过缓冲区再操作文件。
字节流以字节为单位输入输出数据,字节流按照8位传输,字符流以字符为单位输入输出数据,字符流按照16位传输。
Java中一切都是字节流,没有字符流。字符流是有Java虚拟机得到的,音频、视频等媒体文件用字节流比较好,涉及到字符的话使用字符流比较好。
| (抽象基类) | 字节流 | 字符流 |
| 输入流 | InputStream | Reader |
| 输出流 | OutputStream | Writer |
3.字节文件流
FileOutputStream不使用任何缓冲区,因此flush方法为空。是否调用它不会更改代码的结果。
InputStream inputStream= null;
OutputStream outputStream= null;
try {
inputStream = new FileInputStream(new File("C:\Users\lxy\Desktop\2.txt"));
outputStream = new FileOutputStream("C:\Users\lxy\Desktop\1.txt");
byte[] buffer=new byte[1024];
int i=0;
while((i=inputStream.read(buffer))!=-1){
outputStream.write(buffer,0,i);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
inputStream.close();
outputStream.close();
}
4.字节缓冲流
基本思想就是减少磁盘的访问次数,一次性的先从磁盘中获取一部分数据到内存中。程序后续如果能从缓存中获取数据,就不会真正访问磁盘,以提高读取效率。字节缓冲流BufferedInputStream的缓冲区大小为8192。BufferedOutputStream的close()方法调用了flush()方法,也就是说,在关闭流之前会执行最后一次flush()之后不能在写入数据。
InputStream inputStream= null;
OutputStream outputStream= null;
BufferedInputStream bufferedInputStream=null;
BufferedOutputStream bufferedOutputStream=null;
try {
inputStream = new FileInputStream(new File("C:\Users\lxy\Desktop\1.txt"));
outputStream = new FileOutputStream("C:\Users\lxy\Desktop\2.txt");
bufferedInputStream=new BufferedInputStream(inputStream);
bufferedOutputStream=new BufferedOutputStream(outputStream);
byte[] buffer=new byte[1024];
int i=0;
while((i=bufferedInputStream.read(buffer))!=-1){
bufferedOutputStream.write(buffer,0,i);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
bufferedInputStream.close();
bufferedOutputStream.close();
}
5.字节数据流
DataInputStream和DataOutputStream是一对可以直接读取基本类型数据的流,DataOutputStream写入的只有DataInputStream才能读出来,读取顺序要和写入顺序一样,且次数也要一样。DataOutputStream的close()方法调用了flush()方法,也就是说,在关闭流之前会执行最后一次flush()之后不能在写入数据。
OutputStream outputStream= null;
DataOutputStream dataOutputStream=null;
try {
outputStream = new FileOutputStream("C:\Users\lxy\Desktop\2.txt");
dataOutputStream=new DataOutputStream(outputStream);
int i=50;
double b=3.24;
float f=3.24f;
dataOutputStream.writeInt(i);
dataOutputStream.writeDouble(b);
dataOutputStream.writeFloat(f);
} catch (IOException e) {
e.printStackTrace();
} finally {
outputStream.close();
dataOutputStream.close();
}
InputStream inputStream=null;
DataInputStream dataInputStream=null;
try {
inputStream = new FileInputStream("C:\Users\lxy\Desktop\2.txt");
dataInputStream=new DataInputStream(inputStream);
System.out.println(dataInputStream.readInt());
System.out.println(dataInputStream.readDouble());
System.out.println(dataInputStream.readFloat());
} catch (IOException e) {
e.printStackTrace();
} finally {
inputStream.close();
dataInputStream.close();
}
6.字节数组流
ByteArrayOutputStream可以自定义数组大小,默认是32字节。
ByteArrayXXXputStream操作的是数组,不需要进行close()关闭。
ByteArrayXXXputStream和BufferedXXXputStream的区别:
ByteArrayXXXputStream内部的数组大小是固定的。针对不用缓冲区的一般输出流而言的,即减少读取到内存的次数,同时缓冲区大小固定,缓冲区满则清空,有效利用内存( 缓冲区满后,即时清空缓冲区,输出到输出流中,可以有效利用内存。BufferedXXXputStream内部的数组大小是可变的。缓冲区满后,继续扩大缓冲区的大小,最后得到一个保存所有内容的byte数组。较之BufferedOutputStream速度上存在优势,目的是不直接操作数据流。
String s="ABCDEFG";
ByteArrayInputStream inputStream=new ByteArrayInputStream(s.getBytes());
ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int ch=0;
while ((ch=inputStream.read(buffer))!=-1){
outputStream.write(buffer,0,ch);
}
System.out.println(outputStream.toString());
7.字符文件流
FileReader fileReader= null;
FileWriter fileWriter= null;
try {
fileReader = new FileReader("C:\Users\lxy\Desktop\1.txt");
fileWriter = new FileWriter("C:\Users\lxy\Desktop\2.txt");
int len;
char[] chars=new char[5];
while ((len=fileReader.read(chars))!=-1){
fileWriter.write(chars,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
fileReader.close();
fileWriter.close();
}
8.字符缓冲流
FileReader fileReader= null;
FileWriter fileWriter= null;
BufferedReader bufferedReader=null;
BufferedWriter bufferedWriter=null;
try {
fileReader = new FileReader("C:\Users\lxy\Desktop\1.txt");
fileWriter = new FileWriter("C:\Users\lxy\Desktop\2.txt");
bufferedReader = new BufferedReader(fileReader);
bufferedWriter = new BufferedWriter(fileWriter);
int len;
char[] chars=new char[6];
while ((len=bufferedReader.read(chars))!=-1){
bufferedWriter.write(chars,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
bufferedReader.close();
bufferedWriter.close();
}
9.读取文本中内容
int len=0;
StringBuffer str=new StringBuffer("");
File file=new File("C:\Users\lxy\Desktop\1.txt");
try {
InputStreamReader isr= new FileReader(file);
BufferedReader in= new BufferedReader(isr);
String line=null;
while( (line=in.readLine())!=null )
{
if(len != 0) // 处理换行符的问题
{
str.append("rn"+line);
}
else
{
str.append(line);
}
len++;
}
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(str.toString());



