JAVA学习笔记(五)-文件和安全性

来源:互联网 发布:win10与ubuntu共存 编辑:程序博客网 时间:2024/05/18 00:59
9.1 Java.io概述

1. 数据流是一个连续的字节块。从概念上讲,流的一端可以和数据源或数据接收其相连,另一端可    以认为与java.io包中的类相连。
 
2. 同数据源相连的流用来从源中读取数据,同这种流相连的java.I/O类能从流中读取字节,流能从   数据源中补充字节,这种流称为输入流
 
3. 同数据接收器相连的流用来向接收器中写数据,同这种流相连的java.I/O类能向流中插入字节,   流将字节送到数据接收器。
     
 
4. 字节级输入/出类结构层次:
     InputStream                        OutputStream
           FileInputStream                        FileOutputSteam
           FilterInputStream                                FilterOutputStream
                BufferedInputStream                              BufferedOutputStream
                DataInputStream                                  DataOutputStream
 
 
 5. 字符级输入/出类结构层次:
      Reader                                         Writer
           BufferedReader                                  BufferedWirter
                LineNumberReader                          PrinterWriter
           InputStreamReader                              OutputStreamWriter
                FileReader                                    FileWriter
 
6. 对象级输入/出类结构层次:
       InputStream                                 OutputStream
            ObjectInputStream                             ObjectOutputStream
 
9.2 保存和读取字节级数据:

1.DataOutputStream向输出流中写一个Java的基本数据类型,所写的数据的方式是可移植的,即   与具体操作系统无关。

2.FileOutputStream类将输出流与一个文件连接,从而为写数据到文件中做准备。

3.如果用一个已存在的文件名创建一个FileOutputStream对象,则这个文件将在无任何警告的情   况下被一个新的空文件所取代。我们可以实用File或FileDialog类提供的方法来确保不会发生   偶然删除重要文件的失误。
 
4.使用DataOutputStream类与FileOutputStream类向文件写数据的方法:
     
5.DataInputStream类以与机器无关的方式从一个输入流中读Java的基本数据类型。任何一个方    法读取数据时超过流的尾部,将产生一个EOFException异常。
 
6.FileInputStream类从以存在的文件中读取字节,并返回一个与文件相连的输入流。

7.使用DataInputStream类与FileOutputStream类从文件读取数据的方法:
       
 
8.BufferedOutputStream类增强了批量数据输出的到另一个输出流的功能,数据首先写到一个内   部缓冲区中,只有缓冲区写满之后才一次性写入流中,当关闭流时,如果缓冲未满,就强迫将数    据压入输入流中,所有关于输出流操作的方法都是自动进行缓冲的。

9.使用DataOutputStream类与FileOutputStream类与BufferedOutputStream类向文件写数   据的方法:
  
10.File类用来代表一个文件,一个目录名或一个目录名和文件名的组合。所用到的文件名使用高     度系统相关的。

11.相关API:
     getName():  获取文件名            getPath():获取路径          
     exists(): 判断指定文件是否存在   isDirectory():判断是否路径    
     isFile(): 判断是否文件          listFiles():返回指定目录下的文件对象数组

12.可以使用System..getProperty(“user.dir”)来确保如果用户没有提供目录,则使用当前的    目录。

13.按特定的方法排序方法如下:
    1). 创建一个类实现接Comparator, 在类中实现该接口中的抽象方法compare (Object       o1, Object o2)

    2). 在主程序中调用Arrays类的Sort (Object a [ ], Comparator  c)方法,对数组a     中的对象按接口中的方法进行排序。
 
9.3 保存和读取字符数据:
1.    BufferedReader类从字符输入流中读取文本,在必要时将字符存入缓存。只要文字中含有换     行符、回车符或是回车换行,则认为是一行文本结束,如果在流中没有这些符号,则readLine    方法返回null而并不抛出一个异常。

2.    FileReader类可以非常方便地将一个文件连接到其他需要以Reader作为输入参数的类上。

3.    使用BufferedReader类与FileReader类,向文件写数据的方法:

4.    FileDialog类中有标准的“文件|打开”,“文件|保存”对话框,可以通过他们选择文件来读或     写,该对话框是模态对话框,一旦通过setVisible或show打开后,只有通过选择一个文件或     取消才能使她消失。该对话框含有确定和取消按钮,如果用户选择了取消,则getFile()方法     将返回null,如果该对话框的创建模式为SAVE,则在覆盖一个已有文件之前必须经过用户的确     认。

5.    相关API:
    getDirectory(): 获取文件的路径        getFile(): 获取文件名
