1.File类(java.io.File)可表示文件或者目录(在JAVA中文件和目录都属于这个类中,而且区分不是非常的明显)。 File下的方法是对磁盘上的文件进行磁盘操作,但是无法读取文件的内容。 注意:创建一个文件对象和创建一个文件在JAVA中是两个不同的概念。前者是在虚拟机中创建了一个文件,但却并没有将它真正地创建到OS的文件系统中,随着虚拟机的关闭,这个创建的对象也就消失了。而创建一个文件才是在系统中真正地建立一个文件。 例如:File f=new File(“11.txt”);//创建一个名为11.txt的文件对象 f.CreateNewFile(); //真正地创建文件 2.File的方法 Boolean createNewFile() //创建文件 Boolean mkdir() //创建目录 Boolean mkdirs() //创建多个目录 Boolean delete() //删除文件 Boolean deleteOnExit(); //在进程退出的时候删除文件,这样的操作通常用在临时文件的删除。 String[] List():返回当前File对象下所以显文件和目录名(相对路径) File[] ListFiles():返回当前File对象所有Files对象,可以用getName()来访问到文件名。 isDirectory()和isFile()来判断究竟是目录还是文件。 String getParent() 得到父类文件名 File getParentFile() 。。。 String getPath() 。。。路径 exists() 判断文件是否存在 15.2.处理跨平台性 对于命令:File f2=new file(“d:\\abc\\789\\1.txt”) 这个命令不具备跨平台性,因为不同的OS的文件系统的分隔符是不相同。 使用file类的separtor属性,返回当前平台文件分隔符。 File newD = new File("aa"+File.separator+"bb"+File.separator+"cc"); File newF = new File(newD,"mudi.txt"); try{ newD.mkdirs(); newF.createNewFile(); }catch(Exception e){} 3.对象的序列化接口 Serializable接口没有方法,是标识接口。 序列化的步骤: 1)实现Serializable 接口 2)实例化对象文件输出对象 3)将对象输出到文件里 4)有些临时变量生命周期不需要超过虚拟机的生命周期,需要加上:transient 关键字,这个属性不被序列化。 一个序列化对象内部属性的对象也需要序列化接口。 4.I/O流基础 Input/Output:指跨越出了JVM的边界,与外界进行数据交换。 输出 输入 注意:输入/输出是针对JVM而言。 15.5.流的分类 1) 从数据类型分:字节流和字符流 字节流类: 抽象父类: InputStream,OutputStream 实现类: BufferedInputStream 缓冲流-过虑流 BufferedOutputStream ByteArrayInputStream 字节数组流-节点流 ByteArrayOutputStream DataInputStream 处理JAVA标准数据流-过虑流 DataOutputStream FileInputStream 处理文件IO流-节点流 FileOutputStream FilterInputStream 实现过虑流-字节过虑流父类 FilterOutputStream PipedInputStream 管道流 PipedOutputStream PrintStream 包含print() 和 println() RandomAccessFile 支持随机文件 抽象父类:Reader, Writer 实现类: BufferedReader BufferedWriter PrintWriter CharArrayReader CharArrayWriter FileReader FileWriter FilterReader FilterWriter InputStreamReader OutputStreamWriter PipedReader PipedWriter StringReader StringWriter 2) 从数据方向分:输入流和输出流 InputXXXXX , OutputXXXXX 3) 从流的功能分:节点流和过滤流(使用到油漆工模式) 节点流用来传输数据。 过滤流用来封装节点流或者其他过滤流,从而给节点流或其他的过滤流增加一个功能。 . InputStream类 所有字节输入流的父类,如:FileInputStream,ObjectInputStream,PipedInputStrean 1) 三个基本的read()方法 a. int read(): 从流里读出的一个字节或者-1; (实际读了多长) b. int read(byte[]):将数据读入到字节数组中,并返回所读的字节数; (期望读了多长) c. int read(byte[], int , int):两个int参数指定了所要填入的数组的子范围。 2) 其它方法 a. void close(): 关闭流,如使用过滤器流,关闭栈顶部的流,会关闭其余的流。 b. int available(): 返回可从流中读取的字节数。 c. skip(long): 丢弃了流中指定数目的字符。 d. boolean markSupported() e. void mark(int) f. void rese() 2. OutputStream方法 答:1) 三个基本的read()方法 a. void write(): b. void write(byte[]): c. void write(byte[], int , int): 写输出流。 2) 其它方法 a. void close(): 关闭流,如使用过滤器流,关闭栈顶部的流,会关闭其余的流。 b. void flush(): 允许你强制执行写操作。 注:在流中close()方法由程序员控制。因为输入输出流已经超越了JVM的边界,所以有时可能无法回收资源。 原则:凡是跨出虚拟机边界的资源都要求程序员自己关闭,不要指望垃圾回收。 3. FileInputStream和FileOutputStream 答:1) 节点流,使用磁盘文件。 2) 要构造一个FileInputStream, 所关联的文件必须存在而且是可读的。 3) 要构造一个FileOutputStream而输出文件已经存在,则它将被覆盖。 FileInputStream infile = new FileInputStream("myfile.dat"); FIleOutputStream outfile = new FileOutputStream("results.dat"); FileOutputStream outfile = new FileOutputStream(“results.dat”,true); 参数为true时输出为添加,为false时为覆盖。 FileOutputStream类代码:(为什么能建文件) Public FileOutputStream(String name){ This(name!=null?new File(String):null,false); } 键盘流 PrintWriter : System.in 4.DataInputStream和DataOutputStream 为过滤流。通过流来读写Java基本类,注意DataInputStream和DataOutputStream的方法 是成对的。 过滤流。输出输入各种数据类型。 writeBoolean(boolean b) ------以1bit数据传送 writeByte(int) ------以1 byte数据传送 writeBytes(String s) --------以byte序列数据传送 writeChar(int v) ――――――以 2 byte writeChars(String s)-------------以 2 byte序列 writeDouble(double d) -------以 8 byte writeInt(int v) writeLong(long l) writeShort(short s) writeUTF(String)-----------能输出中文! 6.ObjectInputStream和ObjectOutputStream 过滤流。处理对象的持久化 Object o = new Object(); FileOutputStream fos=new FileOutputStream("Object.txt"); ObjectOutputStream oos=new ObjectOutputStream(fos); oos.writeObject(o); oos.close(); FileInputStream fis =new FileInputStream(“Object.txt”); ObjectInputStream ois =new ObjectInputStream(fis); Object o = (Object)Ois.readObject(); ois.close(); 7. BufferInputStream和BufferOutputStream 过滤流,可以提高I/O操作的效率 用于给节点流增加一个缓冲的功能。 在VM的内部建立一个缓冲区,数据先写入缓冲区,等到缓冲区的数据满了之后再一次性写出,效率很高。 使用带缓冲区的输入输出流的速度会大幅提高,缓冲区越大,效率越高。(这是典型的牺牲空间换时间) 切记:使用带缓冲区的流,如果数据数据输入完毕,使用flush方法将缓冲区中的内容一次性写入到外部数据源。用close()也可以达到相同的效果,因为每次close都会使用flush。一定要注意关闭外部的过滤流。 8. PipedInputStream和PipedOutputStream 用来在线程间通信. PipedOutputStream pos=new PipedOutputStream(); PipedInputStream pis=new PipedInputStream(); try { pos.connect(pis); new Producer(pos).start(); new Consumer(pis).start(); } catch(Exception e) { e.printStackTrace(); } 9.RandomAccessFile 随机访问 可以得到文件指针。 long getFilePointer() 得到从文件开始处到文件指针的位置。 seek(long point) 将文件指针移动到此处。 10 Reader和Writer 1) Java技术使用Unicode来表示字符串和字符,而且提供16位版本的流,以便用类似的方法处理字符。 2) InputStreamReader和OutputStreamWriter作为字节流与字符流中的接口。 3) 如果构造了一个连接到流的Reader和Writer,转换规则会在使用缺省平台所定义的字节编码和Unicode之间切换。 4) 字节流与字符流的区别: 编码是把字符转换成数字存储到计算机中。把数字转换成相应的字符的过程称为解码。 编码方式的分类: ASCII(数字、英文):1个字符占一个字节(所有的编码集都兼容ASCII) ISO8859-1(欧洲):1个字符占一个字节 GB-2312/GBK:1个字符占两个字节 Unicode: 1个字符占两个字节(网络传输速度慢) UTF-8:变长字节,对于英文一个字节,对于汉字两个或三个字节。 10 都是过滤流。 BufferedReader的方法:readLine():String PrintWriter的方法:println(….String,Object等等)和write() 11. 随机存取文件 1) 实现了二个接口:DataInput和DataOutput; 2) 只要文件能打开就能读写; 3) 通过文件指针能读写文件指定位置; 4) 可以访问在DataInputStream和DataOutputStream中所有的read()和write()操作; 5) 在文件中移动方法: a. long getFilePointer(): 返回文件指针的当前位置。 b. void seek(long pos): 设置文件指针到给定的绝对位置。 c. long length(): 返回文件的长度。 12.编码问题: 编码的方式: 每个字符对应一个整数。 不同的国家有不同的编码,当编码方式和解码方式不统一时,产生乱码。 因为美国最早发展软件,所以每种的编码都向上兼容ASCII 所以英文没有乱码。 ISO-8859-1 西方字符 GB2312 。。。。。。镕 GBK Big5 Unicode UTF-8 补充: 字节流结束返回 -1 字符流结束返回null 对象流结束返回 EOFException 引申---------〉异常经常被用在流程控制, 异常也是方法的一种返回形式。
时间: 2024-10-10 02:58:11