当前位置: 首页 > 工具软件 > OIOSAML.JAVA > 使用案例 >

javaI/O

松俊美
2023-12-01


    一、文件处理

      1.File类概述

      在java中对文件处理的类是File类,它用于对文件和目录的检查和操作。例如创建、删除、改名、以及查看相关信息(文件大小、创建时间等)。java中的目录被当作是一种特殊的文件,所以也是用File类进行处理。

  在java中,File类的操作是与平台无关的,不论是对Linux还是Windows平台,都可以用一致的方式进行处理。

  2.File类的使用

  File类描述了文件对象的属性和提供了对文件对象的操作。下面是一些常见的File类方法

  File(String pathname)用一个给定路径名创建一个新的文件类实例

 boolean exists()测试文件或目录是否存在

 boolena isFile()测试文件是否是一个标准文件

 boolean isDirectory测试文件是否是一个目录

 long length()得到文件长度

 String getPath()获得文件路径

 boolean canRead()文件是否可读

 String[] list返回字符串数组,其值是文件中的文件和文件名

 File[] listFiles(FilenameFilter filter)返回file数组,其值是目录中满足指定过滤器的文件和目录

 3.File类的简单应用,列出目录下的各级文件名

package itcast.ioStu;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
public class FileStudy {
	public static void main(String[] args) {
	  File file=new File("F:/");
	     allDirs(file);
	}
	//列出目录下的所有目录,相互迭代出目录中的文件
	public static void allDirs(File file)
	{
		System.out.println(file.getName());//输出 文件名
		if(file.isDirectory()){//如果是目录
		File[] files=file.listFiles();
		System.out.println(file.getName());
		for (File file2 : files) {
			allDirs2(file2);
		}
		
	  }
	}
	//列出目录下的所有目录,相互迭代出目录中的文件
	public static void allDirs2(File file)
	{
		if(file.isDirectory()){
		File[] files=file.listFiles();
		System.out.println(file.getName());
		for (File file2 : files) {
			allDirs(file2);
		}
	  }
	}
}
4、RandomAccessFile类:随机读取文件类,此类的实例支持对随机访问文件的读取和写入

 1.特点:

     RandomAccessFile提供了众多的文件访问方法,支持随机访问方式

     RandomAccessFile类在随机读写等长记录格式的文件时有很大的优势。

二、java中流

(一)、1.流的概念:Java中流类分为两大类,节点流和过滤流(也叫处理流)。

    (1)、节点流:用于直接操作设备目标的流

    (2)、过滤流:间接处理节点流的流类

  2、java中主要使用的流

    (1)字节流类:适用于对二进制文件的操作,它分为字节输入流和字节输出流

    InputStream 字节输入流抽象类                                         OutputStream字节输出流抽象类

    FileInputSteam 字节文件输入流                                         FileOutputSteam 字节文件输出流        

    FilterInputStream 过滤文件输入流                                      FilterOutputStream 过滤文件输出流        

    BufferedInputStream 缓冲字节输入流                                 BufferedOutputStream 缓冲字节输出流

(2)字符流:适用于对文本文件进行操作,它分为字符输入流和字符输出流

   Reader字符输入流抽象类                                                    Writer字符输出流抽象类

   InputStreamReader 字符输入流                                             InputStreamWriter 字符输入流

   FilerReader字符文件输入流                                                     FilerWriter字符文件输出流

   BufferedReader缓冲字符输入流                                             BufferedWriter缓冲字符输出流

                 

  2、InputStream类:程序可以从中连续读取字节的对象叫输入流,在java中,用InputStream类来描述所有输入流的抽象概念。

   (1)、主要方法:

      int read() 从输入流中读取数据的下一个字节。流结束时返回-1,如果没有结束,又没有数据可读,则会阻塞。

      int read(byte[]b)   从输入流中读取一定数量的字节,并将其存储在缓冲区数组b 中。

     int read( byte[]b,int off,int len)将输入流中最多 len 个数据字节读入 byte 数组。

     long skip(long n) 跳过和丢弃此输入流中数据的 n 个字节,返回读取到的字节数。

     int available()   返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。下一个调用可能是同一个线程,也可能是另一个线程。一次读取或跳过此估计数个字节不会受阻塞,但读取或跳过的字节数可能小于该数。 

   void mark(int readlimit)在此输入流中标记当前的位置。

   void reset()将此流重新定位到最后一次对此输入流调用 mark 方法时的位置。

  3.OutputStream类:程序可以向其中连续写入字节的对象叫输出流,在java中,用OutputStream类来描述所有输出流的抽象概念。

   常用方法:

    void write(int b);将指定的字节写入此输出流。

   void write (byte []b);将 b.length 个字节从指定的 byte 数组写入此输出流。

   write(byte[] b, int off, int len)将指定 byte 数组中从偏移量off 开始的len 个字节写入此输出流。write(b, off, len) 的常规协定是:将数组b 中的某些字节按顺序写入输出流;元素b[off] 是此操作写入的第一个字节,b[off+len-1] 是此操作写入的最后一个字节。

