一、File
1.创建FIle对象
public class FileText1 {
public static void main(String[] args) {
//创建一个FIle对象,指代某个具体的文件
//两种路径写法
File f1 = new File("D:/学习/prac/ab.txt");
// File f1 = new File("D:\\学习\\prac\\ab.txt");
System.out.println(f1.length());//文件大小
//file对象可以指向一个不存在的文件
//相对路径
File file = new File("src/src/javase/day23/ac.txt");
System.out.println(file.length());
}
}
2.判断文件类型,获取文件信息
public class FileText2 {
public static void main(String[] args) {
File file1 = new File("D:\\学习\\prac\\ab.txt");
// 文件是否存在
System.out.println("文件是否存在"+file1.exists());//文件是否存在true
//是否是文件
System.out.println("是否是文件"+file1.isFile());//是否是文件true
//是否是文件夹
System.out.println("是否是文件夹"+file1.isDirectory());//是否是文件夹false
//获取文件名称
System.out.println("获取文件名称"+file1.getName());//获取文件名称ab.txt
//获取文件大小
System.out.println(file1.length());
//获取文件最后的修改时间
long time = file1.lastModified();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(time));2024-01-25 13:36:27
//获取创建文件对象时,使用的路径
System.out.println(file1.getPath());//D:\学习\prac\ab.txt
//获取创建对象时,文件的绝对路径
System.out.println(file1.getAbsolutePath());//D:\学习\prac\ab.txt
}
}
3.创建文件,删除文件
public class FileText3 {
public static void main(String[] args) throws Exception {
//创建一个新文件,文件内容为空,创建成功返回true,反之false
File f1 = new File("D:\\学习\\prac\\code1.txt");
System.out.println(f1.createNewFile());
//创建文件夹,注意:只能创建一级文件夹
File f2 = new File("D:\\学习\\prac\\Text1");
System.out.println(f2.mkdir());
//创建文件夹,注意:可以创建多层文件夹
File f3 = new File("D:\\学习\\prac\\Text2\\Text22");
System.out.println(f3.mkdirs());
//删除文件,或者空文件夹,不能删除有内容的文件夹
System.out.println(f3.delete());
}
}
4.遍历文件夹
public class FileText4 {
public static void main(String[] args) {
File f1 = new File("D:\\学习\\prac");
String[] names = f1.list();
for (String name : names) {
System.out.println(name);
}
File[] files = f1.listFiles();
for (File file : files) {
System.out.println(file.getAbsolutePath());
}
}
}
5.编码与解码
public class Text1 {
public static void main(String[] args) throws Exception {
//编码
String data = "a我b";
byte[] bytes = data.getBytes();
System.out.println(Arrays.toString(bytes));
byte[] bytes1 = data.getBytes("GBK");
System.out.println(Arrays.toString(bytes1));
//解码
String s1 = new String(bytes);
System.out.println(s1);
String s2 = new String(bytes1,"GBk");
System.out.println(s2);
//[97, -26, -120, -111, 98]
//[97, -50, -46, 98]
//a我b
//a我b
}
}
二、IO流
IO流的体系
FilelnputStream(文件字节输入流)
●作用:以内存为基准,可以把磁盘文件中的数据以字节的形式读入到内存中去。
public class Text1 {
public static void main(String[] args) throws IOException {
FileInputStream f = new FileInputStream("D:\\学习\\Java学习\\JavaCode\\javacode\\src\\src\\javase\\day25\\d2_IO\\abc.txt");
int r1 = f.read();
System.out.println((char)r1);
int r2 = f.read();
System.out.println((char)r2);
int r3 = f.read();
System.out.println(r3);
}
}
/*
结果
a
b
-1
*/
使用FilelnputStream每次读取一个字节,读取性能较差,并且读取汉字输出会乱码
使用字节数组创建一个与文件一样大的数组这样可以避免出现汉字乱码的情况,但是如果文件太大,可能会出现有内存溢出的情况。
public class FileInputStreamText1 {
public static void main(String[] args) throws Exception {
//创建一个字节输入管道与源文件接通
FileInputStream f1 = new FileInputStream("D:\\学习\\Java学习\\JavaCode\\javacode\\src\\src\\javase\\day26\\FileInputStream\\wwl1.txt");
File f = new File("D:\\学习\\Java学习\\JavaCode\\javacode\\src\\src\\javase\\day26\\FileInputStream\\wwl1.txt");
long length = f.length();
byte[] bytes = new byte[(int) length];
int len = f1.read(bytes);
System.out.println(new String(bytes));
//jdk9以后出现的方法
// byte[] buffer = f1.readAllBytes();
}
}
FileOutputSteam 文件字节输出流
以内存为基准,把内存中的数据以字节的形式写出到文件中去
把一个文件复制到另一个文件里
public class CopyText {
public static void main(String[] args) throws Exception{
//创建连接需要复制的文件的通道
InputStream i1 = new FileInputStream("D:\\学习\\ningning.jpg");
//创建需要复制到的文件夹的通道
OutputStream os = new FileOutputStream("D:\\学习\\prac\\ningning.jpg");
//创建字节数组用来读取文件
byte[] bytes = new byte[1024];
//记录读取的文件大小
int len;
//开始读取文件并存入目标文件里
while((len = i1.read(bytes)) != -1){
os.write(bytes,0,len);
}
os.close();
i1.close();
System.out.println("文件复制完成");
}
}
释放资源的两种方式
try------catch-------finally
finally代码区的特点:无论try中的程序是正常执行了,还是出现了异常,最后都一定会执行finally区,除非VM终止。
public class CopyText { public static void main(String[] args) throws Exception{ InputStream i1 = null; OutputStream os = null; try { //创建连接需要复制的文件的通道 i1 = new FileInputStream("D:\\学习\\ningning.jpg"); //创建需要复制到的文件夹的通道 os = new FileOutputStream("D:\\学习\\prac\\ningning.jpg"); //创建字节数组用来读取文件 byte[] bytes = new byte[1024]; //记录读取的文件大小 int len; //开始读取文件并存入目标文件里 while((len = i1.read(bytes)) != -1){ os.write(bytes,0,len); } System.out.println("文件复制完成"); } catch (IOException e) { e.printStackTrace(); } finally { try { if (i1 != null)os.close(); } catch (IOException e) { e.printStackTrace(); } try { if (os != null)i1.close(); } catch (IOException e) { e.printStackTrace(); } } } }
FileReader字符输入流
FileWriter字节输出流
字节输出流写出数据后,必须刷新流,或者关闭流,写出去的数据才生效
字节缓冲流
字符缓冲输入流
public class BufferReaderText3 {
public static void main(String[] args) {
try (
Reader fr = new FileReader("D:\\学习\\Java学习\\JavaCode\\javacode\\src\\Java_SE\\day28\\FileReader\\text1.txt");
BufferedReader br = new BufferedReader(fr);
){
String Line;
while((Line = br.readLine()) != null){
System.out.println(Line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
字符缓冲输出流
原始流与缓冲流的性能分析
不同编码读取出现乱码的问题
如果代码编码和被读取的文本文件的编码是一致的,使用字符流读取文本文件时不会出现乱码!
如果代码编码和被读取的文本文件的编码是不一致的,使用字符流读取文本文件时就会出现乱码!
转换流
字符输入转换流
字符输出转换流
打印流
数据流
数据输出流
数据输入流
对象字节输出流
对象字节输入流
public class ObjectOutputText1 {
public static void main(String[] args) {
try (
ObjectOutputStream oos =
new ObjectOutputStream(new FileOutputStream("D:\\学习\\Java学习\\JavaCode\\javacode\\src\\Java_SE\\day29\\good.txt"));
){
User u = new User("admin",16,151,"3336666Ys");
oos.writeObject(u);
System.out.println("序列化成功");
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class ObjectInputStreamText1 {
public static void main(String[] args) {
try(
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\学习\\Java学习\\JavaCode\\javacode\\src\\Java_SE\\day29\\good.txt"));){
User u = (User) ois.readObject();
System.out.println(u);
} catch (Exception e) {
e.printStackTrace();
}
}
}