6.    BufferedWriter类用来创建一个字符缓冲输出流,它主要为其他类通过一个字符输入流。
7.    PrintWriter类为格式化字符流提供了一些实用方法,该类的方法没有抛出任何异常,而是使     用checkError来检查则调用该方法之前是否出现了错误。
8.    FileWriter类把字符输出流与文件连接起来,FileWriter会毫无提示的删除一个已存在的文    件,所以通过File类或FileDialog类提供的方法,确保不会意外地删除用户的重要文件。
9.使用PrintWriter类,BufferedWirter类,FileWriter类向文件写数据的方法:
   
 
9.3 保存和读取对象数据
1.    LinkedList类:可以被当成堆栈、队列、双向队列使用
2.    常用API:
    add(int index,Object element):向列表中添加对象
    get(int index):返回指定位置的对象
    contains(Object o):判断LinkedList中是否含有指定的对象
    index(Object o):返回对象的下标
    set(int index,Object o):用指定对象代替指定位置上的原对象 
    remove(int index):移除指定位置对象
3. Iterator接口通过提高顺序访问列表元素的方法简化类Java标准的列表结构所有的顺序处理的    过程。
4.    Java API定义类Iterator如下:
    boolean hasNext(): 判断当前指针是否已指向列表的末尾。
    Object next():返回当前的对象,并使一个内部指针指向列表中的下一个元素。
5.    Iterator对象可以通过Iterator方法来创建,Iterator方法是List接口中的方法,因而它     是所有的标准Java列表结构的一部分。Iterator允许通过一个快速简单的for循环连续处理      一个表中的元素。
    for (Iterator iterator=List.iterator ();iterator.hasNext();)
                System.out.println (iterator.next ());
6.    ObjectOutputStream类用来将原始的数据类型和整个对象写入到流中。为了向                ObjectOutputStream中写入对象,该对象所属的类必须是实现了java.io.Serializable     接口,写一个对象的默认机制是写它的原始类、类的特征、类中非瞬态(non-transient)即非    静态的成员变量。一个类实现Serializable接口的目的是使该类的对象可以写入到            ObjectOutputStream流中,并且可以通过ObjectOutputStream流读取这些对象。

7.    ObjectInputStream类被用来读取原来用ObjectOutputStream写入到流中的原始数据类型     和整个对象,同时还要使用Java的类型转换机制来恢复对象的类型。

8.    序列化使用非常方便,然而也引入了一个安全问题,因为存储则磁盘中的的数据与对象独立,无    法保护数据不被修改,该数据被重新读取的时候就会产生无效的时间。而且私有数据则对象中是    受保护的,不能在外部处理它,而一旦写入磁盘就可能暴露于外部操作之下。

9.    如果对象和安全性很重要,可以不使用默认的序列化对象方法,而是通过覆盖原有符来自定义序    列化。
    public void readObject (ObjectInputStream in) throws IOException,ClassNotFoundException
        {/*自定义读取对象的方法*/}
    public void writeObject (ObjectOutputStream out) throws IOException
        {/*自定义写对象的方法*/}
    public void writeObject (ObjectOutputStream out) throws IOException
        {throw NoAccessException}
 
9.4 Applet的文件操作和与安全性    
1.    在一个Java类执行前,JVM必须对其进行安全性检查和违例检查。甚至在运行过程中,每个       Java类还要受到安全管理器的控制,使它只能访问它有权访问的资源。如果它试图访问它无权     访问的资源,安全管理器将拒绝该请求,并抛出一个SecurityException异常。

2.    自定义的安全管理器则Web浏览器中不能使用,在Web浏览器中使用Applet必须服从Web浏览器    的安全限制。
3.    Applet在“沙盒”中执行,也就是说,Applet可以在计算机中预先划定的区域执行,而且不允     许超越该范围。安全管理器对其进行监督,如果Applet试图访问“沙盒”以外的资源,安全管理    器将拒绝访问并抛出异常。对Applet的安全限制有:
    1). Applet不能直接读写文件
    2). Applet只能通过它所在的主机才能进行网络连接
    3). Applet不能执行它所在主机的本地程序 (即用其他语言编写的程序)
    4). Applet不能读取和修改系统的属性。
    5). Applet执行时出现窗口,该窗口看起来与标准窗口不同
    6). Applet不能定义本地方法 (即用其他英语编写的方法)。
 
4.    只要文件被明确地声明为“公有文件”,Applet就能从该文件读取数据,所谓“公有文件”是位于        Web服务器公有地可读文件夹内的文件。

5.在Applet中读取文件的方法:
    1). 数据文件和Applet必须在物理位置上位于同一台机器上。
    2). 数据文件和Applet要么在本地机器上,要么在Web服务器的公共区域
    3). 必须使用URL类连接到数据文件,而不能使用FileInputStream。
    4). 该方法仅适用与输入流,不适用与输出流。
6.InputStreamReader类是字节流到字符流的桥梁,它读入字节并把他们转换为字符,它使用该        平台的默认编码,也可指定另外的编码。
7.与FileReader一样,InputStreamReader可连接一个BufferedReader,能取得更好的效率
  

