目录
1.File类
文件:相关记录或存放在一起的数据的集合
Java程序如何访问文件属性?
Java API:java.io.File类
File类访问文件属性:
File类的常用方法:
方法名称 | 说明 |
boolean exists( ) | 判断文件或目录是否存在 |
boolean isFile( ) | 判断是否是文件 |
boolean isDirectory( ) | 判断是否是目录 |
String getPath( ) | 返回此对象表示的文件的相对路径名 |
String getAbsolutePath( ) | 返回此对象表示的文件的绝对路径名 |
String getName( ) | 返回此对象表示的文件或目录的名称 |
boolean delete( ) | 删除此对象指定的文件或目录 |
boolean createNewFile( ) | 创建名称的空文件,不创建文件夹 |
long length() | 返回文件的长度,单位为字节, 如果文件不存在,则返回 0L |
import java.io.File;
import java.io.IOException;
public class TestFile {
public static void main(String[] args) {
File file = new File("E:\\eclipse_workspaces\\testDemo/test01.txt");
System.out.println("是否存在:"+file.exists());
System.out.println("是否文件:"+file.isFile());
System.out.println("是否目录:"+file.isDirectory());
System.out.println("相对路径:"+file.getPath());
System.out.println("绝对路径:"+file.getAbsolutePath());
System.out.println("获得名称:"+file.getName());
// System.out.println("删除:"+file.delete());
// try {
// System.out.println("创建空文件:"+file.createNewFile());
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
System.out.println("文件长度:"+file.length());
}
}
测试:
import java.io.File;
import java.io.IOException;
//文件操作:文件创建,获取文件相关信息,删除文件
public class FileDemo {
// 创建文件
public void create(File file) {
if (!file.exists()) {
// 如果文件不存在,则创建
try {
file.createNewFile();
System.out.println("文件已创建!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 获取文件信息
public void showFileInfo(File file) {
if (file.exists()) {
if (file.isFile()) {
// 是文件
System.out.println("文件名称:" + file.getName());
System.out.println("文件相对路径:" + file.getPath());
System.out.println("文件绝对路径:" + file.getAbsolutePath());
System.out.println("文件大小为:" + file.length() + "个字节");
}
if (file.isDirectory()) {
// 是目录
System.out.println("此文件是目录!");
}
} else {
System.out.println("此文件不存在!");
}
}
// 删除文件
public void delete(File file) {
if (file.exists()) {
file.delete();
System.out.println("文件已删除!");
}
}
// 测试方法
public static void main(String[] args) {
FileDemo fileDemo = new FileDemo();
File file = new File("E:\\eclipse_workspaces\\testDemo\\test.txt");//绝对路径
//File file = new File("test.txt");//相对路径
// fileDemo.create(file);
// fileDemo.showFileInfo(file);
fileDemo.delete(file);//删除文件
}
}
2.流
如何读写文件?
- 通过流来读写文件
- 流是一组有序的数据序列
- 以先进先出的方式发送信息的通道
Java流的分类:
2.1.InputStream
InputStream与FileInputStream
- InputStream类常用方法(抽象类-基类)
- int read( )
- 从输入流一个字节一个字节的读,返回的是该字节的整数表示形式,如果读到了输入流的末尾。返回 -1。
- int read(byte[ ] b)
- 从输入流读取若干字节,把这些字节保存到数组b中。返回的是读取到的字节数,,如果读到了输入流的末尾,返回-1。
- int read(byte[ ] b , int off , int len)
- 从输入流读取若干字节,把这些字节保存到数组b中。off指的是字节数组中开始保存数据的起始下标。len指的是读取的字节数目。返回的是实际读取到的字节数,如果读到了输入流的末尾,返回-1。
- void close( )
- 关闭输入流
- int available( )
- 可以从输入流中读取的字节数目
- int read( )
- 子类FileInputStream常用的构造方法
- FileInputStream(File file)
- FileInputStream(String name)
使用FileInputStream读文本文件操作步骤:
- 引入相关的类
import java.io.IOException;
import java.io.FileInputStream;
- 构造文件输入流-FileInputStream对象
FileInputStream fis= new FileInputStream("c:\\test.txt");
- 读取文本文件的数据
fis.available();
fis.read();
- 关闭文件流对象
fis.close();
代码演示:
//1.引入资源
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
//通过字节输入流完成对文件的读操作
public class FileInputStreamDemo {
public static void main(String[] args) {
FileInputStream fis = null;
try {
// 2.创建FileInputStream对象
fis = new FileInputStream("E:\\eclipse_workspaces\\testDemo\\test.txt");
System.out.println("可以读取到的字节数:" + fis.available());
// 3.借助FileInputStream对象的read()方法读取文件
// int data; //读取到的每个字节的整数表示形式 比如 和--104
// while ((data = fis.read()) != -1) {
// System.out.print((char) data);
// }
// 借助借助FileInputStream对象的read(byte[])方法读取文件
byte[] b = new byte[1024];
int data;// 读取到的字节数
while ((data = fis.read(b)) != -1) {
//字节读取到了字节数组b中,需要循环输出b的内容
for (int i = 0; i < data; i++) {
System.out.print((char)b[i]);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 4.关闭输入流
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2.2.OutputStream
OutputStream与FileOutputStream
- OutputStream类常用方法(抽象类-基类)
- white(int):
- 往输入流中写入一个个的字节。
- write(byte[] buf)
- 往输入流中写入一个字节数组。
- write(byte[] b,int off,int len)
- 往输入流中写入一个字节数组,off代表开始从字节数组的off位置开始往外写,len代表往外写len长度的字节。
- void close( )
- 关闭输出流。
- void flush()
- 强制把缓冲区的数据写到输出流中
- white(int):
- 子类FileOutputStream常用的构造方法
- FileOutputStream(File file)
- FileOutputStream(String name)
- FileOutputStream(String name,boolean append)
- 前两种构造方法在向文件写数据时将覆盖文件中原有的内容。
- 创建FileOutputStream实例时,如果相应的文件并不存在,则会自动创建一个空的文件
使用FileOutputStream读文本文件操作步骤:
- 引入相关的类
import java.io.IOException;
import java.io.FileOutputStream;
- 构造文件输入流-FileInputStream对象
FileOutputStream fos = new FileOutputStream("text.txt");
- 读取文本文件的数据
String str ="好好学习,天天向上!";
byte[] words = str.getBytes();
fos.write(words, 0, words.length);
- 关闭文件流对象
fos.close();
代码演示:
//1.引入资源
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
//通过字节输出流完成对文件的读操作
public class FileOutputStreamDemo {
public static void main(String[] args) {
FileOutputStream fos = null;
try {
// 2.创建字节输出流对象(FileOutputStream)
//fos = new FileOutputStream("E:\\eclipse_workspaces\\testDemo\\test.txt");
//不覆盖原有的内容。进行追加
fos = new FileOutputStream("E:\\eclipse_workspaces\\testDemo\\test.txt",true);
// 3.调用字节输出流对象(FileOutputStream)的write()方法写入文件
String infoString = "好好学习,天天向上!";
// 将写入的字符串打散为一个字节数组
byte[] infos = infoString.getBytes();
fos.write(infos, 0, infos.length);
System.out.println("test文件已被更新!");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
// 4.关闭输出流
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2.3.Reader
- 字符输入流Reader类常用方法(基类-抽象类)
- int read()
- int read(char[ ] c)
- int read(char[ ] ,int off ,int len)
- void close()
- File类是Reader类的孙子类
- FileReader (File file)
- FileReader (String name)
2.3.1.FileReader
使用FileReader读文本文件的操作步骤:
- 引入资源
- 创建FileReader对象
- 调用相应read()读取文件(文件操作)
- 关闭字符流
解决中文乱码问题:
- 手动调整
- 通过流读取时设置编码格式
- InputStreamReader(InputStream in)
- InputStreamReader(InputStream in,String charsetName)
2.3.2.BufferedReader
如何提高字符流读取文本文件的效率:使用FileReader类与BufferedReader类
BufferedReader类是Reader类的子类,BufferedReader带有缓冲区,内有按行读取内容的readLine()方法。
BufferedReader:
- 带有缓冲区的字符输入流
- 提高了文件的读取效率
-------------------------------------------------------------------------------------------------------------
- BufferedReader类常用的构造方法
- BufferedReader(Reader in)
- 子类BufferedReader特有的方法
- readLine()
使用BufferedReader读文本文件的操作步骤:
- 引入相关的类
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
- 构造 BufferedReader 对象和 FileReader 对象
Reader fr = new FileReader("C:\\myTest.txt ");
BufferedReader br=new BufferedReader(fr);
- 调用 readLine()方法读取数据
br.readLine();
- 关闭文件流对象
br.close();
fr.close();
2.4.Writer
- Writer类常用方法
- write(String str)
- write(String str,int off, int len)
- void close()
- void flush()
2.4.1.OutputStreamWriter
子类OutputStreamWriter常用的构造方法
- OutputStreamWriter(OutputStream out)
- OutputStreamWriter(OutputStream out,String charsetName) //指定字符输出格式
2.4.2.FileWriter
孙子类FileWriter
- FileWriter (File file)
- FileWriter (String name)
- 该类只能按照本地平台的字符编码来写数据,用户不能指定其他的字符编码类型
使用FileWriter写文件的操作步骤:
- 引入相关的类
import java.io.Reader;
import java.io.FileWriter;
Import java.io.IOException;
- 创建FileWriter对象
Writer fw= new FileWriter("D:\\myDoc\\简介.txt");
- 写文本文件
fw.write();
- 关闭相关的流对象
fw.close();
2.4.3.BufferedWriter
- BufferedWriter类带有缓冲区的字符输出类
- BufferedWriter(Write out)构建对象并使用
使用BufferedWriter写文件的操作步骤:
- 引入相关的类
import java.io.FileWriter ;
import java.io.BufferedWriter ;
import java.io.IOException;
- 创建 BufferedWriter 和 FileWriter 对象
FileWriter fw=new FileWriter("C:\\myTest.txt");
BufferedWriter bw=new BufferedWriter(fw);
- 调用write()方法写数据
bw.write("hello");
- 流对象的清空和关闭 flush()和close()
bw.flush();
fw.close();
2.5.读写二进制文件
- DataInputStream类
- FileInputStream的子类
- 与FileInputStream类结合使用读取二进制文件
- DataOutputStream类
- FileOutputStream的子类
- 与FileOutputStream类结合使用写二进制文件
2.5.1.DataInputStream
使用 DataInputStream 读二进制文件步骤:
- 引入相关的类
import java.io.FileInputStream;
import java.io.DataInputStream;
- 构建数据输入流对象
FileInputStream fis=new FileInputStream("C:\\HelloWorld.class");
DataInputStream dis=new DataInputStream(fis);
- 调用read()方法读取二进制数据
dis.read ();
- 关闭数据输入流
dis.close();
2.5.2.DataOutputStream
使用 DataOutputStream写二进制文件步骤:
- 引入相关的类
import java.io.FileOutputStream;
import java.io.DataOutputStream;
- 构建数据输出流对象
FileOutputStream outFile = new FileOutputStream("C:\\temp.class");
DataOutputStream out = new DataOutputStream(outFile);
- 调用write()方法读取二进制数据
out.write();
- 关闭数据输入流
out.close();
------------------------------------------------------------------
练习:复制文件
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
//CopyPicture
//借助DataInputStream和DataOutputStream实现二进制文件读写
public class CopyPicture {
public static void main(String[] args) {
//读取图片文件 E:/eclipse_workspaces/img.jpg
DataInputStream dis = null;
FileInputStream fis = null;
//将图片文件写 E:\eclipse_workspaces\testDemo\img.jpg
DataOutputStream dos = null;
FileOutputStream fos = null;
try {
//输入流
fis = new FileInputStream("E:/eclipse_workspaces/img.jpg");
dis = new DataInputStream(fis);
//输出流
fos = new FileOutputStream("E:\\eclipse_workspaces\\testDemo\\img.jpg");
dos = new DataOutputStream(fos);
//输入流读取二进制文件的同时,输出流写入二进制文件
int temp;
while ((temp = dis.read()) != -1) {
dos.write(temp);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
dos.close();
fos.close();
dis.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2.6.序列化和反序列化
调用Serializable接口
序列化过程:
序列化是将对象的状态写入到特定的流中的过程。
反序列化则是从特定的流中获取数据重新构建对象的过程。
--------------------------------------------------------------------------------
序列化的步骤:
- 实现Serializable接口
- 创建对象输出流
- 调用writeObject()方法将对象写入文件
- 关闭对象输出流
反序列化的步骤:
- 实现Serializable接口
- 创建对象输入流
- 调用readObject()方法读取对象
- 关闭对象输入流
transient :被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
eg:
注:学生类未展示
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
//序列化和反序列化学员对象
public class SeriaStu {
public static void main(String[] args) {
Student student = new Student(18, "张三", "男", "123456");
// 对象输出流
ObjectOutputStream oos = null;
FileOutputStream fos = null;
//对象输入流
ObjectInputStream ois = null;
FileInputStream fis = null;
try {
//构建对象输出流,为序列化做准备
fos = new FileOutputStream("E:\\eclipse_workspaces\\testDemo\\student.txt");
oos = new ObjectOutputStream(fos);
//构建对象输入流,为反序列化做准备
fis = new FileInputStream("E:\\eclipse_workspaces\\testDemo\\student.txt");
ois = new ObjectInputStream(fis);
//实现对象序列化
oos.writeObject(student);
//实现对象范序列化
Student student1 = (Student)ois.readObject();
System.out.println("反序列化出来的学生信息:"+student1.getAge()+"-"+student1.getName()+"-"+student1.getSex()+"-"+student1.getPassword());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
finally {
try {
ois.close();
fis.close();
oos.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
eg:
集合实现序列化
package dh06.demo04;
import java.util.List;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
//E:\\eclipse_workspaces\\testDemo\\student.txt
//序列化和反序列化学员对象-----集合
public class SeriaStu2 {
public static void main(String[] args) {
try {
List<Student> list = new ArrayList<Student>();
list.add(new Student(18, "张三", "男", "123456"));
list.add(new Student(22, "李四", "女", "666666"));
list.add(new Student(33, "王五", "男", "888888"));
// 序列化
OutputStream os = new FileOutputStream("E:\\eclipse_workspaces\\testDemo\\student.txt");
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(list);// 将对象存入
System.out.println("存入成功!!!");
// 反序列化
InputStream is = new FileInputStream("E:\\eclipse_workspaces\\testDemo\\student.txt");
ObjectInputStream ois = new ObjectInputStream(is);
List<Student> list2 = (List<Student>) ois.readObject();
for (Student student : list2) {
student.show();
}
oos.close();
os.close();
ois.close();
is.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
}