在变量、数组和对象中存储的数据是暂时存在的,程序结束后这些数据就会被清除。为了能够长期保存这些数据,需要将其储存在磁盘文件中,这样就可以在不同的程序中反复使用。Java中的I/O技术可以将数据保存在文本文件、二进制文件或者ZIP压缩文件中,达到永久保存数据的目的。
流是有序的数据序列,依据操作类型,分为输入流和输出流。I/O流提供了一条通道程序,可以使用通道把源中的字节序列送到目的地,这个源和目的地不仅仅可以使磁盘文件,也可以是键盘、鼠标、内存、显示器窗口等等。
InputStream(字节输入流)和Reader(字符输入流)都是抽象输入流类,是所有输入流类的父类。
file中文意思是文件,在Java中代表了磁盘文件本身的对象。File类属于java.io包,定义了一些与平台无关的方法来操作文件,可通过调用File类中的方法,实现文件的创建、删除、重命名等操作。File类的对象主要用于获取文件本身的信息,文件所在目录、文件长度、文件读写权限等。
(1)文件创建及删除
/*
* @author Jiacy
* @date 2020-2-15
* @version 1.0
* 判断D盘的myword文件夹是否存在word.txt文件,如果存在则删除,不存在则创建文件
*/
package exercise15;
import java.io.File;
public class FileTest {
public static void main(String[] args) {
File file = new File("word.txt"); //创建文件对象
if(file.exists()) { //如果文件存在
file.delete(); //删除该文件
System.out.println("文件已删除");
}else { //文件不存在
try { //try语句捕捉可能存在的异常
file.createNewFile(); //创建该文件
System.out.println("文件已创建");
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
运行结果
文件已创建
(2)获取文件信息
常用的获取文件信息方法有以下几种:
getName():获取文件名称
canRead():判断文件是否可读
canWrite():判断文件是否可被写入
exits():判断文件是否存在
length():获取文件长度(以字节为单位)
getAbsolutePath():获取文件绝对路径
getParent():获取文件的父路径
isFile():判断文件是否存在
isDirectory():判断文件是否为一个目录
isHidden():判断文件是否为隐藏文件
lastModified():获取文件最后修改时间
/*
* @author Jiacy
* @date 2020-2-15
* @version 1.0
* 获取当前文件夹下word.txt文件的名称、文件长度
* 判断该文件是否为隐藏文件
*/
package exercise15;
import java.io.File;
public class FileTest1 {
public static void main(String[] args) {
File file = new File("word.txt"); //创建文件对象
if(file.exists()) { //如果文件存在
String name = file.getName(); //获取文件名称
long length = file.length(); //获取文件长度
boolean hidden = file.isHidden(); //判断文件是否隐藏
system.out.println("文件名称:" + name);
System.out.println("文件长度:" + length);
System.out.println("是否为隐藏文件?" + hidden);
}else {
System.out.println("文件不存在!");
}
}
}
FileInputStream类与FileOutputStream类,用来操作磁盘文件。
/*
* @author Jiacy
* @date 2020-2-15
* @version 1.0
* 使用FileOutputStream向文件word.txt写入信息,
* 通过FileInputStream将文件中的数据读取到控制台。
*/
package exercise15;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileTest2 {
public static void main(String[] args) {
File file = new File("word.txt"); //创建文件对象
try {
//创建FileOutputStream对象
FileOutputStream out = new FileOutputStream(file);
//创建byte型数组
byte by[] = "我叫Jiacy,我热爱Java!".getBytes();
out.write(by); //将数组内容写入文件
out.close(); //关闭流
}catch(Exception e) { //处理异常信息
e.printStackTrace();
}
try {
//创建FileInputStream对象
FileInputStream in = new FileInputStream(file);
byte byt[] = new byte[1024]; //创建byte数组
int len = in.read(byt); //从文件中读取信息
//输出文件中的信息
System.out.println("文件中信息:" + new String(byt,0,len));
in.close(); //关闭流
}catch(Exception e) { //处理异常信息
e.printStackTrace();
}
}
}
运行结果:
文件中信息:我叫Jiacy,我热爱Java!
☆为了节约系统资源,在打开输入输出流并使用之后,应显式的将其关闭。
数据输入/输出流允许应用程序以与机器无关的方式从底层输入流读取基本Java数据类型,也就是说在读取数据时,不需再关心这个数值应当是哪种字节。
DataOutputStream类提供了3中写入字符串的方法。
1)writeBytes(String s):将字符串中的每一个字符的低字节内容写入目标设备;
2)writeChars(String s):将字符串中每个字符的两个字节内容都写入目标设备;
3)writeUTF(String s):将字符串按照UTF编码后的字节长度介入目标设备,然后写入每个字节的UTF编码。
DataInputStream类只提供了readUTF()方法返回字符串,是因为要先确定字符串的长度,才能准确地读出字符串。
/*
* @author Jiacy
* @date 2020-2-15
* @version 1.0
* 通过DataOutputStream类的writeUTF()、writeChars()、writeBytes()方法向文件中写入数据;
* 通过DataInputStream类的readUTF()将写入的数据输出至控制台
*/
package exercise15;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class DataTest {
public static void main(String[] args) {
try {
//创建FileOutputStream文件对象
FileOutputStream file = new FileOutputStream("word.txt");
//创建DataOutputStream数据对象
DataOutputStream data = new DataOutputStream(file);
//data.writeBytes("用writeBytes()方法写入数据:");
//data.writeChars("用writeChars()方法写入数据:");
data.writeUTF("用writeUFT()方法写入数据:");
data.close(); //关闭流
//创建FileInputStream文件对象
FileInputStream fileinput = new FileInputStream("word.txt");
//创建DataInputStream数据对象
DataInputStream datainput = new DataInputStream(fileinput);
System.out.print(datainput.readUTF()); //输出文件数据
}catch(Exception e) {
e.printStackTrace(); //异常处理
}
}
}
运行结果:
用writeUFT()方法写入数据:
用writeBytes()方法和writeChars()时的运行结果:
java.io.EOFException
at java.base/java.io.DataInputStream.readFully(DataInputStream.java:202)
at java.base/java.io.DataInputStream.readUTF(DataInputStream.java:614)
at java.base/java.io.DataInputStream.readUTF(DataInputStream.java:569)
at exercise15.DataTest.main(DataTest.java:32)
由于回读只能读取UFT编码后的字符串,所以在运行到回读时系统会捕获到异常并输出。
一步两步三步四步,总会走到一万步。 2020.2.15