File,RandomAccessFile,字符流,字节流,对象序列化---7,8

File,RandomAccessFile,字节流,字符流,序列化---7

一.File:对文件和目录路径名的抽象表示形式;

ava.io.File类用于表示文件(目录)
完成 文件和路径的创建,删除。
// 了解构造函数的情况  查帮助
		File file = new File("e:\\javaio\\imooc");
		//System.out.println(file.exists());
		if(!file.exists())
			file.mkdir(); //单级目录创建
		//file.mkdirs();//多级目录创建
		else	file.delete();
		//是否是一个目录  如果是目录返回true,如果不是目录or目录不存在返回的是false
		System.out.println(file.isDirectory());
		//是否是一个文件
		System.out.println(file.isFile());
		
		//File file2 = new File("e:\\javaio\\日记1.txt");
		File file2 = new File("e:\\javaio","日记1.txt");
		if(!file2.exists())
			try {
				file2.createNewFile();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		else 
			file2.delete();
         //常用的File对象的API
		System.out.println(file);//file.toString()的内容
		System.out.println(file.getAbsolutePath());
		System.out.println(file.getName());//返回文件夹
		System.out.println(file2.getName());//返回文件名
		System.out.println(file.getParent());//返回父目录
		System.out.println(file2.getParent());//返回父目录
		System.out.println(file2.getParentFile().getAbsolutePath());
File files=dir.listFiles() ;//返回file数组,包含所有文件和目录
for(File file;files){//使用foreach遍历file文件
}

二.RandomAccessFile文件内容的读写

java.io.File类用于表示文件(目录)
File类只用于表示文件(目录)的信息(名称、大小等),不能用于文件内容的访问

RandomAccessFile java提供的对文件内容的访问,既可以读文件,也可以写文件。
RandomAccessFile支持随机访问文件,可以访问文件的任意位置

(1)java文件模型
  在硬盘上的文件是byte byte byte存储的,是数据的集合
(2)打开文件
  有两种模式"rw"(读写)  "r"(只读)
  RandomAccessFile raf = new RandomeAccessFile(file,"rw")
  raf.getFilePointer();// 文件指针,打开文件时指针在开头 pointer = 0;
(3) 写方法byte[] buf = new byte[(int)raf.length()]; raf.write(buf)//一次性都读出来
raf.write(int)--->只写一个字节(后8位),可写如byte[]数组,同时指针指向下一个位置,准备再次写入	 int b = raf.read()--->读一个字节
(4)读方法
//一次性读取,把文件中的内容都读到字节数组中
byte[] buf = new byte[(int)raf.length()]; raf.read(buf)//一次性都读出来
(5)文件读写完成以后一定要关闭(Oracle官方说明
序列化与基本类型序列化
1)将类型int 转换成4byte或将其他数据类型转换成byte的过程叫序列化
     数据---->n byte
2)反序列化
    将n个byte 转换成一个数据的过程
    nbyte ---> 数据
3)RandomAccessFile提供基本类型的读写方法,可以将基本类型数据
   序列化到文件或者将文件内容反序列化为数据
 IO流(输入流、输出流)
 字节流、字符流
 1.字节流
 1)InputStream、OutputStream
    InputStream抽象了应用程序读取数据的方式
    OutputStream抽象了应用程序写出数据的方式 
 2)EOF = End   读到-1就读到结尾
 3)输入流基本方法
   int  b = in.read();读取一个字节无符号填充到int低八位.-1是 EOF
   in.read(byte[] buf) 
   in.read(byte[] buf,int start,int size)
4)输出流基本方法
  out.write(int b)  写出一个byte到流,b的低8位
  out.write(byte[] buf)将buf字节数组都写入到流
  out.write(byte[] buf,int start,int size)
  
 5)FileInputStream--->具体实现了在文件上读取数据
 6)FileOutputStream 实现了向文件中写出byte数据的方法
 7)DataOutputStream/DataInputStream
    对"流"功能的扩展,可以更加方面的读取int,long,字符等类型数据
   DataOutputStream
        writeInt()/writeDouble()/writeUTF()

 8)BufferedInputStream&BufferedOutputStream
 这两个流类位IO提供了带缓冲区的操作,一般打开文件进行写入
 或读取操作时,都会加上缓冲,这种流模式提高了IO的性能
 从应用程序中把输入放入文件,相当于将一缸水倒入到另一个缸中:
 FileOutputStream--->write()方法相当于一滴一滴地把水“转移”过去
 DataOutputStream-->writeXxx()方法会方便一些,相当于一瓢一瓢把水“转移”过去
 BufferedOutputStream--->write方法更方便,相当于一飘一瓢先放入桶中,再从桶中倒入到另一个缸中,性能提高了
   
   
 2.字符流
 1) 编码问题
 2)认识文本和文本文件
 java的文本(char)是16位无符号整数,是字符的unicode编码(双字节编码)
 文件是byte byte byte ...的数据序列
文本文件是文本(char)序列按照某种编码方案(utf-8,utf-16be,gbk)序列化为byte的存储结果
3)字符流(Reader Writer)---->操作的是文本文本文件
字符的处理,一次处理一个字符
字符的底层任然是基本的字节序列
字符流的基本实现
   InputStreamReader   完成byte流解析为char流,按照编码解析
   OutputStreamWriter  提供char流到byte流,按照编码处理  
   
   FileReader/FileWriter
 字符流的过滤器
   BufferedReader   ---->readLine 一次读一行
   BufferedWriter/PrintWriter   ---->写一行    
   
   
