java学习第13天
IO
Input输入、Output输出
信息需要永久保存(持久化),一般用文件的形式把文件保存到磁盘。
程序运行需要一些基本的配置信息,这种配置信息也是保存在磁盘的文件中。
程序从磁盘上读取文件,就称为Input,把文件写到磁盘,就称为Output。(参考位置是内存)
Java.io下的类分类
按输入和输出的方向划分:
-
输入
Input、Reader
-
输出
Output、Writer
按照数据的格式划分:
-
字节流(二进制文件,如:exe、offce、图片、视频·、音频)
Stream、
-
字符流(文本文件,如:txt、程序源代码文件、html)
Reader、Writer
File类
跟磁盘上的文件或者目录关联,读写文件时就用file对象。
常用方法:
//创建文件对象,参数是文件的路径和名称
//文件路径分隔符可以用\\ 或 /
//不管文件是否存在,都会创建一个File对象
File file = new File("D:\\BaiduNetdiskDownload\\games\\测试.txt");
File file1 = new File("D://");
//判断文件是否存在,存在返回true,不存在返回false
System.out.println(file.exists());
//返回File对象的文件名(不包含路径)
System.out.println(file.getName());
//返回文件对象关联的path是否是一个文件
System.out.println(file.isFile());
System.out.println(file1.isFile());
//判断文件对象关联的路径是否是一个目录
System.out.println(file.isDirectory());
System.out.println(file1.isDirectory());
//返回文件最后一次修改的时间戳
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm");
System.out.println(sdf.format(new Date(file.lastModified())));
//返回文件内容的字节长度,若文件不存在则返回0.
System.out.println(file.length());
//文件重命名
//System.out.println(file.renameTo(new File("D:\\BaiduNetdiskDownload\\games\\解压码.txt")));
File file2 = new File("C:\\Users\\hanhan\\Desktop\\新建文本文档.txt");
//删除文件
System.out.println(file.delete());
//列出目录下的所有文件和目录
File[] files = file1.listFiles();
System.out.println(Arrays.toString(files));
System.out.println(files.length);
//创建新目录,不存在就创建,如果以及存在就不再重复创建
file.mkdir();
练习
递归打印出文件夹
public static void main(String[] args) {
dir(new File("D:\\BaiduNetdiskDownload"), "");
}
private static void dir(File file, String tab) {
tab += "\t";
File[] files = file.listFiles();
for (File f : files) {
if (f.isDirectory()) {
System.out.println(tab + f.getName());
dir(f, tab);
}
}
}
FileInputStream
以二进制的方式读取文件
- read(byte[] bytes)把文件内容读入到字节数组,读取到内容返回字节的长度,如果没有内容返回-1.
FileInputStream fis = null;
try {
fis = new FileInputStream("d:\\Hello.java");
byte[] bytes = new byte[32];
int count = fis.read(bytes);
while (count != -1){
System.out.print(new String(bytes));
bytes = new byte[32];
count = fis.read(bytes);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(fis != null) {
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
FileOutputStream
FileOutputStream fos =null;
try {
fos = new FileOutputStream("D:\\data.txt");
String str = "Hello Word";
fos.write(str.getBytes());
fos.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fos != null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
练习:实现一个copy文件的功能
一个FileInputStream对象读文件
把读到的字节数组写入到另一个FileOutputStream对象
**注意:**写的时候用fos.write(bytes,0,count);避免把数组中的最后一次多余的字节写到文件中
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("D:\\19wlwlpf\\Snipaste_2022-08-05_16-31-04.png");
fos = new FileOutputStream("D:\\19wlwlpf\\New.png");
byte[] bytes = new byte[1024];
int count = fis.read(bytes);
while (count != -1){
//第一个参数是字节数组,第二个参数是数组下标的起始位置,第三个参数是这一次实际读到的字节数(要写的字节长度)
//避免最后一次读的时候数组的内容没有读满,后面的无效字节就不会写到文件中去。
fos.write(bytes,0,count);
count = fis.read(bytes);//继续读下一段字节
}
System.out.println("复制完成");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos != null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
BufferedReader
带有缓存的读字符流的类,主要用于读文本类型的文件
- ReadLine()读取一行内容,如果读到文件结尾,则返回null。
package com.hqyj.FileDemo;
import java.io.*;
public class BufferedReaderDemo {
public static void main(String[] args) {
BufferedReader bfr =null;
try {
bfr = new BufferedReader(new FileReader("D:\\idea\\javaseprojects\\java_HQYJ_Day13\\src\\Data01"));
//如果文件有内容,就返回当前行的内容,如果读到文件结束,就返回null
String line = bfr.readLine();
while (line != null){
System.out.println(line);
line = bfr.readLine();//更新line
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if(bfr != null){
try {
bfr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
BufferedWriter
带有缓存的写文本内容的类,用于写纯文本文件。
- write() 写字符串
- newLine() 回车换行
提示:如果文本文件中的内容用逗号分隔,文件名命名为.csv,这种文件可以用excel直接打开显示为表格)
package com.hqyj.FileDemo;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedWriterDemo {
public static void main(String[] args) {
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new FileWriter("D:\\idea\\javaseprojects\\java_HQYJ_Day13\\src\\Data02"));
bw.write("张三,22,男");
bw.newLine();//回车换行
bw.write("李四,23,女");
bw.flush();
System.out.println("写入成功");
} catch (IOException e) {
e.printStackTrace();
}finally {
if(bw != null){
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}