认识文件IO
IO指的是什么
I: input(输入-读)
O:OutPut(输出-写)
文件是什么
在磁盘中或者是存储磁盘介质的二进制文件
底层存储是以什么存储的
二进制
File-类(文件类)
File file = new File("文件地址");
常用方法
boolean exists( ) 判断文件或目录是否存在
boolean isFile( ) 判断是否是文件
boolean isDirectory( ) 判断是否是目录
**String getPath( ) 返回此对象表示的文件的相对路径名
**String getAbsolutePath( ) 返回此对象表示的文件的绝对路径名
String getName( ) 返回此对象表示的文件或目录的名称
boolean delete( ) 删除此对象指定的文件或目录
boolean createNewFile( ) 创建名称的空文件,不创建文件夹
boolean mkdir() 创建单层目录
boolean mkdirs() 创建多层目录
long length() 返回文件的长度,单位为字节, 如果文件不存在,则返回 0L
String[] list() 列出当前文件夹中的文件和目录名字,是文件的话有后缀
File [] listFiles() 列出当前文件夹中的文件和目录的File对象
FileInputStream - 文件字节输入流
常用方法:
(1)int read( ) :单个字节的数据,char转换
(2)int read(byte[] b):通过字节数组来获取文件的数据
(3)int read(byte[] b,int off,int len):截取流
(4)void close( ):关闭流
(5)int available():获取文件的字节大小
// 单个字节获取文件内容
//1. 创建对象
FileInputStream fis = new FileInputStream("F:\\fileupload\\demo.txt");
StringBuffer stringBuffer = new StringBuffer();
int read;
//2. 读取文件内容
while((read = fis.read())!=-1){
stringBuffer.append((char)read);
}
//3. 关闭io流
fis.close();
//字节数组获取文件内容
FileInputStream fileIn = new FileInputStream("E:/JavaIOTest/my.txt");//创建文件输入流
//获取到文件的字节数
int available = fileIn.available();
//字节数组
byte [] charArr = new byte[available];
int readByte = 0;
int index = 0;
do{
//将字节读取到字节数组中
readByte = fileIn.read(charArr);
index++;
System.out.println("循环!"+index);
}while(readByte!=-1);//当read的值为-1时说明文件已经读完了
String aa = new String(charArr);//String 构造器传入byte数组创建字符串
System.out.println(aa);
fileIn.close();//关闭流
FileOutputStream - 文件字节输出流
常用方法:
(1)void write(int c):输出单个字节编码的整型值
(2)void write(byte[] buf):输出字节数组,String的getBytes方法使用
(3)void write(byte[] b,int off,int len):数组字节数组的部分内容
(4)void close( ):关闭流
(5)flush():清空流,将流中的内容输出到目标
//1. 创建对象
FileOutputStream fos = new FileOutputStream("F:\\fileupload\\ggg",true);
//2. 写
String str = "高\t靖\n博";
// 65 --> A
byte[] bytes = str.getBytes();
fos.write(bytes);
//3. 关闭io流
fos.flush();
fos.close();
FileOutputStream 构造器
FileOutputStream (File file)
FileOutputStream(String name) // 文件路径,当文件不存在,**输出流会帮你创建文件**
FileOutputStream(String name,boolean append)// 默认情况append为false,代表不追加,设置为true输出流内容是追加到文件内容末尾
FileReader - 文件字符输入流
常用方法:
(1)int read( ) :单个字节的数据,char转换
(2)int read(char [] b):通过字节数组来获取文件的数据
(3)int read(char [] b,int off,int len):截取流
(4)void close( ):关闭流
// 1. 创建对象
FileReader fr = new FileReader("F:\\fileupload\\demo.txt");
//2 . 读取
char [] arr = new char[100];
StringBuffer sb = new StringBuffer();
int read;
while((read = fr.read(arr))!=-1){
for(int i=0;i<arr.length;i++){
if(arr[i]!=0){
sb.append(arr[i]);
}else{
break;
}
}
}
System.out.println(sb);
//3. 关闭
fr.close();
BuffedReader - 缓冲字符输入流
特殊方法:
(1)String readLine(): 逐行读取
常用方法:(1)int read( ) :单个字符的数据,char转换
(2)int read(char [] b):通过字符数组来获取文件的数据
(3)int read(char [] b,int off,int len):截取流
(4)void close( ):关闭流
// 1. 创建对象
//1.1 创建FileReader
FileReader fr = new FileReader("F:\\fileupload\\demo.txt");
//1.2 创建BufferedReader
BufferedReader br = new BufferedReader(fr);
//2 . 读取
String s = br.readLine();// 按行读取 每次读取一行
//3. 关闭
fr.close();
FileWriter - 文件字符输出流
常用方法:
(1)void write(int c):输出单个字符编码的整型值
(2)void write(char [] buf):输出字符数组
(3)void write(char [] b,int off,int len):数组字符数组的部分内容
(4)void close( ):关闭流
(5)flush():清空流,将流中的内容输出到目标
// 1. 创建对象
FileWriter fw = new FileWriter("F:\\fileupload\\xx\\demo2.txt",true);
//2 . 写出
fw.write("world");
//3. 关闭
fw.flush();
fw.close();
FileWriter 构造器
FileWriter (File file)
FileWriter(String name) // 文件路径,当文件不存在,**输出流会帮你创建文件**
FileWriter(String name,boolean append)// 默认情况append为false,代表不追加,设置为true输出流内容是追加到文件内容末尾
BufferedWriter - 缓冲字符输出流
常用方法:
(1)void write(int c):输出单个字符编码的整型值
(2)void write(char [] buf):输出字符数组
(3)void write(char [] b,int off,int len):数组字符数组的部分内容
(4)void close( ):关闭流
(5)flush():清空流,将流中的内容输出到目标
// 1. 创建对象
//1。1 FileWrtier - 设置是否追加是在FileWriter构造器里配置的
FileWriter fw = new FileWriter("F:\\fileupload\\demo.txt",true);
BufferedWriter bw = new BufferedWriter(fw);
//2 . 写出
bw.write("123");
//3. 关闭
bw.flush();
bw.close();
fw.close();
二进制文件-读写
DataInputStream、DataOutputStream
// 1. 创建对象
//1.1 创建FileInputStream
FileInputStream fis = new FileInputStream("F:\\fileupload\\123.jpg");
DataInputStream dis = new DataInputStream(fis);
//2 . 读取出
byte [] arr = new byte[dis.available()];
System.out.println(dis.available());
dis.read(arr);
System.out.println();
//3. 关闭
dis.close();
fis.close();
// 1. 创建对象
//1.1 FileOutputStream
FileOutputStream fos = new FileOutputStream("F:\\fileupload\\456.jpg");
//1.2 DataOutputStream
DataOutputStream dos = new DataOutputStream(fos);
//2. 写出
dos.write(arr);
//3. 关闭
dos.flush();
dos.close();
fos.close();
转码输入输出
1.读取
默认情况下使用UTF-8字符集读取
InputStreamReader isr = new InputStreamReader(new FileInputStream("in.txt"));
指定字符集读取
InputStreamReader isr2 = new InputStreamReader(new FileInputStream("in.txt") , "GBK");
2.写入
默认情况下使用UTF-8字符集写入
OutputStreamWriter isr = new OutputStreamWriter(new FileOutputStream("out.txt"));
指定字符集写入
OutputStreamWriter isr2 = new OutputStreamWriter(new FileOutputStream("out.txt") , "GBK");
对象序列化
Dog d1 = new Dog();
d1.name = "张三";
d1.age = 18;
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("F:\\fileOrder\\DogObject1"));
oos.writeObject(d1);
oos.flush();
oos.close();
对象反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("F:\\fileOrder\\dog.bat"));
Dog o = (Dog)ois.readObject();
System.out.println(o.name);
ois.close();
Properties类
输出配置文件
// 1.创建Properties集合对象,添加数据
Properties properties = new Properties();
properties.setProperty("赵丽颖","18");
properties.setProperty("杨幂","20");
properties.setProperty("王祖蓝","30");
// 2.创建字符输出流/字节输出流,构造方法中要绑定输出的目的地
FileWriter fw = new FileWriter("myfile\\prop.txt");
// 3.把集合中的临时数据, 持久化写入到硬盘中存储
properties.store(fw,"save date");
// 4.释放资源
fw.close();
读取配置文件
Properties pro = new Properties();
pro.load(new FileInputStream("F:\\fileOrder\\my.properties"));
// 遍历集合并打印
Set<String> strings = pro.stringPropertyNames();
for (String key : strings ) {
System.out.println(key+" -- "+pro.getProperty(key));
}
类加载器获取文件的方法
InputStream resourceAsStream =
Cach.class.getResourceAsStream("../conf/my.properties");// 相对路径写法
//InputStream resourceAsStream =Cach.class.getResourceAsStream("/com/huawei/java/conf/my.properties");// 绝对路径写法(项目根路径 src)
Properties pro = new Properties();
pro.load(resourceAsStream);
resourceAsStream.close();
String userName = pro.getProperty("userName");
System.out.println(userName);