Java中的数据可以使用一套输入/输出流的通信系统来存储和获取,该系统是在java.io包中实现的。
I/O概述
输入/输出(Input/Output)是指对某个物理或逻辑设备或某种环境进行数据的输入或输出。由于数据存取的环境和设备不同,所以数据的读/写方案具有多样性。输入/输出问题在程序设计中是一个非常复杂的问题。Java针对此问题提出了自己的解决方案——流(Stream)对象。不同的输入/输出问题有不同的流对象,所有的数据都可以使用流写入和读出。流是程序中数据传输的一条途径。
数据流一般分为输入流(InputStream)和输出流 (OutputStream)两种,这两种数据流是两个抽象类,意味着其方法在不同的子类中有多种不同的实现方法。
文件
如何进行文件的读/写呢?
File类
不同的操作系统的路径名称表示是有差别的。一个File对象的实例被创建之后,它的内容不能被修改。File实例对象可以用于表示一个文件,还可以用于表示一个目录。该类提供了比较多的关于文件和目录的操作,甚至还可以查询文件系统。
文件或目录的生成
public File(String path)
public File(String path,String name)
public File(File dir,String name)
文件名的处理
String getName()
String getPath() //得到一个文件的路径名
String getAbsolutePath() //得到一个文件的绝对路径名
String getParent() //得到一个文件的上一级目录名
String renameTo(File newName) //将当前文件名更名为给定文件的完整路径
文件属性测试
boolean exists() //测试当前File对象所指示的文件是否存在
boolean canWrite() //测试当前文件是否可写
boolean canRead() //测试当前文件是否可读
boolean isFile() //测试当前文件是否是文件(不是目录)
boolean isDirectory() //测试当前文件是否是目录
普通文件信息和工具
long lasModified() //得到文件最近一次修改的时间
long length() //得到文件的长度,以字节为单位
boolean delete() //删除当前文件
目录操作
boolean mkdir() //根据当前对象生成一个由该对象指定的路径
String list() //列出当前目录下的文件
File类的应用
File类的使用实例
package java_11_28;
/*
* 描述:File类方法演示列出一个目录中的所有Java文件
*/
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
public class FileDemo {
public void ReadFileList(File file, Filter filter) {
if (file.isDirectory()) {
try {
//列出所有的文件及目录
File[] files = file.listFiles(filter); //创建目录数组
//通过数组创建数组列表
ArrayList<File> fileList = new ArrayList<File>();
//for循环遍历数组
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) { //判断是否为目录
//输出路径名
System.out.println("[" + files[i].getPath() + "]");
ReadFileList(files[i], filter);
} else {
fileList.add(files[i]);
}
}
//列出文件
for (File file2 : fileList) {
ReadFileList(file2, filter);
}
System.out.println();
} catch (ArrayIndexOutOfBoundsException e) {
// TODO: handle exception
e.printStackTrace();
}
} else if (file.isFile()) {
FileDesc(file);
}
}
private void FileDesc(File file) {
// TODO Auto-generated method stub
if (file.isFile()) {
System.out.print(file.toString() + "\n该文件");
System.out.print(file.canRead() ? "可读" : "不可读");
System.out.print(file.canWrite() ? "可写" : "不可写");
System.out.println(file.length() + "字节");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String fileName = args[0]; // 由参数获取文件名
//创建并初始化由文件名决定的文件对象
File file = new File(fileName);
Filter filter = new Filter("java"); //创建并初始化文件过滤器
new FileDemo().ReadFileList(file, filter);
}
}
class Filter implements FilenameFilter {
String extent;
//声明实现Filter类的构造方法
Filter(String extent) {
// TODO Auto-generated constructor stub
this.extent = extent; //初始化成员变量extent
}
//覆盖父类的accept()方法
public boolean accept(File dir, String name) {
return name.endsWith("." + extent); //返回文件的扩展名
}
}
运行结果如下所示:
File类主要是文件的抽象代表,如果要对文件进行输出/输入操作,则必须配合其它相关类使用。
RandomAccessFile类
在Java中,RandomAccessFile类可以给客户通过随机访问方法,使用它的seek()方法来指定存取的位置,位置移动的单位是字节。
构造方法
RandomAccessFile(String name,String mode);
name是文件名;mode是打开方式。
RandomAccessFile(File file,String mode);
file是文件对象。
文件指针操作
long getFilePointer();
用于得到当前的文件指针。
void seek(long pos);
用于移动文件指针到指定位置。
int skipBytes(int n);
使文件指针向前移动指定的n个字节。
RandomAccessFile类的应用
RandomAccessFile类方法读/写文件的实例
Employee.java
package java_11_28;
public class Employee {
String name;
int age;
final static int LEN = 8;
public Employee(String name, int age) {
super();
if (name.length() > LEN) {
name = name.substring(0, 8);
} else {
while (name.length() < LEN) {
name = name + "\u0000";
}
}
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static int size() {
return 2 * LEN + 4;
}
}
RandomAccessFileDemo.java
package java_11_28;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class RandomAccessFileDemo {
public static void RandomWriterFile(File file) {
Employee[] employees = new Employee[4];
employees[0] = new Employee("张三", 11);
employees[1] = new Employee("李思琪", 18);
employees[2] = new Employee("刘熠含", 21);
employees[3] = new Employee("苏铭", 17);
RandomAccessFile randomAccessFile = null;
try {
randomAccessFile = new RandomAccessFile(file, "rw");
} catch (FileNotFoundException e) {
// TODO: handle exception
e.printStackTrace();
}
try {
for (Employee e : employees) {
randomAccessFile.writeChars(e.getName());
randomAccessFile.writeInt(e.getAge());
}
randomAccessFile.close();
} catch (IOException e) {
// TODO: handle exception
}
}
private static String readName(RandomAccessFile randomAccessFile) throws IOException {
char[] name = new char[8];
for (int i = 0; i < name.length; i++) {
name[i] = randomAccessFile.readChar();
}
return new String(name).replace('\0', ' ');
}
public static Employee[] RandomReadFile(File file) throws Exception {
RandomAccessFile randomAccessFile;
randomAccessFile = new RandomAccessFile(file, "r");
Employee[] employee = new Employee[4];
int num = (int) randomAccessFile.length() / Employee.size();
for (int i = 0; i < num; i++) {
randomAccessFile.seek((i) * Employee.size());
employee[i] = new Employee(readName(randomAccessFile), randomAccessFile.readInt());
}
randomAccessFile.close();
return employee;
}
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
String fileName = "employeeExample";
File file = new File(fileName);
RandomReadFile(file);
Employee[] employee = RandomReadFile(file);
for (Employee e : employee) {
System.out.println("name=" + e.getName() + "\t|\t age=" + e.getAge());
}
}
}
运行结果如下所示:
程序有两个类:Employee类用于创建员工对象;RandomAccessFileDemo类实现了随机读/写文件的方法。
追求梦想的道路从来不是一蹴而就的。有时候,尝试一点点改变,也会带你离目标越来越近。愿你用行动浇灌梦想,遇见更好的自己。希望我的文章对你有帮助!