3.对象的序列化,反序列化
1)对象序列化,就是将Object转换成byte序列,反之叫对象的反序列化 
2)序列化流(ObjectOutputStream),是过滤流----writeObject
   反序列化流(ObjectInputStream)---readObject

3)序列化接口(Serializable)
   对象必须实现序列化接口 ,才能进行序列化,否则将出现异常
   这个接口,没有任何方法,只是一个标准
4) transient关键字 -----使是元素不能序列化,而进行手动序列化,增加效率(好处是如一些数组元素可以经有效的进行序列化,无效的不序列化)
private void writeObject(java.io.ObjectOutputStream s)//手动序列化 throws java.io.IOException//手动序列化
private void writeObject(java.io.ObjectOutputStream s)
       throws java.io.IOException{
s.defaultWriteObject();//把jvm能默认序列化的元素进行序列化操作
s.writeInt(stuage);//自己完成stuage的序列化
}
//反序列化
private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException//手动反序列化
private void readObject(java.io.ObjectInputStream s)
       throws java.io.IOException, ClassNotFoundException{
 s.defaultReadObject();//把jvm能默认反序列化的元素进行反序列化操作
 this.stuage = s.readInt();//自己完成stuage的反序列化操作
} 分析ArrayList源码中序列化和反序列化的问题 5)序列化中 子类和父类构造函数的调用问题


 
    
 
    
 
    

三:文件拷贝,字节批量读取,帯Buffer,BufferInputStream

	/**
	 * 文件拷贝,字节批量读取,帯Buffer
	 * 
	 * @param srcFile
	 * @param destFile
	 * @throws IOException
	 */
	public static void copyFileBuffer(File srcFile, File destFile) throws IOException {
		if (!srcFile.exists()) {
			throw new IllegalArgumentException("文件:" + srcFile + "不存在");
		}
		if (!srcFile.isFile()) {
			throw new IllegalArgumentException(srcFile + "不是文件");
		}
		BufferedInputStream bis = new BufferedInputStream(
				new FileInputStream(srcFile));
		BufferedOutputStream bos = new BufferedOutputStream(
				new FileOutputStream(destFile));
		byte[] buf = new byte[8 * 1024];
		int b;
		while ((b = bis.read(buf, 0, buf.length)) != -1) {
			bos.write(buf, 0, b);
			bos.flush();// 刷新缓冲区
		}
		bis.close();
		bos.close();

	}

四:文本文件拷贝,字符读取,(一行读取和写入)——BufferReader,PrintWriter

 
   
public class BrAndBwOrPwDemo {
	public static void main(String[] args) throws IOException{
		 //对文件进行读写操作 
		BufferedReader br = new BufferedReader(
				new InputStreamReader(
						new FileInputStream("e:\\javaio\\imooc.txt")));
		/*BufferedWriter bw = new BufferedWriter(
				new OutputStreamWriter(
						new FileOutputStream("e:\\javaio\\imooc3.txt")));*/
		PrintWriter pw = new PrintWriter("e:\\javaio\\imooc4.txt");
		//PrintWriter pw1 = new PrintWriter(outputStream,boolean autoFlush);
		String line ;
		while((line = br.readLine())!=null){
			System.out.println(line);//一次读一行,并不能识别换行
			/*bw.write(line);
			//单独写出换行操作
			bw.newLine();//换行操作
			bw.flush();*/
			pw.println(line);
			pw.flush();
		}
		br.close();
		//bw.close();
		pw.close();
	}

}

将输入的字符按数量少到多排序

public class Alianxi {  
	public static final String separator = File.separator;
	
    public static void main(String[] args) throws IOException{  
         //对文件进行读写操作   
        BufferedReader br = new BufferedReader(  
                new InputStreamReader(  
                        new FileInputStream("e:\\javaio\\imooc.txt"),"GBK"));  
        PrintWriter pw = new PrintWriter(
        new OutputStreamWriter( 
                new FileOutputStream("e:"+separator+"javaio"+separator+"imooc4.txt"),"UTF-8")); 
        Scanner scanner = new Scanner(System.in);
        String str = scanner.next();
        String line ;  
        
        List list = new ArrayList();
        Map map = new HashMap();
        for (int i=1;i> entrys= map.entrySet();
    	for (Entry entry : entrys)
		{
			list.add(entry.getValue()+":"+entry.getKey());
			Collections.sort(list); 
		}
        while((line = br.readLine())!=null){  
            System.out.println(line);//一次读一行,并不能识别换行  
            pw.println(list);  
            pw.println(map);  
            pw.println(line);  
            pw.flush();  
        }  
        br.close();  
        pw.close();  
    }  
  
}  

五:序列化,反序列化

	String file = "demo/obj.dat";
		//1.对象的序列化
		ObjectOutputStream oos = new ObjectOutputStream(
				new FileOutputStream(file));
		Student stu = new Student("10001", "张三", 20);
		oos.writeObject(stu);
		oos.flush();
		oos.close();
		//2.对象的反序列化
		ObjectInputStream ois = new ObjectInputStream(
				new FileInputStream(file));
		Student stu = (Student)ois.readObject();
		System.out.println(stu);
		ois.close();








你可能感兴趣的:(Java)