9.5 系统I/O流
1.    System类保护类3个静态成员变量,他们描述类3个通用的流。这些流随时都是打开的,并准备        传送和接受数据。

2.    System.out:PrintStream类型     System.in: InputStream类型                        System.err:PrintStream类型

3.    setOut(PrintStream out):重新指定System.out为输出流out
    setIn(InputStream in):  重新指定System..in为输入流 in
    setErr(PrintStream out):重新指定System..err为输出流out

4.    重定向System..out或System.err对那些需要打印出状态和调试信息的程序很有用。
 
9.6 RandomAccessFile
1.    RandomAccessFile类的实例能支持同时读写文件。
2.    对该类的所有读操作,如还没有读完指定的字节数,但文件指针已执行了文件末尾,将会抛出一    个OFException异常,如果是由于其他原因不能读,就会抛出一个IOException而不是         EOFExeption;
    特别是如果文件关闭后再进行读写操作,也会抛出一个IOException。
3.    使用RandomAccessFile除了可以读写文件中任意位置的字节外,还可以读写文本和Java的基    本数据类型。
4.    常用API:
    randomAccessFile(String filename,String mode):mode为操作方式,说明该文件是”r”,或”rw”方式
    randomAccessFile(File file,String mode):file为指定的文件对象
    read():从文件中读取数据        
    read(Byte[] b):从当前指针位置开始读取数据到数组直至满为止
    readLine():读取当前文件的下一行文本    
    seek():设置当前文件指针

9.7 其他
1.    装载并显示图像的步骤:
    1).获取图像文件的路径,文件名:
        URL url=new URL (URL context, String filename) //context可以通过getCodeBase()获得
    2).通过默认的Toolkit获取图像文件:
        image=Toolkit.getDefaultToolkit (). getImage (url)
    3).将图片添加到MediaTracker类的对象中并加载:
        MediaTracker tracker=new MediaTracker (this);
        Tracker.addImage(image,0);        //将图片添加到tracker中,并且设置优先级为0(最高)
        Tracker.waitForAll();                //挂起任何操作,直到所有图像被完全载入
    4).调用画图方法画图:
        repaint ()
 
2.    由于加载图片时可能会触发异常,故需要捕捉
3.    通过getImage(URL url)获取的图片格式只能是GIF,JPEA,PNG之一。
4.    Inset类的对象用来指定一个容器的边框格式,即容器与边框的距离空间,该空间可以是边框,        空白区,标题。其构造方法为new Inset(int top,int left,int bottom,int right)
5.    getInset()方法规定了在由一个布局管理器布局时,组建可以接受多少填充内容。
6.    带标题的三维边框画法:
    w=getFontMetrics(font).stringWidth(title);    //返回用指定的字体显示的字符串度
    h=getFontMetrics(font).getMaxAscent()+1;    //返回用指定字体显示的字体高度
    d=h/2;                                //用于指定画图起点或边框的间距
    bgColor=Color.white;                    //用于指定图片的背景
    font=new Font(“Helvetica”,Font.BOLD,12);//用于指定显示的字体
    public void paint (Graphics g){
      g.setColor(Color.gray);
      g.drawRect(d,d,getSize().width-2*d,getSize().height-2*d);    //用于画出组件的边框
 
      g.setColor(Color.black);
      g.drawLine (getSize ().width-d+1,d 
      getSize().width-d+1,getSize().height-d+1);    //用于画出组件的三维边框(竖)
      g.drawLine (d, getSize().height-d+1
      getSize().width-d+1,getSize().height-d+1);    //用于画出组件的三维边框(横)
 
        g.setFont(font);
        g.setColor(bgColor);
        g.fillRect((int)(1.5*h)-5,0,w+10,h+2);        //用于画出标题所在的边框
         g.setColor(Color.black);
        g.drawString(title,(int)(1.5*h),h-2);        //用于在边框中显示标题
}
 
    7.常用的画图API:
    1). drawLine (int x1, int y1, int x2, int y2) :
        在点(x1,y1)和点(x2,y2)之间画一条直线
    2).drawRect(int x, int y, int width, int height):
        以点(x,y)为原点画一个宽为width,高为height的矩形
    3). drawRoundRect (int x, int y, int width, int height, int arcWidth,         int arcHeight) :
        从点(x,y)开始画一个宽为width,高为height,四角的水平、垂直弧度直径为arcWidth,arcHeight矩形
    3). draw3Drect (int x, int y, int width, int height, boolean raised) :
        以点(x,y)为原点画一个宽为width,高为height的3D矩形,raised决定了矩形是否为突起或凹陷
    4). drawString (String str, int x, int y) :
        从点(x,y)处开始写字符串
    5). drawImage (Image img, int x, int y, ImageObserver observer) :
        在点(x,y)处开始尽可能的画图,并将信息及时返回给相应的ImageObserver对象。
原创粉丝点击