1.流的概述:简单的讲 流就是一组有序的数据序列,根据操作的类型,可分为输入流 和 输出流两种。
(1)输入流
输入流:从 文件,网络,其他数据源 -----> 数据流-----> 目的地
所有的输入流都是抽象类InputStream(字节输入流)或者Reader(字符输入流)的子类
InputStream 该类的所有的方法遇到错误的时候就会报IOException 异常,下面是对该类的一些方法。
1.read() 方法:从输入流中读取数据的下一个字节。返回0-255 范围的字节值,如果读完到达流末端没有可用字节,则返回-1.
2.read(byte[] b):从输入流中读取一定长度的字节,并以整数的形式返回字节数
3.mark(int readlimit)方法:在输入流的当前位置放置一个标记,readlimt 参数告知此输入流在标记失效之前允许读取的字节数
4.reset():将输入指针返回当前所做的标记处
5.skip(long n)方法:跳过输入流上的n个字节并返回实际跳过的字节数
6.markSupported()方法:如果支持mark/reset()操作就返回True
7.close 方法 :关闭此输入流并释放与该流的所有资源
(2)输出流
输出流:从 源 -----> 数据流----> 文件,网络,其他输出地
所有的输入流都是抽象类OutputStream(字节输出流)或者Writer(字符输出流)的子类
OutputStream 类中的方法做简单介绍
1.write(int b)方法:将指定的字节写入此输出流
2.write(byte[] b)方法:将b字节从指定byte数组写入此输出流
3.write(byte[]b ,int off,int len)方法:将指定byte中从偏移量 off 开始的len个字节写入此输出流
4.flush()方法:彻底完成输出并清空缓存区
5.close()方法:关闭输出流
2.File 类(重要)
File 类是java.io包中唯一代表磁盘文件本身的对象。可以通过调用File 类中的方法,实现创建、删除、重命名文件等操作。File类的对象主要用来获取文件本地的一些信息,例如文件的所在目录、文件的长度、文件的读写权限等
关于 File 类提供很多方法用于获取一些文件本身的信息,下列是常用方法
方法 说明 返回值
getName() 获取文件的名称 String
canRead() 判断文件是否可读 boolean
canWrite() 判断文件是否可写 boolean
exits() 判读文件是否存在 boolean
length() 文件长度(字节为单位) long
getAbsolutePath() 文件的绝对地址 String
getParent() 文件的父路径 String
isFile() 文件是否存在 boolean
isDirectory() 文件是否是一个目录 boolean
isHidden() 文件是否是隐藏的 boolean
lastModified() 文件最后一次修改时间 long
下面通过一个demo使用这几个方法
//创建一个word.txt文件,在默认当前项目路径下
public class fileOper {
public static void main(String [] args){
//创建一个word.txt文件,在默认当前项目路径下
File file = new File("word.txt");
if (file.exists()) {
String fileName = file.getName();
long length = file.length();
boolean hidden = file.isHidden();
String absolutePath = file.getAbsolutePath();
System.out.println("文件名:" + fileName);
System.out.println("文件长度:" + length);
System.out.println("是否是隐藏:" + hidden);
System.out.println("文件的路径:" + absolutePath);
}else{
try {
file.createNewFile();
System.out.println("文件已创建");
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果如下图:
以上是基本API的方法使用
3.文件输入/输出流
目标:创建一个文件名为:wordStream,txt 文件,给文件中写入一句字符串,将字符串读出来并且输出到控制台
步骤:
1.创建一个文件,判断文件是否存在,如果不存在就创建一个空的文件
2.创建字节文件输入流,将对应的字符串转成字节byte[] 中,将信息写入
3.创建字节文件输出流,读取所有字节,获取到最后字节长度,构建字符串讲信息返回到控制台
具体代码如下:
public class fileStreamOper {
public static void main(String[] args) {
File file = new File("wordStream.txt");
String info = null;
if (file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
// FileOutputStream 输入字节流 ,FileInputStream 输出字节流
// 创建字节文件输入流对象
try {
FileOutputStream out = new FileOutputStream(file);
byte output[] = "Start study FileOutputStrean,练习中".getBytes();
out.write(output);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
FileInputStream fileInputStream = new FileInputStream(file);
byte[] input = new byte[1024];
// 把流读进去
int read = fileInputStream.read(input);
//显示出来
info = new String(input, 0, read);
System.out.println("打印输入流输入的字符串:" + info);
input.clone();
} catch (Exception e) {
e.printStackTrace();
}
}
运行结果如图:
练习一:
题目:指定目录下创建一个文件在
public class fileTest {
public boolean createFile(String path) {
boolean result = false;
File file = new File(path);
//1.判读文件是否存在
if (file.exists()) {
result = true;
} else {
//2.判读文件是一个目录吗,如果是目录,就创建所有目录使用mkdirs(包括子目录)
if (file.isDirectory()) {
file.mkdirs();
} else {
//3.如果不是目录,获取父目录
File parentFile = file.getParentFile();
if (!parentFile.exists()) {
//4.父目录不存在,就先创建目录
parentFile.mkdirs();
}
try {
//5.目录存在后,再创建文件
file.createNewFile();
result = true;
} catch (IOException e) {
e.printStackTrace();
result = false;
}
}
}
return result;
}
public static void main(String[] args) {
fileTest fileTest = new fileTest();
String path = "D:/coypTest2/git/test1.txt";
System.out.println("文件是否已经被创建ok?" + fileTest.createFile(path));
}
练习二:
题目:复制一个文件到指定目录下
public class copySingleFile {
/**
* 指定文件目录下
* 复制一个文件
* @param src
* @param dst
*/
public void copyFile(String src ,String dst) {
File srcfile = new File(src);
//1.判断文件源文件是否存在
if (!srcfile.exists()) {
System.out.println("源文件不存在");
return;
}
File dstfile = new File(dst);
//2.目标文件是否存在,如果不存在获取源文件的上级目录并创建文件目录
if (!dstfile.exists()) {
File parentFile = srcfile.getParentFile();
if (!parentFile.exists()) {
dstfile.mkdirs();
}
}
try {
//将源文件中的数据读到文件输出流
FileInputStream fin = new FileInputStream(srcfile);
FileOutputStream fout = new FileOutputStream(dstfile);
byte[] bt = new byte[512];
//循环将文件中的数据写入到目标路径中文件中
while (fin.read(bt) != -1) {
fout.write(bt, 0, bt.length);
}
System.out.println("复制完成");
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String scrPath ="D:/复制文件源/学习记录.txt";
String dsrPath ="D:/复制文件源/学习记录copy.txt";
copySingleFile copyFile = new copySingleFile();
copyFile.copyFile(scrPath,dsrPath);
}
}
练习三:复制一个文件夹到另外一个文件夹,复制+粘贴功能
public class copyAllFile {
/**
* 复制一个文件夹
* @param src
* @param dst
*/
public void copyFile(String src ,String dst){
File srcfile = new File(src);
if (!srcfile.exists()){
System.out.println("源文件不存在");
return;
}
File dstfile = new File(dst);
if(!dstfile.exists()){
File parentFile = srcfile.getParentFile();
if(!parentFile.exists()){
dstfile.mkdirs();
}
}
try {
FileInputStream fin = new FileInputStream(srcfile) ;
FileOutputStream fout = new FileOutputStream(dstfile);
byte[] bt = new byte[512];
while (fin.read(bt)!=-1){
fout.write(bt,0,bt.length);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 复制文件夹
* @param src
* @param dst
*/
public void copyFiles(String src,String dst){
File srcfile = new File(src);
//1.判断源文件是否存在
if(!srcfile.exists()){
System.out.println("源文件不存在");
return;
}
//2.判断源文件是不是一个目录,如果不是一个目录就直接复制的单个文件
if(!srcfile.isDirectory()){
copyFile(src,dst);
return;
}
//3.判读目标文件是否存在,如果不存在进行文件目录的创建
File dsrfile = new File(dst);
if(!dsrfile.exists()){
dsrfile.mkdirs();
}
//4.复制文件夹信息
copyListFile(srcfile,dsrfile);
}
public void copyListFile(File src,File dst){
//5.获取所有文件File对象集合
File [] listFile = src.listFiles();
//6.判读文件集合中是否有文件存在,如果没有就返回
if(listFile==null || listFile.length==0){
return;
}
//7.循环遍历从目录外层开始
for(File file : listFile){
String oldPath = file.getAbsolutePath();
System.out.println("获取路径"+oldPath);
int index = oldPath.lastIndexOf(File.separator);
//8.获取文件名称
String fileName = oldPath.substring(index);
//9.创建目标文件
File newFile = new File(dst.getAbsolutePath()+File.separator+fileName);
//10.如果是一个目录,就根据源文件先创建目标文件目录并递归调用,一层层循环直到找到文件进行复制
if(file.isDirectory()){
newFile.mkdirs();
copyListFile(file,newFile);
}else{
//11.如果是一个文件,就直接调用复制单个文件的方法进行复制
copyFile(oldPath,dst.getAbsolutePath()+File.separator+fileName);
}
}
}
public static void main(String[] args ){
String scrPath ="D:/复制文件源";
String dsrPath ="D:/复制文件源Copy";
copyAllFile copyFile = new copyAllFile();
copyFile.copyFiles(scrPath,dsrPath);
}
}
练习四:删除指定目录下的单个文件
public void DelFile(String path){
File file = new File(path);
if(!file.exists()){
System.out.println("源文件不存在");
}
file.delete();
}
练习五:删除指定目录下的文件夹(删除所有文件和文件夹)
public class DelFile {
//单个文件删除
public void DelFile(String path){
File file = new File(path);
if(!file.exists()){
System.out.println("源文件不存在");
}
file.delete();
}
//文件夹删除
public void DelFiles(String path){
File filePath = new File(path);
//1.获取指定目录下的所有文件集合
File[] files = filePath.listFiles();
if(files ==null || files.length==0){
return;
}
//2.开始遍历删除文件和文件目录
for(File file :files){
String newPath = file.getAbsolutePath();
//3.判断是否为文件目录,如果是目录就进行递归调用,直到找到文件
if(file.isDirectory()){
DelFiles(newPath);
file.delete();
}else{
//4.判断是文件就直接调用单个文件删除
DelFile(newPath);
}
}
//5.当所有文件都删除后,删除最外层文件目录
filePath.delete();
}
public static void main(String[] args ){
String delPath ="D:/复制文件源Copy";
DelFile del = new DelFile();
del.DelFiles(delPath);
}
}