0
点赞
收藏
分享

微信扫一扫

Java之I/O系统(上 · 重要)

Java中的数据可以使用一套输入/输出流的通信系统来存储和获取,该系统是在java.io包中实现的。

Java之I/O系统(上 · 重要)_I/O系统

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);  //返回文件的扩展名
	}
}

运行结果如下所示:

Java之I/O系统(上 · 重要)_I/O系统_02

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());
		}
	}
}

运行结果如下所示:

Java之I/O系统(上 · 重要)_数据流_03

程序有两个类:Employee类用于创建员工对象;RandomAccessFileDemo类实现了随机读/写文件的方法。

追求梦想的道路从来不是一蹴而就的。有时候,尝试一点点改变,也会带你离目标越来越近。愿你用行动浇灌梦想,遇见更好的自己。希望我的文章对你有帮助!


举报

相关推荐

0 条评论