1.文件操作
文件---把数据持久化到磁盘的载体
文件的组成:1.文件的基本属性【文件命名,文件类型,文件的创建时间,文件的大小.....】
2.文件中的数据
我们要想通过java提供的输入输出流读写文件中的内容就得先学会操作文件。
Java中为我们提供了一个专门操作文件的java类--java.io.File类
2.File类的对象创建和常用方法?
File类的定义 public class File
File类的静态成员变量:
static String pathSeparator 与系统相关的路径分隔符字符,为方便起见,表示为字符串。
static char pathSeparatorChar 与系统相关的路径分隔符。
static String separator 与系统相关的默认名称 - 分隔符字符,以方便的方式表示为字符串。
static char separatorChar 与系统相关的默认名称分隔符。
File类的构造方法
File(String pathname) 通过给定的文件路径字符串创建新的 File实例。
File(String parent, String child) 通过给定的文件位置字符串和给定的文件名称字符串创建新的 File实例。
File(File parent, String child) 通过给定的文件位置File对象和给定的文件名称字符串创建新的 File实例。
File类的实例方法
boolean exists() 判断路径名表示的文件或目录是否存在。
boolean createNewFile() 创建新文件
boolean mkdirs() 创建新的文件夹
boolean delete() 删除文件/文件夹
删除文件夹的时候要将该文件夹下的文件和子文件夹全部删除
boolean canRead() 判断文件是否可读
boolean canWrite() 判断文件是否可写
boolean isHidden() 判断文件是否为隐藏文件。
boolean isFile() 判断文件对象是否为普通文件。
boolean isDirectory() 判断文件对象是否为目录。
String getPath() 得到文件对象的路径名字符串。
String getName() 得到文件对象所表示的文件或目录的名称。
String getParent() 得到文件对象所表示的路径的父目录路径
long length() 得到文件对象所表示的文件的长度。
long lastModified() 得到文件对象所表示的文件上次修改的时间。
String[] list() 得到文件对象代表的文件夹中的所有文件和文件夹名称返回一个字符串数组
File[] listFiles() 得到文件对象代表的文件夹中的所有文件和文件夹的文件对象,返回一个文件对象
3.输入输出流
输入输出流--读写文件
输入--从文件中获取数据到自己的程序中接受处理【读】
输出--将自己的程序中处理好的数据保存到文件中【写】
流----数据的移动轨迹
4.流的分类
按照数据的移动轨迹将流分为:输入流 输出流
按照每一次读/写数据量的大小将流分为:字节流 字符流
字节流:每一次可以读写一个字节的数据量,一个字节就是8位2进制,可以处理任何类型的文件【文本,图片,视频.......】
字符流: 每一次可以读写一个字符的数据量,一个字符就是16位2进制,只能处理文本类型的数据。
详细划分: 字节输入流 字节输出流 字符输入流 字符输出流
5.字节流相关类的使用
字节输出流---OutputStream---抽象类---不能new---子类
1.FileOutputStream类
FileOutputStream类构造方法:
FileOutputStream(File file) 通过File对象创建一个不可追加的字节输出流。
FileOutputStream(File file, boolean append) 通过File对象创建一个是否追加的字节输出流。
FileOutputStream(String name) 通过String 对象创建一个不可追加的字节输出流。
FileOutputStream(String name, boolean append)通过String对象创建一个是否追加的字节输出流。
FileOutputStream类实例方法:
void write(byte[] b) 将 b.length个字节从指定的字节数组写入此文件输出流。
void write(byte[] b, int off, int len) 将 len字节从位于偏移量 off的指定字节数组写入此 文件输出流。
void write(int b) 将指定的字节写入此文件输出流。
void close() 关闭此文件输出流并释放与此流相关联的任何系统资源。
2.DataOutputStream类
DataOutputStream类的构造方法
DataOutputStream(OutputStream out) 创建一个新的数据输出流,以将数据写入指定的底层输出流。
DataOutputStream类的实例方法
void writeBoolean(boolean v) 将 boolean写入底层输出流作为1字节值。
void writeByte(int v) 将 byte作为1字节值写入底层输出流。
void writeChar(int v) 将 char写入底层输出流作为2字节值,高字节优先。
void writeDouble(double v) 双参数传递给转换 long使用 doubleToLongBits方法在类 Double ,然后写入该 long值基础输出流作为8字节的数量,高字节。
void writeFloat(float v) 浮子参数的转换 int使用 floatToIntBits方法在类 Float ,然后写入该 int值基础输出流作为一个4字节的数量,高字节。
void writeInt(int v) 将底层输出流写入 int作为四字节,高位字节。
void writeLong(long v) 将 long写入底层输出流,为8字节,高字节为首。
void writeShort(int v) 将 short写入底层输出流作为两个字节,高字节优先。
void writeUTF(String str) 使用 modified UTF-8编码以机器无关的方式将字符串写入基础输出流
void flush() 刷新此数据输出流。
void close() 关闭此输出流并释放与此流相关联的任何系统资源。
优点:可以直接写出基本数据类型的数据和String,且不需要转换成字节数组
缺点:保存到文件中的数据是乱码
3.序列化---将一个java对象转换成2进制流数据过程
因为我们做操作的java对象可能需要在多台计算机之间传递。
如何实现序列化?
1.为被序列化的java对象的生成类实现一个序列化接口【Serializable】
public interface Serializable
特殊----该接口中一个方法都没有。
类的序列化由实现java.io.Serializable接口的类启用。
不实现此接口的类将不会使任何状态序列化或反序列化。
可序列化类的所有子类型都是可序列化的。
2.通过java提供ObjectOutputStream类的writeObject(Object obj)
ObjectOutputStream的构造方法
ObjectOutputStream(OutputStream out) 创建一个写入指定的OutputStream的ObjectOutputStream。
实例方法
void writeObject(Object obj) 将指定的对象写入ObjectOutputStream。
字节输入流---InputStream---抽象类---不能new---子类
1.FileInputStream类
FileInputStream类构造方法:
FileInputStream(File file) 通过File对象创建一个字节输入流
FileInputStream(String name) 通过String对象创建一个字节输入流
FileInputStream类实例方法
int read() 从该输入流读取一个字节的数据。
返回值:读取到的具体字节数据的int型,如果到达文件末尾返回-1
int read(byte[] b) 从该输入流读取最多 b.length个字节的数据为字节数组。
返回值:读取的总字节数, 如果到达文件末尾返回-1
void close() 关闭此文件输入流并释放与流相关联的任何系统资源。
2.DataInputStream类
DataInputStream类构造方法
DataInputStream(InputStream in)创建使用指定的底层InputStream的DataInputStream。
DataInputStream类实例方法
boolean readBoolean()
byte readByte()
char readChar()
double readDouble()
float readFloat()
int readInt()
long readLong()
short readShort()
String readUTF()
void close()
3.反序列 化---将2进制流数据转换成java对象的过程
需要ObjectInputStream类的Object readObject()方法读取对象。
ObjectInputStream类的构造方法
ObjectInputStream(InputStream in)
ObjectInputStream类的实例方法
Object readObject() 从ObjectInputStream读取一个对象。
6.字符流相关的操作类
字符输出流---Writer类---抽象类---不能new---子类
1.FileWriter类
FileWriter类的构造方法
FileWriter(File file) 给一个File对象构造一个FileWriter对象。
FileWriter(File file, boolean append) 给一个File对象构造一个是否允许追加FileWriter对象。
FileWriter(String fileName) 给一个String对象构造一个FileWriter对象。
FileWriter(String fileName, boolean append)给一个String对象构造一个是否允许追加FileWriter对象。
FileWriter类的实例方法
void write(char[] cbuf) 写入一个字符数组。
void write(char[] cbuf, int off, int len) 写入字符数组的一部分。
void write(int c) 写一个字符
void write(String str) 写一个字符串
void write(String str, int off, int len) 写一个字符串的一部分。
void close() 关闭流,先刷新。
void flush() 刷新流。
2.BufferedWriter类
BufferedWriter类的构造方法
BufferedWriter(Writer out)通过字符输出流的对象创建BufferedWriter
BufferedWriter类的实例方法
void newLine() 写一行行分隔符。
void write(char[] cbuf, int off, int len) 写入字符数组的一部分。
void write(int c) 写一个字符
void write(String s, int off, int len) 写一个字符串的一部分。
void close() 关闭流,先刷新。
void flush() 刷新流。
3.OutputStreamWriter类
OutputStreamWriter类构造方法
OutputStreamWriter(OutputStream out)将字节输出流转换成字符输出流
字符输入流---Reader类---抽象类---不能new---子类
1.FileReader类
FileReader类的构造方法
FileReader(File file) 给一个File对象构造一个FileReader对象。
FileReader(String fileName) 给一个String对象构造一个FileReader对象。
FileReader类的实例方法
int read() 读一个字符。返回值是读取的真实字符数据的整数值,如果已经达到流的末尾,则为-1
int read(char[] cbuf) 将字符读入数组。返回总字符数,如果到达文件末尾返回-1
void close() 关闭流并释放与之相关联的任何系统资源。
2.BufferedReader类
BufferedReader类构造方法
BufferedReader(Reader in)通过字符输入流对象创建一个BufferedReader
BufferedReader类实例方法
int read() 读一个字符。返回值是读取的真实字符数据的整数值,如果已经达到流的末尾,则为-1。int int read(char[] cbuf) 将字符读入数组。返回总字符数,如果到达文件末尾返回-1
void close() 关闭流并释放与之相关联的任何系统资源。
String readLine() 读一行文字。
BufferedReader Scanner
readLine()从文件中读取 nextLine()从键盘输入中读取
我们能不能通过BufferedReader读取键盘输入的数据?????
Scanner的nextLine()方法为什么可以读取键盘输入????
因为Scanner对象在创建的时候使用了System.in,System.in默认就是键盘输入。
只要在创建BufferedReader对象的时候,使用System.in就可以完成键盘输入。
BufferedReader(Reader in)参数是Reader字符输入流
System.in----InputStream类型字节输入流
解决问题的关键就是将InputStream类型字节输入流转换成Reader字符输入流。
3.InputStreamReader类【字节输入流转成字符输入流】
InputStreamReader类构造方法
InputStreamReader(InputStream in)字节输入流转成字符输入流