IO流用来处理设备之间的数据传输,文件复制,上传文件和下载文件
绝对路径:固定不可改变的路径,以盘符开头
相对路径:相对某个参照物,不能以盘符开头
在eclipse中相对路径相对当前项目的根目录
IO流流向分类
输出流,数据从java程序中出去
FileWriter——如果要在文件中追加数据,在创建对象的时候,加一个true
创建输出流对象时会调用系统资源创建一个文件,创建输出流对象,把输出流对象指向文件
write()——写字符串,字符串不会直接写入文件中,会自动进入缓冲区
如果不写绝对路径,就会默认为相对路径,相对路径会在项目的根目录下
\n,可以实现换行,但是windows系统识别的换行符是\r\n,linux:\n,mac:\r
flush()——刷新缓冲区
close()——释放资源,通知系统释放和该文件相关的资源,同时检查缓冲区是否有数据,也会做flush动作
输入流,将数据写入Java程序
FileReader
read()——读取一个字符,返回字符的ASKII码,如果没有字符,会返回-1
while((ch = fr.read()) != -1){}——通常用这种方式读取
文件复制粘贴基本原理:
创建文件输入输出流两个对象
while((ch = fr.read())!=-1){
fw.write(ch);
fw.flush();
}——单个字符
char[] chs =char[1024];
int leng;
while((leng = fr.read(chs))!=-1){
fw.write(chs,0,leng);
fw.flush();
}
释放输入流与输出流的资源
File类:文件和目录路径明的抽象表示形式,File类的实例时不可变的
构造方法:
File(File parent , String child)——将指定的路径转换为一个File对象
new File("D:\\a\\b.txt");
File(String pathname)——根据指定的父路径和文件路径创建File对象
new File("D:\\a","b.txt");
File(String parent , String child)——根据指定父路径对象和文件路径创建File对象
new File(new FIle("D:\\a"),"b.txt");
常用功能:
创建功能:
boolean createNewFIle()——创建文件
boolean mkdir()——创建文件夹
boolean mkdirs()——创建指定文件夹,当文件夹所在的目录不存在,则一起创建
删除功能:
boolean delete()——删除文件/文件夹,不能删除有子文件或者子文件夹
获取功能:
String getAbsolutePath()——获取绝对路径
File getAbsoluteFile()——获取绝对路径的File对象
String getName()——获取File对象的文件名,包括后缀名
String getParent()——获取File对象的父目录
File geParentFile()——获取源File对象父目录的File对象
String getPath()——获取创建File对象时给的路径
long lastModified()——获取最好一次修改的时间
long length()——获取文件字节数(大小)
常用的获取功能:
String[] list()——获取当前文件夹下所有的文件和文件夹名称数组
File[] listFiles()——获取当前文件夹下所有文件和文件夹的FIle数组,每个File对象都是以绝对路径创建
static File[] listRoots()——获取所有盘符
判断功能:
boolean exists()——文件是否存在
boolean isDirectory()——判断File对象指定的路径是否是文件夹
boolean isAbsolute()——判断File对象指向的路径是否绝对路径
boolean isFile()——判断File对象指定的路径是否是文件
boolean isHidden()——判断File对象指定的路径是否是隐藏文件
修改功能
boolean renameTo(File dest)——当前File对象所指向的路径修改为指定File所指向的路径
IO流数据类型分类:
字节流——用于读取字节
字节输入流——InputStream
字节输出流——OutputStream,不用刷新,
字符流——用于读汉字
字符输入流——Reader
字符输出流——Writer
字节流的复制二进制文件
int len;
byte[] bys = new byte[1024];
while((len = fis.read(bys)) != -1){
fos.write(bys,0,len);
}
标准输入流——字节输入流,用来读取键盘录入的数据
public static final InputStream in
InputStream is = System.in;
Scanner sc = new Scanner(System.in);
标准输出流——字节输出流,将数据输出到命令行
public static final PrintStream out;
OutputStream os = System.out;
System.out.printIn();
InputStreamReader——把输入的字节转换为字符
Reader r = new InputStreamReader(System.in);
OutputStreamWriter——把输出的字节变成字符
Writer w = new OutputStreamWriter(System.out);
打印流,只能输出
PrintStream
PrintWriter
——实现所有print的所有的方法
——不能输出字节
——通过某些配置,可以实现自动刷新,println,printf或者format才能用
——也是包装流,不具备写出功能
PrintWriter pw = new PrintWriter("路径.txt");
pw.println("可以写入txt文件中,还可以自动换行");
PrintWriter pw = new PrintWriter(new FileWriter("d.txt",true),true);
pw.println("创建FileWriter对象时Boolean参数是是否追加,打印流对象Boolean类型是是否自动刷新")
打印流复制文本文件:
BufferedReader br = new BufferedReader(new FileReader("路径文件"));
PrintWriter pw = new PrintWriter(new FileWriter("路径文件"),true);
String line;
while((line = br.readLine()) != -1){
pw.println(line);
}
pw.close();
br.close();
对象操作流:
ObjectOutputStream
writeObject
ObjcetOutputStream(OutputStream out)
ObjectInputStream
readObject
ObjectInputStream(InputStream in)
注意:使用对象输出流写出对象,只能使用对象输入流来读取对象
需要实现Serializable接口——是一个标识的接口,只起标识作用,没有方法,当一个类的对象需要IO六进行读写的时候,这个类必须实现该接口,给类生成一个版本号
//创建输出流的对象
ObjectOutputStream oos= new ObjectOutputStream(new FileOutputStream("路径.txt"));
Student s = new Student();
oos.writeObject(s);
oos.close
//创建输入流的对象
ObjectIntputStream ois = new ObjectIntputStream(new fileInputStream("a.txt"));
try{
while(true){
Object obj = ois.readObject();
sysout(obj);//可以将对象都放到集合中,写出集合,读的时候直接读集合,就能拿到集合中的所有对象,这样就可以避免多次读取,需要用trycatch来停止循环
}
}catch(EOFException e){
sysout("读到文件的末尾");
}