IO流
java.in.File类的使用
java.in.File指的是计算机操作系统中的文件和文件夹
IO原理及流的分类
IO:指的就是input和output
流的概念:通过程序把一个图片放到某个文件夹,把图片转化为一个数据集(例如二进制),把这些数据一点一点传到文件夹,这个传递的过程就很类似水的流动,我们就可以称这个整体的数据集是一个数据流。
文件流
数据流的读写基于文件操作
FileInputStream / FileOutputStream / FileReader / FileWriter
缓冲流
数据流的读写都是基于内存操作
BufferedInputStream / BufferedOutputStream / BufferedReader / BufferedWriter
转换流
InputStreamReader / OutputStreamReader
标准输入/输出流
打印流
PrintStream / PintWriter
其实就是System.out.println
数据流
DataInputStream / DataOutputStream
对象流
把一个对象转化为一个数据流进行读写
ObjectInputStream / ObjectOutputStream
随机存取文件流
RandomAccessFile
例如:一个TXT文件,其中有100行数据,可以直接读取第50行的数据,也可以在第89行插入数据,这个才是随机的概念
File类
File类只能操作文件本身,不能操作文件内容
public class Test1 {
public static void main(String[] args) {
File file = new File("D:\\demo\\test.txt"); //file就是test.txt文件
// File file1 = new File("D:" + File.separator + "\\test.txt");
// File file2 = new File("D:\\demo", "test.txt");
//注意:\在文件中是路径的分隔符,在java编程中一个\代表转义字符,\\或者/才是文件的分隔符
//也可以用File.separator作为文件分隔符
System.out.println(file.getName()); //获取文件名
File file3 = new File("D:\\demo");
System.out.println(file3.getName()); //获取当前文件夹名
System.out.println(file.getPath()); //获取文件或文件夹的路径
File file4 = new File("src\\com\\company\\day13\\Test1.java"); //使用相对路径
System.out.println(file4.getPath());
System.out.println(file4.getAbsolutePath()); //获取当前文件的绝对路径
System.out.println(file4.getParent()); //返回当前文件/文件夹的父级路径
file.renameTo(new File("D:\\demo\\test11.txt")); //给文件或者文件夹重命名
System.out.println(file.exists()); //判断文件或者文件夹是否存在
System.out.println(file4.canWrite()); //判断文件是否可写
System.out.println(file4.canRead()); //判断文件是否可读
System.out.println(file4.isFile()); //判断当前file对象是否是文件
System.out.println(file4.isDirectory()); //判断当前file对象是否是目录
System.out.println(file4.length()); //返回文件的长度,单位是字节数
System.out.println(file4.lastModified()); //获取文件最后修改时间,返回的是一个毫秒数
File file5 = new File("D:\\demo\\test22.txt");
System.out.println(file5.exists());
if (!file5.exists()) {
try {
file5.createNewFile(); //创建新文件
} catch (IOException e) {
e.printStackTrace();
}
}
file5.delete(); //删除文件
File file6 = new File("D:\\demo\\aa");
file6.mkdir(); //创建单层目录
File file7 = new File("D:\\demo\\aa\\bb\\cc\\dd");
file7.mkdirs(); //创建多层目录
File file8 = new File("D:\\demo");
String[] list = file8.list(); //返回当前文件夹的子集的名称。包括目录和文件
if (list != null) {
for (String s : list) {
System.out.println(s);
}
}
File[] files = file8.listFiles(); //返回当前文件夹的子集的file对象,包括目录和文件
if (files != null) {
for (File f : files) {
System.out.println(f);
}
}
}
}
File类递归遍历文件
public class Test1 {
public static void main(String[] args) {
File f = new File("D:\\demo");
new Test1().IterateOverFiles(f);
}
/**
* 递归遍历文件
* @param file
*/
public void IterateOverFiles(File file) {
if (file.isFile()) {
System.out.println(file.getAbsolutePath() + "是文件");
} else {
System.out.println(file.getAbsolutePath() + "是文件夹");
//如果是文件夹,这个文件夹就可能有子文件夹或文件
File[] files = file.listFiles();
if (files != null && files.length > 0) {
for (File f : files) {
IterateOverFiles(f); //递归调用
}
}
}
}
}
文件字节流
public class Test2 {
public static void main(String[] args) {
Test2.FileInputStream("D:\\demo\\test11.txt");
Test2.FileOutputStream("这个是Hello World!", "D:\\demo\\test22.txt");
Test2.CopyFile("D:\\demo\\test11.txt", "D:\\demo\\aa\\bb\\cc\\dd\\test11.txt");
}
/**
* 文件字节输入流FileInputStream
* @param inpath
*/
public static void FileInputStream(String inpath) {
try {
FileInputStream inputStream = new FileInputStream(inpath);
byte[] bytes = new byte[1024]; //设置一个byte数组接收读取的文件内容
int len = 0; //设置一个读取数据的长度
while ((len = inputStream.read(bytes)) != -1) {
System.out.println(new String(bytes, 0, len));
//new String(bytes, 0, len),参数1是缓冲数据的数组,参数2是从数组的哪个位置开始转换字符串,参数3是总共转化几个字节
}
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 文件字节输出流FileOutputStream
* @param text
* @param outpath
*/
public static void FileOutputStream(String text, String outpath) {
try {
FileOutputStream outputStream = new FileOutputStream(outpath); //指定向test22输出数据
byte[] bytes = text.getBytes();
outputStream.write(bytes); //把数据写到内存
outputStream.flush(); //把内存中的数据刷写到硬盘
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 复制文件到指定位置
* @param inpath 源文件路径
* @param outpath 复制到的文件夹路径
*/
public static void CopyFile(String inpath, String outpath) {
try {
FileInputStream inputStream = new FileInputStream(inpath); //读取的源文件
FileOutputStream outputStream = new FileOutputStream(outpath); //复制到哪里
byte[] bytes= new byte[1024];
int len = 0;
while ((len = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, len);
}
outputStream.flush(); //把写到内存的数据刷到硬盘
outputStream.close();
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
文件字符流
public class Test3 {
public static void main(String[] args) {
Test3.FileReader("D:\\demo\\test11.txt");
Test3.FileWriter("hello world", "D:\\demo\\test33.txt");
Test3.CopyFiles("D:\\demo\\test11.txt", "D:\\demo\\aa\\bb\\test11.txt");
}
/**
* 文件字符输入流FileReader
* 在读取文件时,必须保证该文件已存在,否则出异常
* @param inpath
*/
public static void FileReader(String inpath) {
try {
FileReader fileReader = new FileReader(inpath);
char[] chars = new char[1024];
int len = 0;
while ((len = fileReader.read(chars)) != -1) {
System.out.println(new String(chars, 0, len));
}
fileReader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 文件字符输出流FileWriter
* 在写入一个文件时,如果目录下有同名文件,将被覆盖
* @param text
* @param outpath
*/
public static void FileWriter(String text, String outpath) {
try {
FileWriter fileWriter = new FileWriter(outpath);
fileWriter.write(text); //写到内存中
fileWriter.flush(); //把内存的数据刷到硬盘
fileWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 字符流完成拷贝文件,字符流只适合操作内容是字符的文件
* @param inpath
* @param outpath
*/
public static void CopyFiles(String inpath, String outpath) {
try {
FileReader fileReader = new FileReader(inpath);
FileWriter fileWriter = new FileWriter(outpath);
char[] chars = new char[1024];
int len = 0;
while ((len = fileReader.read(chars)) != -1) {
fileWriter.write(chars, 0, len);
}
fileWriter.flush();
fileWriter.close();
fileReader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}