zoukankan      html  css  js  c++  java
  • java的 IO操作基础及类加载器

    java的 IO操作基础及类加载器 - jayronlou - 博客频道 - CSDN.NET

    java的 IO操作基础及类加载器


    分类:
    黑马自学日记


    69人阅读
    评论(0)
    收藏
    举报

     

    一、File

    java.io包下代表与平台无关的文件和目录,不管是文件还是目录都是使用File来操作的,但File不能访问文件内容本身,如要访问,需要用到IO流。File类的一些操作文件和目录的常用方法:

    String getName():返回File对象的文件名或路径名;

    String getPath():返回此File对象所对象的路径名;

    String getAbsolutePath():返回File对象的绝对路径名;

    boolean renameTo(File newName):重命名是否成功;

    boolean exists():文件或目录是否存在;

    boolean isFile()File对象是否是文件;

    boolean isDirectory()File对象是否是目录;

    boolean createNewFile():如果File对象所指文件不存在,则创建一个File所指的文件;

    String[] list():列出File对象(路径)的所有子文件名和路径名;

    File[] listFiles:列出File对象(路径)的所有子文件和路径。

    JavaWindows下运行,File对象操作的路径名需用两个反斜杠,一个是java转义字符,一个是路径分隔符。

    二、输入输出流

    1IO流的四个抽象基类

    InputStreamReader:所有输入流的基类,前者表字节输入流,后者为字符流;

    OutputStreamWriter:输出流的基类,前者为字节输出流,后者为字符输出流;

    字节流操作的最小数据单元为8位的字节,字符流操作的最小单元为占16位的字符;

    2、输入流的方法(以字节流为例,字符流操作的是字符文本,只需把参数类型改为char即可):

    int read():读取单个字节;

    int read(byte[] b):从输入流中读取最多b.length个字节,并存储在字节数组b中,返回读取的字节数;

    int read(byte[] b,int off,int len):从输入流中读取最多len个字节的数据,数组的off位置开始存储在数组b中,返回读取的字节数。

    3、输出流的方法:void write(···),原理同输入流相差不大,只是是将字节或字符或字符串输出到输出流总,OutputStream类可操作的是字节和字符,Writer类操作的是字符串。

    4IO流还分节点流和处理流

    节点流是与底层的I/O设备和文件交互,

    处理流用来包装节点流,一般该流构造器里参数是一个已存在的流。

    5、四个基类的前面分别添上Buffered,就成了缓冲流,缓冲流可以提高输入输出的效率,因为缓冲流是将数据存入到缓冲区中,所以一定要flush()才可以写入目的。BufferedReader中有一个读一行的方法,即readLine(),需注意此方法返回的时候只返回回车符之前的数据内容,并不返回回车符,所以在对应输出流写数据的时候还需要newLine()一下。

    一段典型的使用到缓冲区和读写操作的简单代码:

    1. import java.io.*;
    2. public
      class CopyPic2 {
    3. public static void main(String[] args)throws IOException{
    4. BufferedInputStream bis =
      new
      BufferedInputStream(new FileInputStream("f:\\1.jpg"));
    5. BufferedOutputStream bos =
      new
      BufferedOutputStream(new FileOutputStream("g:\\2.jpg"));
    6. byte[] buf =new byte[1024];
    7. int len =0;
    8. while((len=bis.read(buf))!=-1){
    9. bos.write(buf,
      0
      , len);
    10. }
    11. bis.close();
    12. bos.close();
    13. }
    14. }
    1. import java.io.*;  
    2. public class CopyPic2 {  
    3.     public static void main(String[] args) throws IOException{  
    4.         BufferedInputStream bis = new BufferedInputStream(new FileInputStream("f:\\1.jpg"));  
    5.         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("g:\\2.jpg"));  
    6.         byte[] buf = new byte[1024];  
    7.         int len = 0;  
    8.         while((len=bis.read(buf))!=-1){  
    9.             bos.write(buf, 0, len);  
    10.         }  
    11.         bis.close();  
    12.         bos.close();  
    13.     }  
    14. }  

    6、打印流:PrintStreamPrintWriter,输出功能更强大

    7、转换流,将字节流转换成字符流,一般用于键盘输入相关

    分别是InputStreamReaderOutputStreamWriter

    8、标准输入/输出,System.in
    System.out,三个重定向方法:

    Static void setErr(PrintStream err):重定向标准错误输出流;

    Static void setIn(InputStream in):重定向输入流;

    Static void setOut(PrintStream out):重定向标准输出流。

    9、RandomAccessFile:功能强大的文件内容访问类,能随机读写

    因为可以自由定位文件记录指针,所以可以不像其它流一样从头读到尾,它其实是在内部封装了一个byte数组,通过指针对该数组进行操作,该类操作指针的方法:

    long getFilePoint():返回文件记录指针的当前位置;

    void seek(long pos):将文件记录指针定位到pos位置。

    创建RandomAccessFile对象时需指定一个mode参数,设置对文件操作的权限。

    10、管道流,使用管道流类,可以实现各个程序模块之间的松耦合通信。

    1PipedInputStreamPipedOutputStream用于在应用程序中创建管道通信。

    一个PipedInputStream实例对象必须和一个PipedOutputStream实例对象进行连接来产生一个通信管道。主要用来完成线程之间的通信。

    2PipedReaderPipedWriter用来创建字符文本的管道通信。

    11、对象流

    为了将某类对象(object)转换成字节序列(二进制流),保存到磁盘上,可将对象序列化,则该对象的类设计时需要实现Serializable接口,此接口是一个标记接口,所以不用实现任何方法,将对象序列化用ObjectOutputStreamwriteObject()方法,格式为:

    输出流对象.writeObject(需被序列化的对象)

    如果要从二进制流中恢复成原来的对象,则使用反序列化,用ObjectInputStream中的readObject()方法,格式:

    //创建一个ObjectInputStream对象

    ObjectInputStream ois = new ObjectInputStream(new FileInputStream(""object.txt"));

    //从输入流中读取对象,强制转换成原来的类

    类 实例 =
    (类)ois.readObject();

    12、凡是设计到操作系统资源的,用了之后都要关资源,

    13、其它流对象

    DataInputStreamDataOutputStream:用于操作基本数据类型的数据的流;

    ByteArrayInputStreamByteArrayOutputStream:操作字节数组的流;

    CharArrayReaderCharArrayWriter:操作字符数组的流

    StringReaderStringWriter:访问字符串的流

    三、编码表

    1、编码:字符串——>字节,getBytes()

    解码:字节——>字符串,new String(byte[], .......)

    2、获得JDK所支持的全部字符集的方法

    SortedMap<String,Charset> map = Charset.availableCharsets();

    打印map集合

    3、常用编码表

    GBK——简体中文,两个字节

    BIG5——繁体中文,两个字节

    UTF-8——3个字节

    4、Tomcat服务器用的是ISO8859-1编码

    5、Java采用的是unicode编码

      

    一、类加载器

    1、java语言默认有三个加载器,Bootstrapjava程序的第一个加载器,即根加载器,它不是java类,主要加载jdkjre/lib/rt.jar这个目录。ExtClassLoader扩展类加载器,AppClassLoader加载classpath路径下的类。

    2、委托机制:每个类加载器加载时,先委托给其上级类加载器去加载。

    3、自定义加载器继承ClassLoader类,覆盖findClass()方法

    4、有包名的类不能调用无包名的类

    5、打印所有类加载器的一小段代码示例:

    ClassLoader loader = this.getClass().getClassLoader();

    While(loader!=null){

    System.out.println(loader.getClass().getName()+"\n");

    loader.getParent();

    }

    二、代理技术

    1、代理:为目标类设计一个代理类,实现相同接口,每个方法内添加功能,以前功能用反射调用作用于对象。

    2、AOP:面向切面的编程,多处理交叉业务的编程问题,如安全、事务与日志等功能设计。

    3、JVM生成的动态类必须实现一个或多个接口。如果一个目标类本身没有继承接口,则可以用CGLIB库动态生成一个类的子类。

    4、动态代理类只有一个构造方法,需要传递一个参数:java.lang.reflect.InvacationHandler

    5、代码示例:

    //创建代理类实例的大概写法

    1. import java.lang.reflect.*;
    2. import java.util.*;
    3.  
    4. public
      class ProxyExample {
    5. @SuppressWarnings("unchecked")
    6. public
      static void main(String[] args)
      throws Exception{
    7. //使用反射获得代理类的一个实例对象的字节码
    8. Class clazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
    9. //得到动态代理类的构造器,需要传递一个InvocationHandler的参数
    10. Constructor constructor = clazzProxy1.getConstructor(InvocationHandler.class);
    11. //创建一个目标类的实例对象
    12. Collection proxy = (Collection) constructor.newInstance(new InvocationHandler(){
    13. //内部类里面建一个目标对象,
    14. ArrayList alist =
      new
      ArrayList();
    15. @Override
    16. public Object invoke(Object proxy, Method method, Object[] args)
    17. throws Throwable {
    18. //目标类实例调用具体方法时到调用了这里的invoke()
    19. Object retVal = method.invoke(alist,args);
    20. return retVal;
    21. }
    22. });
    23. proxy.add("传智播客");
    24. proxy.add("黑马程序员");
    25. proxy.add("梦想起航");
    26. System.out.println(proxy);
    27. System.out.println(proxy.size());
    28. }
    29. }
  • 相关阅读:
    java基础知识回顾之javaIO类---InputStreamReader和OutputStreamWriter转化流
    java基础知识回顾之javaIO类---FileInputStream和FileOutputStream字节流复制图片
    基本知识《一》继承初始化过程
    java调用matlab函数
    Dubbo基础篇-zookeeper安装(单点)
    《转》从0到100——知乎架构变迁史
    算法
    【转】基于LDA的Topic Model变形
    《转》探寻微博背后的大数据原理:微博推荐算法简述
    一个完整推荐系统的设计实现-以百度关键词搜索推荐为例
  • 原文地址:https://www.cnblogs.com/lexus/p/2370501.html
Copyright © 2011-2022 走看看