JAVA文件和安全性

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对象。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值