Java IO流
File类
File类的概念
- 代表硬盘上的一个文件或者文件夹
- Windows中路径表示方式c:aa.txt
- Java中路径表示方式:
- c:\\bb\\aa.txt
- c:/aa/bb.txt
File类的构造方法
public File(String pathname) //根据给定的文件路径创建File对象
public File(String parent, String child) //根据给定的文件夹路径以及文件名创建一个File对象
public File(File parent, String child) //根据给定的文件夹对象以及为简明名创建一个File对象
File parent = new File("D:\\stuy");
File child1 = new File("D:\\study","Java2024");
File child2 = new File(parent,"Java2024");
File类的常用方法
public static void main(String[] args) throws IOException {
File file = new File("D:\\study");
//创建file路径的文件,如果文件存在返回false;
System.out.println(file.createNewFile());
//删除file代表等我文件或目录,若为file代表的为目录,目录必须为空才可以成功删除;
// file.delete();
//判断file文件或目录是否存在
System.out.println(file.exists());
//获得文件的绝对路径
System.out.println(file.getAbsolutePath());
//获得文件或者目录的名字
System.out.println(file.getName());
//获得文件或者目录的上级目录
System.out.println(file.getParent());
//判断file是不是目录
System.out.println(file.isDirectory());
//判断file是不是文件
System.out.println(file.isFile());
//获得文件上一次修改时间,单位ms(距1970年1月1日时间)
System.out.println(file.lastModified());
//获得文件大小
System.out.println(file.length());
//获取当前文件夹的子文件或子文件夹对象
File[] files = file.listFiles();
for(File file1 : files){
System.out.println(file1.getName());
}
//创建文件夹,只能创建一级
System.out.println(file.mkdir());
//创建文件夹,可以创建多级
System.out.println(file.mkdirs());
}
绝对路径和相对路径
绝对路径:从盘符开始算起的路径,例如:D:/study
相对路径:相对于当前项目的路径,例如:src/com
字节流
FileInputStream
FileInputStream是文件字节输入流,继承于抽象类InputStream类,用于以字节为单位读取文件。适用于读取任意格式文件
在系统中,任何文件都是以字节为单位存储的,所有FileInputStream可以读取任意文件
构造方法
public FileInputStream(File file)throws FileNotFoundException //根据文件创建字节输入流。
public FileInputStream(String pathname)throws FileNotFoundException //根据路径创建。
常用方法
//读取一个字节数据,如果没有数据可读取,返回-1
public int read() throws IOException;
//将数据从文件读取到字节数组b中,并返回此次读取数据的字节数,若没有数据可以读取,返回-1
public int read(byte[] bytes) throws IOException;
//跳过n个字节
public long skip(long n) throws IOException;
//关闭流
public void close() throws IOException;
FileOutputStream
FileOutputStream是文件字节输出流,继承于抽象类OutputStream类,用于以字节为单位向文件写入数据
构造方法
public FileOutputStream(File file)throws FileNotFoundException //根据文件创建字节输出流。
public FileOutputStream(String pathname)throws FileNotFoundException //根据路径创建。
public FileOutputStream(File file,append)throws FileNotFoundException //append判断是否追加。
public FileOutputStream(String pathname,append)throws FileNotFoundException
常用方法
//将一个字节写入文件
public void write(int b) throws IOException;
//将字节数组b中的数据写入文件
public void write(byte[] b) throws IOException;
//将字节数组b中,从off下标开始的len个字节写入文件
public void write(byte[] b,int off,int len) throws IOException;
//关闭流
public void close() throws IOException;
FileInputStream和FileOutputStream案例–一边读取一边写入(Copy)
package day23;
import java.io.*;
public class TestCopy {
/**
* 把Test文件中的文件拷贝到file文件夹中
* 遇到文件就拷贝,遇到目录就创建
*/
public static void main(String[] args) {
File from = new File("Test");
File to = new File("file") ;
File[] files = from.listFiles();
for(File file : files){
if(file.isFile()){
copyFile(file,new File(to, file.getName()));
}else {
copyDirectory(file,new File(to, file.getName()));
}
}
}
//拷贝文件方法
public static void copyFile(File from, File to){
//创建输入输出流
try (FileInputStream inputStream = new FileInputStream(from);
FileOutputStream outputStream = new FileOutputStream(to)){
byte[] bytes = new byte[1024];
for(int n = inputStream.read(bytes); n != -1; n = inputStream.read(bytes)){
outputStream.write(bytes,0,n);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
//创建目录方法
public static void copyDirectory(File from, File to){
//判断有没有该目录,没有则创建目录
if(!to.exists()) to.mkdir();
//如果是目录则遍历目录下文件
File[] files = from.listFiles();
if (files == null)return;
for(File file: files){
if(file.isFile()){
copyFile(file,new File(to,file.getName()));
}else {
copyDirectory(file,new File(to,file.getName()));
}
}
}
}
FileReader
FileReader是文件字符输入流,以字符为单位读取文件,适用于读取纯文本文件
构造方法
public FileReader(File file) throws FileNotFoundException
public FileReader(String pathname) throws FileNotFoundException
常用方法
//读取一个字符数据,如果没有数据可读取返回-1
public int read() throws IOException;
//从字符数组中读取,如果没有数据可读取返回-1
public int read(char[] c) throws IOException;
//跳过n个字符
public long skip(long n) throws IOException;
//关闭流
public void close() throws IOException;
FileWirter
FileWirter是文件字符输出流,以字符为单位向文件写入数据
构造方法
public FileWirter(File file)throws FileNotFoundException //根据文件创建字符输出流。
public FileWirter(String pathname)throws FileNotFoundException //根据路径创建。
public FileWirter(File file,append)throws FileNotFoundException //append判断是否追加。
public FileWirter(String pathname,append)throws FileNotFoundException
常用方法
//将一个字符写入文件
public void write(char c) throws IOException;
//将字符数组c中的数据写入文件
public void write(char[] c) throws IOException;
//将字符数组c中,从off下标开始的len个字节写入文件
public void write(char[] c,int off,int len) throws IOException;
//关闭流
public void close() throws IOException;
缓冲流
在内存中开辟一块空间,当调用read或者wirte的方法时,不进行真正的I/O操作,而是对内存中这块空间进行操作。和自己创建数组的方式差不多,但Java中有内置的缓冲区方法,简化代码更能提高性能。
最普通的一个字节一个字节传送 好比 在河边一勺一勺的把水收集进水库
创建数组的方法把勺子换成了杯子
缓冲流就是有人一边拿一个大桶装一桶水,你一边把水桶中的水运到水库
Buffered(InputStream|OutputStream)
给字节输入|输出流增加缓冲功能
构造方法
public BufferIn(Out)putStream(InputStream/OutputStream b) //创建一个大小为8kB的字节缓冲流
public BufferIn(Out)putStream(InputStream/OutputStream b,int size) //创建一个大小为size的字节缓冲流
Buffered(Reader|Writer)
给字符输入|输出流增加缓冲功能
构造方法
public BufferReader(Writer)(Reader/Writer c) //创建一个大小为8kB的字符缓冲流
public BufferReader(Writer)(Reader/Writer c,int size) //创建一个大小为size的字符缓冲流
try-with-resource(语法糖TWR)
该方法可以在try结束后自动回调close()方法。普通的try-catch需要在finally调用close()方法确保流的关闭。
//将流放入try后的括号中
try (FileInputStream inputStream = new FileInputStream(from);
FileOutputStream outputStream = new FileOutputStream(to)){
byte[] bytes = new byte[1024];
for(int n = inputStream.read(bytes); n != -1; n = inputStream.read(bytes)){
outputStream.write(bytes,0,n);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
ObjectOutputStream
对象输入流,主要作用是把对象写入文件中。需要写入的对象必须是可序列化的,即对象要实现Serializable接口,除了对象还能把基本数据类型写入文件。
构造方法
//创建一个对象输出流,需要一个输出流作为参数
public ObjectOutputStream(OutputStream out) throws IOException
核心方法
package day24;
import java.io.*;
public class TestObject implements Serializable{
private String name;
private int age;
public TestObject(String name, int age) {
this.name = name;
this.age = age;
}
public static void main(String[] args) {
try(ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("file\\aa.txt"))) {
//写入整数类型数据
outputStream.writeByte(100);
outputStream.writeShort(200);
outputStream.writeInt(300);
outputStream.writeLong(400);
//写入浮点型数据
outputStream.writeFloat(3.14F);
outputStream.writeDouble(3.1415);
//写入字符数据
outputStream.writeChar('夏');
//写入字符串
outputStream.writeUTF("CnYuu");
//写入对象
outputStream.writeObject(new TestObject("CuYuu",21));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
transient关键字
如果对象的某个属性不想序列化(不想存入文件),可以通过transient关键字进行修饰。
ObjectInputStream
构造方法
//创建一个对象输入流,需要一个输出流作为参数
public ObjectInputStream(InputStream in) throws IOException
核心方法
package day24;
import java.io.*;
public class TestObject1 {
public static void main(String[] args) {
try(ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("file\\aa.txt"))) {
//读出整数类型数据
System.out.println(inputStream.readByte());
System.out.println(inputStream.readShort());
System.out.println(inputStream.readInt());
System.out.println(inputStream.readLong());
//读出浮点型数据
System.out.println(inputStream.readFloat());
System.out.println(inputStream.readDouble());
//读出字符数据
System.out.println(inputStream.readChar());
//读出字符串
System.out.println(inputStream.readUTF());
//读出对象
System.out.println(inputStream.readObject());
} catch (IOException e) {
throw new RuntimeException(e);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
}