void flush();刷新此输出流并强制写出所有缓冲的输出字节。

  4.FileInputStream 与FileOutputStream 文件输入与输出 流

   (1)、构造方法

    FileInputStream fs=new FileInputStream(String filename);

   FileInputStream fs=new FileInputStream(File file);//传入File对象

    FileOutputStream fos=new FileOutputStream(filename);//传入文件名

    FileOutputStream fos=new FileOutputStream(file)//传入一个File对象

   注意:创建FileOutputStream实例对象时,可以指定还在存在的文件,不能指定一个已被其它程序打开了的文件

 5、Reader与Writer类

   Reader与Writer类是所有字符流类的抽象基类,用于简化对字符串的输入输出编程。即用于读写文本数据

  6、PipedInputStream 和PipedOutputStream管道流类

       这两个类主要用于线程间的通信。

 7、StringReader和StringWriter类 可以直接操作字符串

  

(二)、  过滤流

     用于对流中的数据进行处理,这样的流称为处理流。过渡流就是一种处理流,它像管道中的过渡器,从上游接收数据,经过过滤处理,然后送往下游。过滤流提供了很多增强功能,实现了多样化的数据加密和解密、压缩数据和解压数据。

  1、BufferedInputStream和BufferedOutputStream 缓冲输入流和缓冲输出流,它采用一个内部缓冲区数组来缓存数据,从而提高磁盘的读写速度。

      缓冲流进入输入

     FileInputStream fis=new FileInputStream("filename");//定义一个文件输入流

     BufferedInputStream bis=new BufferedInputStream(fis);//将文件流转换为缓冲流

 

   2、BufferedReader 和BufferedWriter

    BufferedReader :从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

   readLine()   可以一次读取一行文本

    BufferedWriter:  将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

    newLine()    写入一个行分隔符。

     write(String s, int off, int len) 写入字符串的某一部分。

  3、PrintStream 提供了一系列的print和println方法可以将基本数据类型的数据格式化成字符串输出

 (三)、java中的对象序列化

     1、序列化概述:对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存起来,需要时再将对象恢复,对象的这种能记录自己状态以便将来再生的能力,称为对象的持久化(Persistence),而对象通过写出描述自己状态的属性值来记录自己,这个过程称为对象的序列化。就是把对象的属性值保存到硬盘文件上。需要时再从硬盘文件中读取出来 (反序列化)。

    2、在java中, 一个对象要想能够被序列化,那么该对象的类必须实现Serializable接口。

   3、Serializable:通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。

  4 、对象序列化的实现

    ObjectInputStream 和ObjectOutputStream 流用于支持对象序列化的实现。

 5 、下面是一个对象序列化和反序列化的例子

  

package itcast.ioStu;

import java.io.Serializable;
//定义一个学生类,让它实现序列化接口
public class Student implements Serializable {

 private int id;
 private String name;
 private int age ;
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 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 Student(int id,String name,int age){
  this.id=id;
  this.name=name;
  this.age=age;
 }
}


 

package itcast.ioStu;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

//序列化学生类
public class SerializeStudent {

	public static void main(String[] args) {
		Student stu=new Student(1, "Serialize", 12);
		File file=new File("stu.txt");
		Student result=null;
		Serialize(stu, file);
		try {
			result=deserialize(stu, file);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(result.getName());
		

	}
	//将一个Student对象保存到文件中去
	public static void Serialize(Student stu,File file)
	{
		ObjectOutputStream out=null;
		try {
			out=new ObjectOutputStream(new FileOutputStream(file));
			out.writeObject(stu);//将对象保存到文件中
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally
		{
			try {
				out.close();//关闭对象输出流
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	public static Student deserialize(Student stu,File file) throws ClassNotFoundException
	{
		ObjectInputStream in=null;
		Student result=null;
		try {
			in=new ObjectInputStream(new FileInputStream(file));
			result=(Student)in.readObject();//将对象从文件中读取出来
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally
		{
			try {
				in.close();//关闭对象输入流
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return result;
		
	}

}


6、对象序列化注意事项

   (1)、要序列化的类必须是public 类型的

   (2)、序列化不能保存类变量、也不能保存成员方法各构造方法

    (3)、序列化保存的是对象的状态,即非静态属性的值。

7、transient关键字

    被transient修饰的属性将不被序列化。所以对于不需要或不应该保存的属性应加上transient修饰符。


 类似资料: