欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java学习笔记(五)

程序员文章站 2022-05-12 22:36:48
...

十九、文件

    File类(java.io.File):

            构造器:

                    public File(String pathname):实例化File类的时候,必须设置好路径

Java学习笔记(五)

//例子:
import java.io.File;
public class FileDemo11 {
	public static void main(String args[]) {
		File my = new File("d:" + File.separator); // 操作路径
		print(my) ;
	}
	public static void print(File file) { 		// 递归调用此方法
		if (file != null) {			// 增加一个检查机制
			if (file.isDirectory()) {		// 判断是否是目录
				File f[] = file.listFiles() ;// 如果是目录,则列出全部内容
				if (f != null) {		// 有可能无法列出目录中的文件 
					for (int i = 0; i < f.length; i++) {
						print(f[i]);// 继续列出内容
					}
				}
			}else{
				System.out.println(file);	/ 如果不是目录,则直接打印路径信息
			}
		}
	}
}

    字节流与字符流      

        在java.io包中操作文件内容的主要有两大类:字节流、字符流,两类都分为输入和输出操作。在字节流中输出数据主要是使用OutputStream完成,输入使的是InputStream,在字符流中输出主要是使用Writer类完成,输入主要是使用Reader类完成。

        操作流程:(以文件操作为例)

                1. 使用File类打开一个文件

                2. 通过字节流或者字符流的子类,指定输出的位置

                3. 进行读/写操作

                4. 关闭输入/输出

        字节流:

            主要操作byte类型数据,字节输出流是OutputStream,字节输入流是InputStream

//例子:
//向文件中写入字符串
public static void main(String[] args) throws Exception { // 异常抛出,不处理
		// 第1步、使用File类找到一个文件
		File f = new File("d:" + File.separator + "test.txt"); // 声明File对象
		// 第2步:通过子类实例化父类对象
		OutputStream out = null; 		// 准备好一个输出的对象
		out = new FileOutputStream(f); 	// 通过对象多态性,进行实例化
		// 第3步:进行写操作
		String str = "Hello World!!!"; 	// 准备一个字符串
		byte b[] = str.getBytes(); // 只能输出byte数组,所以将字符串变为byte数组
		out.write(b); 				// 将内容输出,保存文件
		// 第4步:关闭输出流
		out.close(); 				// 关闭输出流
	}
//向文件中追加内容
public static void main(String[] args) throws Exception { // 异常抛出,不处理
		// 第1步、使用File类找到一个文件
		File f = new File("d:" + File.separator + "test.txt"); // 声明File对象
		// 第2步:通过子类实例化父类对象
		OutputStream out = null; 			// 准备好一个输出的对象
		out = new FileOutputStream(f,true); // 此处表示在文件末尾追加内容
		// 第3步:进行写操作
		String str = "Hello World!!!"; 		// 准备一个字符串
		byte b[] = str.getBytes(); // 只能输出byte数组,所以将字符串变为byte数组
		for (int i = 0; i < b.length; i++) {
			out.write(b[i]); 		// 将内容输出
		}
		// 第4步:关闭输出流
		out.close(); 				// 关闭输出流
	}
//从文件中读取内容
public static void main(String[] args) throws Exception { // 异常抛出,不处理
		// 第1步、使用File类找到一个文件
		File f = new File("d:" + File.separator + "test.txt"); // 声明File对象
		// 第2步:通过子类实例化父类对象
		InputStream input = null; 		// 准备好一个输入的对象
		input = new FileInputStream(f); 	// 通过对象多态性,进行实例化
		// 第3步:进行读操作
		byte b[] = new byte[1024]; 		// 所有的内容读到此数组之中
		input.read(b); 			// 把内容取出,内容读到byte数组之中
		// 第4步:关闭输入流
		input.close();					// 关闭输入流
		System.out.println("内容为:" + new String(b)); // 把byte数组变为字符串输出
	}

        字符流:

                在程序中一个字符相当于2个字节,字符输出流是Writer,字符输入流是Reader

//例子:
//向文件中写入数据
public static void main(String[] args) throws Exception { // 异常抛出,不处理
		// 第1步、使用File类找到一个文件
		File f = new File("d:" + File.separator + "test.txt"); // 声明File对象
		// 第2步:通过子类实例化父类对象
		Writer out = null; 				// 准备好一个输出的对象
		out = new FileWriter(f); 			// 通过对象多态性,进行实例化
		// 第3步:进行写操作
		String str = "Hello World!!!"; 			// 准备一个字符串
		out.write(str); 					// 将内容输出
		// 第4步:关闭输出流
		out.close(); 					// 关闭输出流
	}
//向文件中追加内容
public static void main(String[] args) throws Exception { // 异常抛出,不处理
		// 第1步、使用File类找到一个文件
		File f = new File("d:" + File.separator + "test.txt"); // 声明File对象
		// 第2步:通过子类实例化父类对象
		Writer out = null; 				// 准备好一个输出的对象
		out = new FileWriter(f,true);		// 通过对象多态性,进行实例化
		// 第3步:进行写操作
		String str = "\r\nLIXINGHUA\r\nHello World!!!" ; 	// 准备一个字符串
		out.write(str); // 将内容输出
		// 第4步:关闭输出流
		out.close(); 					// 关闭输出流
	}
