目录
IO体系:
File类及常用方法
在程序中抽象表示计算机中文件和目录(文件夹);
一个具体的File类对象可以表示一个具体的文件或目录
File f =new File(pathname: );
File
类是
java.io
包中很重要的一个类;
1.File
类的对象可以表示文件,还可以表示目录,在程序中一个
File
类对象可以代
表一个文件或目录;
2.File
对象可以对文件或目录的属性进行操作,如:文件名、最后修改日期、文件
大小等;
3.File
对象无法操作文件的具体数据,即不能直接对文件进行读
/
写操作。
file类构造方法:
f1相对路径f2f3绝对路径;
一些常用的File方法:
File f = new File("D:/123");
File f1 = new File("D:/123/456.txt");
System.out.println(f.getAbsoluteFile());//获取文件绝对路径
System.out.println(f.getParent());//获取文件父级路径
System.out.println(f.lastModified());//获取文件最后修改时间
long s = f1.length();
System.out.println(s);//获取文件长度 单位:字节
System.out.println(f.canRead());//文件是否可读 f.canWrite可写
System.out.println(f.isFile());//是否是文件
System.out.println(f.isDirectory());//是否是目录
f.delete();//删除 删除目录的时候目录必须为空
System.out.println(f.mkdir());//创建单级目录
System.out.println(f.mkdirs());//创建多级目录
String f = f1.list();//获得某个目录中所有子集目录/文件
输入及输出的概念
输入输出(
I/O):
把电脑硬盘上的数据读到程序中,称为输入,
即
input,
进行数据的read
操作从程序往外部设备写数据,称为输出,即
output
,进行数据的
write操作
输入流与输出流
流按着数据的传输方向分为:
●
输入流:往程序中读叫输入流。
●
输出流:从程序中往外写叫输出流。
● InputStream和OutputStream的子类都是字节流 可以读写二进制文件,主要处理音频、图片、歌曲、字节流,处理单元 为1个字节。
● Reader和Writer的子类都是字符流 主要处理字符或字符串,字符流处理单元为1个字符。 字节流将读取到的字节数据,去指定的编码表中获取对应文字
字节流与字符流
字节流中常用类
字节输入流
FileInputStream
字节输出流
FileOutputStream
字符流中常用类
字符输入流
FileReader
字符输出流
FileWriter
FileInputStream f1 = new FileInputStream("");
FileOutputStream f2 = new FileOutputStream("");
FileReader reader = new FileReader("D:/853/一号.txt");
FileWriter writer = new FileWriter("D:/853/二号.txt");
输入输出字节流
InputStream
的基本方法
读取一个字节并以整数的形式返回
(0~255),
如果返回
-1
已到输入流的末尾。
int read() throws IOException
读取一系列字节并存储到一个数组
buffer
,
返回实际读取的字节数,如果读取前已到输入流的末尾返回-1
int read(byte[] buffer) throws IOException
关闭流释放内存资源
void close() throws IOException
OutputStream
的基本方法
向输出流中写入一个字节数据
,
该字节数据为参数
b
的低
8
位
void write(int b) throws IOException
将一个字节类型的数组中的从指定位置(
off
)开始的
len
个字节写入到输出流
void write(byte[] b, int off, int len) throws IOException
关闭流释放内存资源
void close() throws IOException
节点流与处理流
●
根据封装类型不同流又分为
节点流 处理流
● 节点流:
如果流封装的是某种特定的数据源,如文件、字符串、字符串数组等,则称为节点流。
● 处理流
:
如果流封装的是其它流对象,称为处理流。 处理流提供了缓冲功能,提高读写效率,
同时增加了一些新的方法
节点流中常用类
字节输入流
FileInputStream
字节输出流
FileOutputStream
字符输入流
FileReader
字符输出流
FileWriter
处理流中常用类
缓冲字节输出流
BufferedOutputStream
缓冲字节输入流
BufferedInputStream
缓冲字符输入流
BufferedReader
缓冲字符输出流
BufferedWriter
用法(往下面看):
package Lx22.Day0712;
import java.io.*;
import java.io.FileOutputStream;
public class Demo1 {
public static void main(String[] args) throws IOException {
FileInputStream f1 = new FileInputStream("");
FileOutputStream f2 = new FileOutputStream("");
BufferedInputStream f3 = new BufferedInputStream(f1);
BufferedOutputStream f4 = new BufferedOutputStream(f2);
int b = 0;
while ((b = f3.read()) != -1) {//read 把读到的数据缓冲到底层数组
f4.write(b);//write 时并不是每write一次就向磁盘写数据,等待内部缓存数组写满时,在向磁盘输出
}
f4.flush();//刷新缓冲输出流。
f3.close();//关闭此输入流并释放与流相关联的任何系统资源
}
}
package Lx22.Day0712;
import java.io.*;
public class Demo2 {
public static void main(String[] args) throws IOException {
/*FileReader reader = new FileReader("D:/853/一号.txt");
FileWriter writer = new FileWriter("D:/853/二号.txt");
int c = 0;
while((c= reader.read())!=-1){
writer.write(c);
}
reader.close();
writer.close();*/
FileReader reader = new FileReader("D:/853/一号.txt");
FileWriter writer = new FileWriter("D:/853/二号.txt");
BufferedReader bufferedReader = new BufferedReader(reader);
BufferedWriter bufferedWriter = new BufferedWriter(writer);
String line = null;
while ((line = bufferedReader.readLine()) != null) {//一次读一行数据
System.out.println(line);
bufferedWriter.write(line);
bufferedWriter.newLine();//换行
}
bufferedReader.close();
bufferedWriter.flush();
bufferedWriter.close();
}
}
输入输出字符流
●Reader
的基本方法
读取一个字符并以整数的形式返回
,
如果返回
-1
已到输入流的末尾。
int read() throws IOException
while ((b = f3.read()) != -1) {//read 把读到的数据缓冲到底层数组
f4.write(b);//write 时并不是每write一次就向磁盘写数据,等待内部缓存数组写满时,在向磁盘输出
}
读取一系列字符并存储到一个数组
buffer
,返回实际读取的字符数,如果读取前已到输入流的末尾返回-1
int read( char[] cbuf) throws IOException
关闭
void close() throws IOException
• Writer
的基本方法
向输出流中写入一个字符数据
,
该字节数据为参数
b
的
16
位
void write(int c) throws IOException
一个字符类型的数组中的数据写入输出流
void write( char[] cbuf) throws IOException
将一个字符类型的数组中的从指定位置(
off set
)开始的
length
个字符写入到输出流
void write( char[] cbuf, int off set, int length) throws IOException
关闭
void close() throws IOException
Print流
Print 打印流:
只做输出没有输入 打印流分为字节打印流和字符打印流
PrintWriter:
字符打印流 print方法可以打印各种类型数据
在javaweb项目中,服务器端向客户端响应数据以打印流的方式响应.
对象输入输出流--对象序列化
●
对象的寿命通常随着生成该对象的程序的终止而终止。 有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。
●
对象的输入输出流 :
主要的作用是用于写入对象信息与读取对象信息。 对象信息 一旦写到文件上那么对象的信息就可以做到持久化了.
对象的输出流:ObjectOutputStream
对象的输入流:ObjectInputStream
都属于处理流
● 在ObjectInputStream 中用readObject()方法可以直接读取一个对象,ObjectOutputStream中用writeObject()方法可以直接将对象保存到输出流中。
●
对象的输出流将指定的对象写入到文件的过程,就是将对象序列化的过程.
●
对象 的输入流将指定序列化好的文件读出来的过程,就是对象反序列化的过程。
反序列化也是创建对象的一种方法
●
对象的输出流将对象写入到文件中称之为对象的序列化,所以被序列化对象的类必须要实现 Serializable接口。 Serializable接口中没有任何方法。当一个类声明实现Serializable接口后,表明该类可被序列化。
在类中可以生成一个编号
private static final long serialVersionUID = -5974713180104013488L;
●
随机生成 唯一的 serialVersionUID 用来表明实现序列化类的不同版本间的兼容性。某个类在与之对应的对象已经序列化出去后做了修改,该对象依然可以被正确反序列化.
●
如果不显示生成序列号,那么将会隐式生产,但是隐式生成后,类一旦发生改变,序列号也会随之改变.所以我们最好显示生成序列号
transient
关键字
默认情况下当执行了对象序列化的时候会将类中的全部属性的内容进行全部的序列化操作,
但是很多情况下有一些属性可能并不需要序列化的处理,这个时候就可以在属性的定义上使
用
transient
关键字来完成了。
private transient String name;