一、File类
二、流的基本概念
三、Java流的分类
四、文件的读写
五、小结
---------------------------------------------------------------------------------------------------------------------------
一、File类
DeleteFile.java
public class DeleteFile {
public static void main(String[] args) {
// 输入想要删除的文件夹路径
File f =new File("E:\\a");
deleteFile(f);
}
public static void deleteFile(File f){
if(f.isDirectory()){
File[] files =f.listFiles();
for(File file1 : files){
if (file1.isFile()){
file1.delete();
}else {
deleteFile(file1);
}
file1.delete();
}
}
f.delete();
}
}
FileDemo.java
public class FileDemo {
public static void printFiles(File file){
File[] files = file.listFiles();
for(File file1 : files){
if(file1.isDirectory()){
printFiles(file1);
}else{
System.out.println(file1.getAbsolutePath());
}
}
}
public static void main(String[] args) {
String path = "E:\\20212022年HomeWork";
File file = new File(path);
printFiles(file);
}
}
TestFile.java
public class TestFile {
public static void main(String[] args){
File file = new File("E:/moring.txt");
// 创建文件或目录
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(file.canExecute());
System.out.println(file.canRead());
System.out.println(file.canWrite());
// 删除文件
// System.out.println(file.delete());
System.out.println(file.exists());
// 获取文件的绝对路径
System.out.println(file.getAbsoluteFile());
System.out.println(file.getAbsolutePath());
try {
// 获取文件的规范路径
System.out.println(file.getCanonicalPath());
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(file.getName());
System.out.println(file.getParent());
System.out.println(file.getPath());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
System.out.println(file.lastModified());
System.out.println(file.length());
System.out.println(file.list());
System.out.println(file.listFiles());
System.out.println(file.toPath());
System.out.println(file.toString());
}
}
二、流的基本概念
• 如何读写文件?
• 通过流来读写文件
– 流是指一连串流动的字符,是以先进先出方式发
▪ 送信息的通道
▪ 输入/输出流与数据源
▪ XXX->程序-->输入流
▪ 程序->XXX-->输出流
三、Java流的分类
输入输出流是相对于计算机内存来说的,而不是相对于源和目标
字节流是 8 位通用字节流,字符流是 16 位 Unicode 字符流
▪ 功能不同
– 节点流:可以直接从数据源或目的地读写数据。
– 处理流(包装流):不直接连接到数据源或目的地,是其他流进行封装。目
的主要是简化操作和提高性能。
▪ 节点流和处理流的关系
– 节点流处于io操作的第一线,所有操作必须通过他们进行
– 处理流可以对其他流进行处理(提高效率或操作灵活性)
四、文件的读写
• 文本文件的读写
– 用FileInputStream和FileOutputStream读写文本文件
– 用BufferedReader和BufferedWriter读写文本文件
• 二进制文件的读写
– 使用DataInputStream和DataOutputStream读写二进制文件以及
基本数据类型数据的读写
• 对象的读写
– 使用ObjectInputStream和ObjectOutputStream读写对象(序列
化与反序列化)
BufferedReaderDemo.java
public class BufferedReaderDemo {
public static void main(String[] args) {
FileReader fileReader =null;
BufferedReader bufferedReader =null;
try {
fileReader = new FileReader("a.txt");
bufferedReader = new BufferedReader(fileReader);
// int length = 0;
// char[] chars = new char[1024];
// while((length = bufferedReader.read(chars))!= -1){
// System.out.println(new String(chars,0,length));
// }
// String s = bufferedReader.readLine();
// System.out.println(s);
// s = reader.readLine();
// System.out.println(s);
// s = reader.readLine();
// System.out.println(s);
// s = reader.readLine();
// System.out.println(s);
// s = reader.readLine();
// System.out.println(s);
String str = "";
while ((str = bufferedReader.readLine())!= null){
System.out.println(str);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
BufferedWriterDemo.java
public class BufferedWriterDemo {
public static void main(String[] args) {
FileWriter fileWriter =null;
BufferedWriter bufferedWriter =null;
try {
fileWriter = new FileWriter("d1.txt");
bufferedWriter = new BufferedWriter(fileWriter);
bufferedWriter.write(101);
bufferedWriter.write("www.baidu.com百度".toCharArray());
//写一个换行
bufferedWriter.newLine();
bufferedWriter.write("今天天气真不错");
bufferedWriter.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
上机练习
1.CopyTxtDemo.java
public class CopyTxtDemo {
public static void main(String[] args) {
//创建数据源
File src = new File("F:\\我的青春谁做主.txt");
//创建目标数据源
File dest = new File("E:\\我的青春谁做主.txt");
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
//创建输入流对象
fileInputStream = new FileInputStream(src);
//创建输出流对象
fileOutputStream = new FileOutputStream(dest);
//接受每次读取的数据
int length = 0;
//定义一个缓冲区
byte[] buffer = new byte[1024];
//传输数据
while ((length = fileInputStream.read(buffer))!=-1){
//输出到目标数据源
fileOutputStream.write(buffer,0,length);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2.CopyJpgDemo.java
public class CopyJbgDemo {
public static void main(String[] args) {
//创建数据源
File src = new File("F:\\1.jpg");
//创建目标数据源
File dest = new File("E:\\1.jpg");
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
//创建输入流对象
fileInputStream = new FileInputStream(src);
//创建输出流对象
fileOutputStream = new FileOutputStream(dest);
//接受每次读取的数据
int length = 0;
//定义一个缓冲区
byte[] buffer = new byte[1024];
//传输数据
while ((length = fileInputStream.read(buffer))!=-1){
//输出到目标数据源
fileOutputStream.write(buffer,0,length);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3.(1)BufferedDemo.java
public class BufferedDemo {
public static void main(String[] args) {
FileReader fileReader= null;
FileWriter fileWriter= null;
BufferedWriter bufferedWriter= null;
try {
fileReader = new FileReader("虞美人.txt");
File file=new File("虞美人2.txt");
fileWriter = new FileWriter(file);
bufferedWriter = new BufferedWriter(fileWriter);
char[] cbuf=new char[1024];
int len;
while ((len=fileReader.read(cbuf))!=-1){
bufferedWriter.write(cbuf,0,len);
System.out.print(new String(cbuf,0,len));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
(2)BufferedDemo.java
public class BufferedDemo1 {
public static void main(String[] args) {
File file=new File("a2.txt");
if (!file.exists()){
file.mkdir();
}
File file1=new File("虞美人2.txt");
if (!file1.exists()){
try {
file1.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
(3)BufferedDemo.java
public class BufferedDemo2 {
public static void main(String[] args) {
FileWriter fileWriter = null;
BufferedWriter bufferedWriter = null;
try {
File file=new File("a1.txt");
if (!file.exists()){
file.mkdir();
}
File file1=new File("虞美人.txt");
if (!file1.exists()){
file1.createNewFile();
}
fileWriter = new FileWriter(file1);
bufferedWriter = new BufferedWriter(fileWriter);
bufferedWriter.write("《虞美人》"+"\n");
bufferedWriter.write("春花秋月何时了?"+"\n");
bufferedWriter.write("往事知多少。"+"\n");
bufferedWriter.write("小楼昨夜又东风,"+"\n");
bufferedWriter.write("故国不堪回首月明中。"+"\n");
bufferedWriter.write("雕栏玉砌应犹在,"+"\n");
bufferedWriter.write("只是朱颜改。"+"\n");
bufferedWriter.write("问君能有几多愁?"+"\n");
bufferedWriter.write("恰似一江春水向东流。"+"\n");
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void test1(){
File file=new File("a2.txt");
if (!file.exists()){
file.mkdir();
}
File file1=new File("虞美人2.txt");
if (!file1.exists()){
try {
file1.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void test2(){
FileReader fileReader= null;
FileWriter fileWriter= null;
BufferedWriter bufferedWriter= null;
try {
fileReader = new FileReader("虞美人.txt");
File file=new File("虞美人2.txt");
fileWriter = new FileWriter(file);
bufferedWriter = new BufferedWriter(fileWriter);
char[] cbuf=new char[1024];
int len;
while ((len=fileReader.read(cbuf))!=-1){
bufferedWriter.write(cbuf,0,len);
System.out.print(new String(cbuf,0,len));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
4.(1)User.java
public enum User implements Serializable {
//1.提供当前枚举类的多个对象,多个对象之间用逗号" , "隔开,末尾使用分号" ; "
userInfo1("Jack",18),
userInfo2("Jay",18),
userInfo3("Roman",20);
//2.声明User对象的属性:private final修饰
private final String userName;
private final int age;
//3.私有化类的构造器,并给对象赋值
User(String userName, int age) {
this.userName = userName;
this.age = age;
}
//4.其他诉求1:获取枚举类对象的属性
public String getUserName() {
return userName;
}
public int getAge() {
return age;
}
//4.其他诉求1:提供toString()
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", age=" + age +
'}';
}
}
(2)BufferedWriterPractice.java
public class BufferedWriterPractice {
public static void main(String[] args) {
FileWriter fileWriter= null;
BufferedWriter bufferedWriter= null;
try {
File file=new File("d2.txt");
fileWriter = new FileWriter(file);
bufferedWriter = new BufferedWriter(fileWriter);
User userInfo1=User.userInfo1;
User userInfo2=User.userInfo2;
User userInfo3=User.userInfo3;
bufferedWriter.write(userInfo1.getUserName()+","+userInfo1.getAge()+",");
bufferedWriter.write(userInfo2.getUserName()+","+userInfo2.getAge()+",");
bufferedWriter.write(userInfo3.getUserName()+","+userInfo3.getAge());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
(3)BufferedReaderPractice.java
public class BufferedReaderPractice {
public static void main(String[] args) {
FileReader fileReader = null;
BufferedReader bufferedReader = null;
ObjectInputStream objectInputStream = null;
try {
fileReader = new FileReader("d2.txt");
bufferedReader = new BufferedReader(fileReader);
File file = new File("d2.txt");
char[] chars = new char[1024];
int length = 0;
while ((length = bufferedReader.read(chars)) != -1) {
User user =User.valueOf("userInfo1");//valueOf():可以根据对象名去调用信息
User user1 = User.valueOf("userInfo2");
User user2 = User.valueOf("userInfo3");
System.out.println(user.toString());
System.out.println(user1.toString());
System.out.println(user2.toString());
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (objectInputStream !=null){
objectInputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
五、小结
• InputStream类常用方法
– int read( )
– int read(byte[] b)
– int read(byte[] b,int off,int len)
– void close( )
– int available()
子类FileInputStream常用的构造方法
– FileInputStream(File file)
– FileInputStream(String name)
• OutputStream类常用方法
– void write(int c)
– void write(byte[] buf)
– void write(byte[] b,int off,int len)
– void close( )
子类FileOutputStream常用的构造方法
– FileOutputStream (File file)
– FileOutputStream(String name)
– FileOutputStream(String name,boolean append)
1、前两种构造方法在向文件写数据时将覆盖文件中原有的内容
2、创建FileOutputStream实例时,如果相应的文件并不存在,则会自动创建一个空的文件
Reader类常用方法
– int read( )
– int read(byte[] c)
– read(char[] c,int off,int len)
– void close( )
子类BufferedReader常用的构造方法
– BufferedReader(Reader in)
子类BufferedReader特有的方法
– readLine()
Writer类常用方法
– write(String str)
– write(String str,int off,int len)
– void close()
– void flush()
子类BufferedWriter常用的构造方法
– BufferedReader(Writer out)
• File 类用于访问文件或目录的属性
• 程序和数据源之间通过流联系
– 输入流和输出流
– 字节流和字符流
– 节点流和包装流
• FileInputStream和FileOutputStream以字节流的方式读写文本文件。
• BufferedReader和BufferedWriter以字符流的方式读写文本文件,而且效率更高。