7.JAVA输入输出流
一、File类
将文件和目录路径名作为抽象的表示,通过Java内存中虚拟的路径来实现对实际本地文件的一些操作。
File类对象的创建
构造方法
File file = new File(URI uri);//通过URI类提供的抽象路径来构建一个新的File对象
File file = new File(String uri);//通过给定的字符串路径解析为抽象路径来构建File对象
File file = new File(File file,String fileName);
//通过给定的抽象父目录名和字符串子目录名构建File对象
File file = new File(String file,String fileName);
//通过字串符父目录名和字符串子目录名构建File对象
URI.create(String uri)
通过输入字符串解析并获取URI地址
File类的常用方法
String getName()
获取当前File对象的目录名或文件名
String getParent()
获取当前File对象所在的目录路径
String getPath()
获取File对象的绝对路径
boolean isDirectory()
判断是否为目录
boolean isFile()
判断是否为文件
boolean exists()
判断当前路径是否存在
boolean canRead()
判断该对象是否可读
boolean canWrite()
判断该对象是否可写
boolean createNewFile() throws IOException
若当前抽象路径中的文件不存在,则在该路径下创建文件
boolean mkdir()
若当前路径实际不存在,创建一级目录
boolean mkdirs()
可以创建多级实际不存在的目录
File[] listFiles()
当File的路径中在实际硬盘中存在,将此目录下的所有目录名和文件名返回到一个File数组中
二、文件流分类
java中可以实现对文件的读取以及写入的操作,称为文件流
输入流
按照文件格式可分为字节输入流和字符输入流
按照方法分为标准流和操作流
常用的字符输入类
-
顶级抽象父类InputStream
-
字节输入普通流FileInputStream
-
字节输入操作流BufferedInputStream
常用的字符输入类
-
顶级抽象父类Reader
-
字符输入普通流InputReader
-
字符输入操作流BufferedReader
输入普通流对象的创建
//通过file命名的文件名File对象构建输入流
FileInputStream bitInput = new FileInputStream(File file);
InputReader charInput = new InputReader(File file);
输入缓存流对象的创建
//基于普通输入流的实例构建一个输入缓存流
BufferedInputStream bufferedBitInput = new BufferedInputStream(bitInput);
BufferedReader bufferedCharInput = new BufferedReader(charInput);
字节输入流读取方法
int read(byte [],int offset,int length) throws IOException
字节输入流读取字节类型数组结果返回读取的字节数,若到达流的末尾返回-1
字符输入流读取方法
int read(char[] ,int offset,int length) throws IOException
字符输入流读取字符类型数组
输出流
输出流与输入流的对象创建规范类似,都需要基于普通流进行构建方法
按照输出文件类型的不同分为字节输出流和字符输出流
常用的字符输出类
-
顶级抽象父类OutputStream
-
字符输出流FileOutputStream
-
字符输出缓存流BufferedOutputStream
常用的字符输出类
-
顶级抽象父类Writer
-
字符输出流FileWriter
-
字符输出缓存流BufferedWriter
实现单个文件复制粘贴
/**案例
* 对某个文件进行复制粘贴的操作
* @param file 给定需要复制的文件
* @param path 给定需要粘贴的目标目录
*/
public static void fileCopy(File file,File path){
Date date = new Date();
//构建输入流和输出流
FileInputStream inputStream = null;
FileOutputStream outStream = null;
//目标文件对象
File target = null;
if (file.exists()){//判断文件是否存在
if (!path.exists()){//判断目标路径是否存在
path.mkdirs();
}
try {
inputStream = new FileInputStream(file);//基于文件创建输入流
//定义目标文件的目录及文件名
target = new File(path+"/"+date.getTime()+file.getName());
outStream = new FileOutputStream(target);//为目录文件创建输出流
byte [] temp = new byte[1024];//读取缓存区
int count = 0;//记录字节数
//循环读取文件内容放入缓存区
while ((count = inputStream.read(temp,0,temp.length))!=-1){
System.out.println("文件复制中······");
outStream.write(temp,0,count);//每读取一次就将内容写入目标目录中
}
System.out.println("文件复制完毕");
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
//关闭输入流和输出流
outStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String [] args){
//复制的目标文件
File target = new File("F:\\元气壁纸缓存\\img\\image.jpg");
File targetPath = new File("F:\\Data\\photo\\");//复制的目标路径
FileManager.fileCopy(target,targetPath);//调用复制文件方法
}
}
三、序列化
Java中不仅具有对文件读取和写入的功能,也可以对Java任何对象进行操作,称为序列化操作。
Java中提供一个具有将对象序列化的接口Serializable
需要进行序列化操作的对象对此接口进行实现即可
序列化对象的创建
将Java对象使用输出流存放到硬盘空间里,称为对象的序列化输出流
new ObjectOutputStream(FileOutputStream out);//基于文件输出流构建一个对象序列化
读取本地目录下的Java对象称为反序列化输入流(串行化)
new ObjectInputStream(FileInputStream in);//基于文件输入流构建一个对象的串行化
序列化的方法
void writeObject(Object obj)
将给定的对象写入指定的目录中
Object readObject()
读取目标文件中的对象并返回