1.文件
1.定义:
通过File类来实现,File类>>磁盘存储的文件
2.路径的表示方式
\
被当作转义符, 表示路径c:\\temp\\est.txt
3.File类的构造函数
java
File file = new File(文件名 | 路径);
4.File类方法:
方法 | 说明 |
---|---|
File.exists() | 文件或者目录是否存在 |
File.isFile() | 是否是文件 |
File.isDirectory() | 是否是目录 |
File.getName() | 取文件或者目录的名字 |
File.getPath() | 取文件或者目录的路径 |
File.getAbsolutePath() | 取文件绝对路径 |
File.lastModified() | 最后修改日期 |
File.length() | 文件或者目录的字节大小 |
File.createNewFile() | 创建新文件 |
java
File file1 = new File("d:\\aa\\bb");
// 创建多目录
boolean mkdirs = file1.mkdirs();
System.out.println(mkdirs);
// 创建文件
File file = new File(file1, "cc.txt");
boolean newFile = file.createNewFile();
System.out.println(newFile);
5.文件操作
- mkdir()创建文件
- list()获取当前目录列表
2.流
1.定义
程序运行中的通信信道
数据类:
- 表示了字符或者字节数据的流动序列
- 数据源和程序之间的数据传输
- 数据流是指所有的数据通信通道
2.输入输出
所谓输入:就是将编程者所设计的程序看作流的终点
所谓输出:是将程序看作流的起点
输入、输出功能是通过有关流的操作来完成的
close( )
-
基本的输入输出对象
用法 类型 说明 System.out PrintStream 把输出送到缺省的显示(通常是显示器) System.in InputStream 从标准输入获取输入(通常是键盘) System.err PrintStream 把错误信息送到缺省的显示
每当main方法被执行时,就自动生成上述三个对象
3.流的分类
-
操作角度划分
- 输入流read, 程序看作终点,内容读到信道中;
- 输出流write, 程序看作起点.内容写到信道中;
-
传输内容划分:
-
字节流:会以字节的形式来处理数据。
-
字符流:会以字符的形式来处理数据
-
3.字节流
字节流采用ASCII编码即一个字节(8个位)为单位进行数据的输入和输出。(字节单位进行输入输出)
1.分类:
1)InputStream类,输入流的基类
方法:
- read():从流中读入数据
- skip():跳过流中若干字节数
- available():返回流中可用字节数
- mark():在流中标记一个位置
- reset():返回标记过得位置
- markSupport():是否支持标记和复位操作
- close():关闭流
2)OutputStream类,输出流的基类
方法:
- Close():关闭输出流
- flush():清空输出流缓冲区
- write(int b):写入单个字节到输出流
- write(byte[] buffer):写入一个字节数组到输出流。
2.FileInputStream类
方法 | 说明 |
---|---|
void close() | 关闭此文件输入流并释放与此流有关的所有系统资源 |
int read() | 从输入流中读取一个数据字节 |
int read(byte[ ] b) | 从输入流中将最多b.length个字节的数据读入到一个字节数组中 |
java
File file = new File("d:\\aa\\bb\\cc.txt");
FileInputStream fileInputStream = new FileInputStream(file);
// int data=-1;
while ( fileInputStream.read()!=-1){//读到文件末尾,fileInputStream.read()==-1
System.out.print((char) fileInputStream.read());
}
fileInputStream.close();
..................................
File file = new File("d:\\aa\\bb\\cc.txt");
FileOutputStream fileOutputStream = new FileOutputStream(file, true);//true时,append追加内容,每加载一次重新加入内容
for (int i = 97; i < 123; i++) {
fileOutputStream.write(i);
}
fileOutputStream.close();
3.FileOutputStream
方法 | 说明 |
---|---|
void close() | 关闭文件输出流并释放与此流有关的所有系统资源 |
void write(byte[ ] b) | 将b.length个字节从指定字节数组写入到此文件输出流中 |
void write(int b) | 将指定字节写入到此文件输出流 |
4.文件拷贝
java
File file = new File("d:\\aa\\bb\\cc.txt");
File file1 = new File("d:\\aa\\bb\\ff.txt");
FileInputStream fileInputStream = new FileInputStream(file);
FileOutputStream fileOutputStream = new FileOutputStream(file1);
int length = -1;
while ((length = fileInputStream.read()) != -1) {
fileOutputStream.write(length);
}
fileInputStream.close();
fileOutputStream.close();
5.缓冲的输入输出流
1).定义
Java在提供了字节流的缓冲区流:
BufferedInputStream
读取文件,将文件中8192字节全部读写出来,保存在缓冲区;
BufferedOutputStream
数据写入到缓冲中,等到8192字节后,一次性写入磁盘(或不满8192时,关闭流close()也能缓冲区内容写出)
通过缓冲区流,减少访问硬盘的次数,提高效率
2).特点
- 只有缓冲区满时,才会将数据送到输出流.
- Java在输出数据流中,当对方尚未将数据取走时,程序就会被阻塞.
- 有时要人为地将尚未填满的缓冲区中的数据送出,使用
flush()
方法
java
File file = new File("d:\\aa\\bb\\cc.txt");
File file1 = new File("d:\\aa\\bb\\ee.txt");
FileInputStream fileInputStream = new FileInputStream(file);
FileOutputStream fileOutputStream = new FileOutputStream(file1);
BufferedInputStream bis = new BufferedInputStream(fileInputStream);
BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream);
int data=-1;
while ((data= bis.read())!=-1){
bos.write(data);
}
bis.close();
bos.close();
fileInputStream.close();
fileOutputStream.close();
4.字符流
字符流采用UNICODE编码即2个字节(16个位)为单位进行数据的输入和输出。
1.分类
-
Reader
Reader类是所有输入流类的基类,是个抽象类。Reader类对应的子类的所有方法在发生错误时都会抛出IOException异常
包含类型:
- InputStreamReader
- BUfferedReader
- FileReader
常用方法:
方法 说明 abstract void close() 关闭输入源 int read() 从输入流读取单个字符的整数表示,如果不存在则返回-1 int read(char buffer[ ]) 从输入流中将字符读入数组,如果遇到文件结尾,返回-1 long skip(long n) 跳过n个字符,返回跳过的字符数 -
Writer
Writer类是所有输出流类的基类,也是个抽象类。
包含类型:
- OutputStreamWriter
- BufferedWriter
- FileWriter
方法:
方法 说明 abstract void close() 关闭输出流 Writer append(char c) 将指定字符追加到此 writer void write(int ch) 写入单个字符到调用的输出流 void write(String str) 写入str到调用输出流 abstract void close() 关闭输出流 abstract void flush() 清空输出缓冲区
2.InputStreamReader
继承了Reader,它实现了Reader的抽象方法。
- InputStreamReader是字节流通向字符流的桥梁,它使用指定的charset读取字节并将其解码为字符。
- 每次调用InputStreamReader中的一个read()方法都会导致从基础输入流读取一个或多个字节。
- 为了达到最高效率,可以考虑在BufferedReader内包装InputStreamReader,BufferedReader类
java
try {
File file = new File("d:\\aa\\bb\\cc.txt");
FileInputStream fileInputStream = new FileInputStream(file);
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
System.out.println(inputStreamReader.getEncoding());//编码格式
int data = -1;
while ((data = inputStreamReader.read()) != -1) {
System.out.print((char) data);
}
inputStreamReader.close();
fileInputStream.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
.........................
File file = new File("d:\\aa\\bb\\cc.txt");
FileOutputStream fileOutputStream = new FileOutputStream(file);//创建字节流
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);//创建字符流
outputStreamWriter.write("大家好!");
outputStreamWriter.close();
fileOutputStream.close();
1)方法:
方法 | 说明 |
---|---|
void close() | 关闭该流并释放与之关联的所有资源 |
String getEncoding() | 返回此流使用的字符编码的名称 |
int read() | 读取单个字符 |
boolean ready() | 判断此流是否已经准备好用于读取 |
3.OutputStreamWriter
OutputStreamWriter继承了Writer,它实现了Writer的抽象方法。
- OutputStreamWriter是字符流通向字节流的桥梁,这刚好与InputStreamReader相反。
- 他使用指定的charset将写入的字符编码转换为字节输出。
- 它使用的字符集可以由名称指定或显示给定,否则可能接受平台默认的字符集。
java
InputStreamReader inputStreamReader = new InputStreamReader(System.in);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
System.out.println("请输入姓名:");
String s = bufferedReader.readLine();
System.out.println("hello "+s);
1)方法
方法 | 说明 |
---|---|
void close() | 关闭该流并释放与之关联的所有资源 |
String getEncoding() | 返回此流使用的字符编码的名称 |
void write(char[] cbuf, int off, int len) | 写入字符数组的某一部分 |
void flush() | 刷新该流的缓冲 |
4.BufferedReader
BufferedReader由Reader类扩展而来,提供通用的缓冲方式文本读取,而且提供了很实用的readLine()方法
BufferedReader有两个构造函数
方法 | 说明 |
---|---|
BufferedReader(Reader inputStream) | 创建使用缺省尺寸输入缓冲区的缓冲字符输入流 |
BufferedReader(Reader inputStream,int bufsize) | 创建一个使用指定大小输入缓冲区的缓冲 |
BufferedReader的常用方法
方法 | 说明 |
---|---|
void close() | 关闭该流并释放与之关联的所有资源 |
int read() | 读取单个字符 |
int read(char[] cbuf, int off, int len) | 将字符读入数组的某一部分 |
String readLine() | 读取一个文本行 |
boolean ready() | 判断此流是否已准备好被读取 |
long skip(long n) | 跳过n个字符,并返回跳过的字符数 |
5.PrintWriter
PrintWriter继承了Writer类,但除此之外此类还实现了PrintStream中的所有print()方法, PrintWriter可以直接输出字符串
PrintWriter的常用方法
方法 | 说明 |
---|---|
void print(Object obj) | 打印对象 |
void write(String s) | 写入字符串 |
void close() | 关闭该流并释放与之关联的所有系统资源 |
void flush() | 刷新该流的缓冲 |
5.对象流
1.定义:
将对象的内容进行流化,能够输入输出对象的流称为对象流。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间
特点:在java.io包中对象的持续性,能够纪录自己的状态以便将来再生的能力
2.序列化Serializable
无论是何种类型的数据,都会以二进制序列形式在网络上传送,发送方需要把这个java对象转换为字节序列,才能在网络上传送,同时接收方则需要把字节序列再恢复为对象。
1)分类:
- 序列化:就是将对象的内容分解成字节流,以便存储在文件中或在网络上传输。
- 反序列化:就是打开并读取字节流,且从该流中恢复该对象
2)实现序列化
只有实现java.io.Serializable
接口的类才可以启用序列化功能。未实现此接口的类将无法启用任何状态的序列化和反序列化.
java
//将需要被序列化的类实现Serializable接口
public class Employee implements Serializable{ }
- 如果某个类能够被序列化,其子类也可以被序列化。
static
修饰的字段是不会被序列化的,序列化保存的是对象的状态而非类的状态,static静态域被忽略transient
修饰符修饰的字段不会被序列化。在序列化某个类的对象时,不希望某个字段被序列化(比如这个字段存放的是隐私值,如:密码等),那这时就可以用transient修饰符来修饰该字段
3.对象流类型
-
对象输入流ObjectInputStream
javaObjectInputStream objectInputStream = new ObjectInputStream(Files.newInputStream(Paths.get("d:\\aa\\bb\\data.txt"))); Student o = (Student) objectInputStream.readObject(); // Object o1 = objectInputStream.readObject();//向上转型 System.out.println(o); objectInputStream.close();
-
对象输出流ObjectOutputStream
javaObjectOutputStream objectOutputStream = new ObjectOutputStream(Files.newOutputStream(Paths.get("d:\\aa\\bb\\data.txt"))); Student student = new Student(1001, "arran", 24); objectOutputStream.writeObject(student); objectOutputStream.close();
4.实现类
对象输入流操作中:如果文件存在,但没有内容,通过对象流读取时会报
java.io.EOFException
异常 ,所以我们要加上条件判断,如果文件length()为0时,直接提示用户为空,不再往下执行程序对象输出流:当创建对象输出流后便会向文件中写内容,内容为
NULENO
,八个字节此处注意:添加操作中创建输出流的位置要放到查询全部之后,因为创建输出流成功时既会往文件里写内容,否则会报EOFException