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

来源:互联网 发布:股票 知乎 编辑:程序博客网 时间:2024/06/06 10:01

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();//多级目录创建elsefile.delete();//是否是一个目录  如果是目录返回true,如果不是目录or目录不存在返回的是falseSystem.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 blocke.printStackTrace();}else file2.delete();         //常用的File对象的APISystem.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)//一次性都读出来</span>raf.write(int)--->只写一个字节(后8位),可写如byte[]数组,同时指针指向下一个位置,准备再次写入 int b = raf.read()--->读一个字节(4)读方法//一次性读取,把文件中的内容都读到字节数组中byte[] buf = new byte[(int)raf.length()]; raf.read(buf)//一次性都读出来(5)文件读写完成以后一定要关闭(Oracle官方说明</span>序列化与基本类型序列化1)将类型int 转换成4byte或将其他数据类型转换成byte的过程叫序列化     数据---->n byte2)反序列化    将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)---readObject3)序列化接口(Serializable)   对象必须实现序列化接口 ,才能进行序列化,否则将出现异常   这个接口,没有任何方法,只是一个标准<pre name="code" class="java">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<Character,Integer> map = new HashMap<Character,Integer>();        for (int i=1;i<str.length() ;i++){        Character c = str.charAt(i);        Integer num = map.get(c);        if(num == null)        num = 1;        else        num = num + 1;        map.put(c,num);        }        Set<Entry<Character, Integer>> 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();








0 0