一、Java中对文件的读取写入,我们称为IO操作
IO: 用来进行设置之间的数据传输
I: input 输入
O: output 输出
IO
Java中I/O操作主要是指使用 java.io 包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出 数据。
File文件
在Java中提供了一个类 File 供我们使用;
File : 文件和目录(文件夹)路径名的抽象表示
构造方法:
File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例。
File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例。
//文件路径 D:\demo\a.txt
//File(String parent, String child)
File file = new File("D:\\demo", "a.txt") ;
//File(String pathname)
File file = new File("D:\\demo\\a.txt") ;
//File(File parent, String child)
File fileParent = new File("D:\\demo");
File file = new File(fileParent , "a.txt");
File类提供的方法
long length() 获得文件字节数
如果你创建文件或者文件夹忘了写盘符路径,那么,默认在项目路径下
创建
boolean createNewFile()创建一个新文件 ; 注:如果给定目录不存在,会报错
boolean mkdir() / mkdirs()创建新的目录
删除
boolean delete() 删除文件或者目录 注:
注:
-
Java中的删除不走回收站
-
要删除一个文件夹,请注意该文件夹内不能包含文件或者文件夹
void deleteOnExit() 虚拟机退出时删除文件或者目录
判断
boolean exists() 判断当前文件或者目录是否存在
boolean isFile() 判断File对象代表的是否是一个文件
boolean isDirectory() 判断File对象代表的是否是一个目录
boolean isHidden()判断File对象代表的是否是一个隐藏文件
重命名
public boolean renameTo(File dest) : 重命名
如果路径名相同,就是改名。
如果路径名不同,就是改名并剪切。
路径以盘符开始︰绝对路径 c:\\a.txt
路径不以盘符开始∶相对路径 a.txt
获取信息
String getPath() 返回当前File对象的字符串路径 注: 给的什么路径,就显示什么值
String getName()返回当前File对象的文件名或者目录名
String getParent()返回当前File对象的父级目录 注: 根据我们给定字符串路径,去看父级
String getAbsolutePath()返回当前File对象的绝对路径
获取子目录及文件(数组)
String[] list()返回当前File对象包含的子目录以及文件
File[] listFiles()返回当前File对象包含的子目录以及文件
long lastModified()返回最后的修改时间
思考 : 找一个文件目录下,所有的文件
递归
递归操作不是循环,是反复调用方法,所有在数字很大的时候不建议使用递归。
比如求 5!使用递归
他会反复调用方法,反复将方法进栈。
I/O的分类
根据数据的流向分为:输入流和输出流。
-
输入流 :把数据从
其他设备
上读取到内存
中的流。 -
输出流 :把数据从
内存
中写出到其他设备
上的流。
根据数据的类型分为:字节流和字符流。
-
字节流 :以字节为单位,读写数据的流。
-
字符流 :以字符为单位,读写数据的流。
关于什么时候用字符流和字节流,可以用记事本来判断,字符流可以用于所有文件,而字符流传输的数据用记事本打开不会乱码,那就可以用字符流,乱码了就不能用字符流。
注意:输入和输出是根据Java程序而言,硬盘向Java内存传入数据叫输入(input),Java内存输出数据到硬盘叫输出(output)。
FileInputStream(字节输入流)
构造方法
FileInputStream(File file)
FileInputStream(String name)
方法:
read(); //一个一个读
通过byte数组读取数据的原理
FileOutputStream(字节输出流)
构造方法
FileOutputStream(File file) 创建文件输出流以写入由指定的 File对象表示的文件。
FileOutputStream(File file, boolean append) : 当append为true,表示 将写入的字节添加到末尾,而不是开始
创建文件输出流以写入由指定的 File对象表示的文件。
FileOutputStream(String name) 创建文件输出流以指定的名称写入文件
FileOutputStream(String name, boolean append) : 当append为true,表示 将写入的字节添加到末尾,而不是开始
创建文件输出流以指定的名称写入文件。
方法
write(int )
write(byte[])
write(byte[],int off, inlen )
package mytest;
import java.io.*;
public class my_inputio {
public static void main(String[] args) throws IOException {
T t = new T();
// //初级读取文件
// t.chujiduqu();
//
// //初级写入文件
// t.chujixieru();
//初级将 b.txt 内容复制到 a.txt
t.chujicope();
//高级 b.txt 内容复制到 a.txt (加了缓冲,提高了速度)
}
}
class T{
public void chujiduqu() throws IOException {
// 1.创建对象
FileInputStream in = new FileInputStream("a.txt");
// 2.实现方法
while (in.read()!=-1){
System.out.print(in.read());
}
// 3.关闭
in.close();
}
public void chujixieru() throws IOException{
// 1.创建对象
FileOutputStream ou = new FileOutputStream("b.txt");
//只能写整数或者字符
// 2.实现方法
ou.write(97);
ou.write(98);
ou.write('c');
// 3.关闭
ou.close();
}
public void chujicope()throws IOException{
// 1.创建对象
FileInputStream fiin = new FileInputStream("b.txt"); //读取
// true 表示 b.txt 的内容追加在a.txt的后面,不写则是将a.txt的内容覆盖
FileOutputStream fiou = new FileOutputStream("a.txt",true);//写入
// 2.实现方法
int a=fiin.read();
// int a; 这样写法看着高级
// while (a=fiin.read()!=-1)
while (a!=-1){
fiou.write(a);
a=fiin.read();
}
// 3.关闭
fiin.close();
fiou.close();
}
public void gaoji() throws IOException{
// 1.创建对象
// FileInputStream fileInputStream = new FileInputStream("b.txt");
// BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
//匿名对象
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("b.txt"));
// FileOutputStream fileOutputStream = new FileOutputStream("a.txt");
// BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
//匿名对象
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("a.txt"));
// 2.实现方法
//采用字符数组,加快速度
byte [] bytes = new byte[1024];
//定义一个存储数组长度
int len;
while ((len=bufferedInputStream.read())!=-1){
//输出
bufferedOutputStream.write(bytes,0,len);
bufferedOutputStream.flush();
}
// 3.关闭
bufferedInputStream.close();
bufferedOutputStream.close();
}
}
转换流:
OutputStreamWriter
InputStreamReader
将字节流,转字符流
//字符和字节流的区别?
//字节流的单位是字节,字符流的单位是字符
//字符流=字节流+编码 字符流只能处理字符
//字符流是带缓冲