Java IO包
- Java读写文件,只能以(数据)流的形式进行读写(Java和文件是两套平行的系统。由于文件可能很大,Java不能一口气将文件都加载进内存,只能以流的方式分批读取)
- java.io包中
–节点类:直接对文件进行读写
–包装类- 转化类:字节/字符/数据类型的转化类 (eg:一个int—>4个字节 —>int)
- 装饰类:装饰节点类 Bufferd
- 文件系统
- 字节:byte,8bit,最基础的存储单位
- 字符:a,10000(5个字符),我(一个字符)
- 数据类型:3,3.35,abd (数据类型在文件中也是以字节形式保存)
- 文件是以字节保存,因此程序将变量保存到文件需要转化
Stream 字节 er 字符 Stream&er 转化
节点类:直接操作文件类
- InputStream,OutputStream(字节)
子类:FileInputStream,FileOutputStream - Reader,Writer(字符)
子类:FileReader,FileWriter
转换类:字符到字节之间的转化
– InputStreamReader:文件读取时字节,转化为Java能理解的字符
– OutputStreamWriter:Java将字符转化为字节输入到文件中
– DataInputStream,DataOutPutStream:封装数据流(可直接输出Int,double,自动转换为字节) (数据类型–字节)
装饰类:装饰节点类
– BufferedInputStream, BufferOutputStream:缓存字节流(开一个缓存区,读写速度得到提升)【内存读写速度远快于硬盘,当程序需要保存数据到文件时,通常会在内存中开辟一个缓存区,CPU先指挥快速将数据写入内存缓存区,然后内存缓存区再缓慢转移到硬盘上,解放CPU,提高CPU使用率】
– BufferedRead,BufferWriter:缓存字符流
文本文件读写
FileOutputstream:(节点类)OutputStream的子类,往文件中写字节
OutputStreamWriter:(转换类)字节和字符转化
BufferWriter:写缓冲区类,加速写操作(write写方法,newLine换行方法)
三者关系:BufferWriter(OutputStreamWriter(FileOutputstream))
读文件:
public class TxtFileWriterTest {
public static void main(String[] args) {
writerFile1();
System.out.println("=============");
}
public static void writerFile1() {
FileOutputStream fos = null; // 节点类 负责写字节
OutputStreamWriter osw = null; //Java将字符转化为字节输入到文件中
BufferedWriter bw = null; // 装饰类 缓存字符流
try {
fos = new FileOutputStream("G:\\abc.txt"); // 节点类
osw = new OutputStreamWriter(fos, "UTF-8"); // 转化类
bw = new BufferedWriter(osw); // 装饰类
bw.write("we are");
bw.newLine();
bw.write("Echuers");
bw.newLine();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
bw.close(); // 关闭最后一个类,会将所有的底层流都关闭
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
写入写出都有两种方式(推荐第二种 try-resource,但是只有JDK7以上有)
try-with-resources语句是一种声明了一种或多种资源的try语句。资源是指在程序用完了之后必须要关闭的对象。try-with-resources语句保证了每个声明了的资源在语句结束的时候都会被关闭。
(如下面的例子第二种方式不用在finally中关闭资源)
public class TxtFileReader {
public static void main(String[] args) {
readFile1();
System.out.println("============");
readFile2(); // JDK7 以上才能使用
}
public static void readFile1() {
FileInputStream fis = null;
InputStreamReader isr = null;
BufferedReader br = null;
try {
fis = new FileInputStream("G:\\abc.txt");
isr = new InputStreamReader(fis, "UTF-8");
// 写时按UTF8写,读时也必须按照UTF8读,注意写时不写这个,默认为OS编码方式
br = new BufferedReader(isr);
String line;
while( (line = br.readLine()) != null) // 每次读取一行
{
System.out.println(line);
}
}catch (Exception e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void readFile2() {
String line;
// try-resource语句,自动关闭资源
try (BufferedReader in = new BufferedReader
(new InputStreamReader
(new FileInputStream("G:\\\\abc.txt")))){
while( (line = in.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
二进制文件读写
- 二进制文件
– 狭义:采用字节编码,非字符编码的文件
– 广义:一切文件都是二进制文件
–用记事本等无法打开/阅读 - 二进制文件读写
–输出数据到文件中
–从文件中读取数据
FileOutputstream:(节点类)负责写字节
BufferedOutputStream:(装饰类)负责写字节数据到缓冲区
DataOutputStream:(转化类)负责数据类型到字节转化
三者关系:DataOutputStream(BufferedOutputStream(FileOutputstream))
对比:下面是之前的文本文件
public class BinFileWriter {
public static void main(String[] args) {
writeFile();
System.out.println("done");
}
public static void writeFile() {
FileOutputStream fos = null;
DataOutputStream dos = null;
BufferedOutputStream bos = null;
try {
fos = new FileOutputStream("G://cyf.dat"); //节点类
bos = new BufferedOutputStream(fos); // 装饰类
dos = new DataOutputStream(bos); // 装饰类
dos.writeUTF("A");
dos.writeInt(20);
dos.writeInt(180);
dos.writeUTF("b");
} catch(Exception e){
e.printStackTrace();
} finally {
try {
dos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
详细代码不在详述