//从文件中读取内容:
public static void main(String[] args) throws Exception { // 异常抛出,不处理
		// 第1步、使用File类找到一个文件
		File f = new File("d:" + File.separator + "test.txt"); // 声明File对象
		// 第2步:通过子类实例化父类对象
		Reader reader = null; 			// 准备好一个输入的对象
		reader = new FileReader(f); 		// 通过对象多态性,进行实例化
		// 第3步:进行读操作
		char c[] = new char[1024]; 		// 所有的内容读到此数组之中
		int len = reader.read(c); 		// 将内容输出
		// 第4步:关闭输入流
		reader.close(); 				// 关闭输入流
		System.out.println(“内容为:” + new String(c, 0, len)); // 把字符数组变为字符串输出
	}

        System类对IO的支持:

            System.out:系统标准输出,一般是显示器

            System.err:错误信息输出

            System.in:标准输入,一般是键盘

例子:
//使用OutPutStream向屏幕上输出
public static void main(String[] args) {
		OutputStream out = System.out ;		// 此时的输出流是向屏幕上输出
		try {
			out.write("hello world!!!".getBytes()) ;	// 向屏幕上输出
		} catch (IOException e) {
			e.printStackTrace();
		}
		try {
			out.close() ;				// 关闭输出流
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
//从键盘上读取数据
public static void main(String[] args) throws Exception { // 所有异常抛出
		InputStream input = System.in;			// 从键盘接收数据 
		byte b[] = new byte[5];			// 开辟空间,接收数据
		System.out.print("请输入内容:");			// 信息提示
		int len = input.read(b);				// 接收数据
		System.out.println("输入的内容为:" + new String(b, 0, len));
		input.close();					// 关闭输入流
	}

            数据操作流:

                在io包中,提供了数据输出流(DataOutputStream)和数据输入流(DataInputStream)

例子:
//将数据写入文件中
public static void main(String[] args) throws Exception {
		DataOutputStream dos = null ;			// 声明数据输出流对象
		File f = new File("D:" + File.separator + "order.txt");// 指定文件的保存路径
		dos = new DataOutputStream(new FileOutputStream(f)) ;// 实例化数据输出流对象
		String names[] = { "衬衣", "手套", "围巾" };	// 商品名称
		float prices[] = { 98.3f, 30.3f, 50.5f };	// 商品价格
		int nums[] = { 3, 2, 1 };			// 商品数量
		for (int i = 0; i < names.length; i++) {	// 循环写入
			dos.writeChars(names[i]) ;		// 写入字符串
			dos.writeChar('\t') ;		// 加入分隔符
			dos.writeFloat(prices[i]) ;		// 写入小数
			dos.writeChar('\t') ;		// 加入分隔符
			dos.writeInt(nums[i]) ;		// 写入整数
			dos.writeChar('\n') ;		// 换行
		}
		dos.close() ;				// 关闭输出流
	}
//从文件中读取数据
while(true){
			temp = new char[200] ;
			len = 0 ;
			while((c=dis.readChar())!='\t'){	// 读取字符
				temp[len] = c;
				len++ ;
			}
			name = new String(temp,0,len) ;
			price = dis.readFloat() ;		// 读取float
			dis.readChar() ;			// 读出\t
			num = dis.readInt() ;		// 读取int
			dis.readChar() ;			// 读出\n
				System.out.printf("名称:%s;价格:%5.2f;数量:%d\n",name,price,num) ;
		}

    对象序列化

        定义:就是把一个对象变成二进制的数据流的一种方法

        好处:方便的实现对象的传输或存储

        如果一个对象想被序列化,则对象所在的类必须实现java.io.Serializable接口

        要想完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象输入流(ObjectInputStream),使用对象输出流输出序列化对象的步骤,有时也称为序列化,而使用对象输入流读入对象的过程,有时也称为反序列化

//例子:
//将Person类的对象保到文件中
public static void main(String[] args) throws Exception {
		File f = new File("D:" + File.separator + "test.txt");
		ObjectOutputStream oos = null;
		OutputStream out = new FileOutputStream(f);	// 文件输出流
		oos = new ObjectOutputStream(out); 		// 为对象输出流实例化
		oos.writeObject(new Person("张三", 30));		// 保存对象到文件
		oos.close(); 					// 关闭输出
	}
//从文件中将Person对象反序列化
public static void main(String[] args) throws Exception {
		File f = new File("D:" + File.separator + "test.txt");
		ObjectInputStream ois = null;
		InputStream input = new FileInputStream(f);	// 文件输入流
		ois = new ObjectInputStream(input); 		// 为对象输出流实例化
		Object obj = ois.readObject(); 			// 读取对象
		ois.close();					// 关闭输出
		System.out.println(obj);
	}




相关标签: Java 笔记