- 熟悉文件的各种流类
- 了解字符的编码
- 掌握文件I/O操作的相关概念
- 了解对象的序列化
简单的引入
在Java中所有的IO机制都是基于“流”方式进行输入和输出。这些流可以视为同一台计算机不同设备或者是不同计算机之间数据序列的流动。这些流序列的数据通常有两种格式:文本流和二进制流。文本流每一个字节存放一个ASCII码代表一个字符(而对于Unicode编码来说,每两个字节代表一个字符)。如整形数12345,其在内存中需要两个字节,其系统为整型分配四个字节,所以高两位的字节为0,而按文本流输出则占用五个字符,由于分别是12345这五个字符所对应的ASCII码
内存中的存储形式 | |||
00000000 | 00000000 | 00110000 | 00111001 |
二进制行形式:与内存中的存储形式完全相同 | |||
00000000 | 00000000 | 00110000 | 00111001 |
文本形式:分别对应各自的ASCII码 | |||
00000001 | 00000010 | 00000011 | 00000101 |
文本流与二进制流的优缺点
文本流:文本流形式和字节流一一对应,因而便于对于对字符进行逐个处理,也便于输出显示,但是占用较多的内存空间,且花费较多的转换时间(二进制和 编码之间的转换)。在Java中的Unicode编码,这是一种定长编码,每个字符两个字节,因此在存储ASCII码时会额外浪费一个字节的空间。
二进制流:可以节省外存空间和转化时间,但是一个字节不对应一个字符,不能直接输出字符形式。
总结:对于纯文本信息(比如字符串),以文本形式存储较佳;而对于数值信息,则用二进制形式较好。
I/O流的优势在于简单易用,缺点是效率低。Java的I/O提供了读写数据 的标准方法。Java语法中定义了许多类专门负责各种方式的输入输出,这些类被放在java.io包中。在java类库中,有关IO操作内容非常的庞大:有标准的输入输出、文件的操作、网路上的数据流、字符串流和对象流等。
1.文件操作类--File
总结:
对文件或文件夹进行操作(仅仅操作文件本身的属性不指定怎样从文件读取或者存储)
在java.io包中,File类是唯一一个与文件本身操作有关的操作类。它定义了一系列与平台无关的方法来操作文件,通过调用File类,能够完成创建、删除、重命名文件,判断文件的读写权限以及问价是否存在,设置
和查询问价创建的时间、权限等操作。File类除了对文件的操作外,还可以将目录当做文件来处理。
File(String directoryPath);//创建指定文件或者目录文件的File对象 File(String directoryPath,String filename);//创建由File对象和指定文件名的FIle对象 File(File dirObj,String filename);//创建指定文件目录和文件名册File对象 File F1=new File("G:\\");//创建 指向“G:\”的File对象 File F2=new File("G:\\","1.txt");//创建指向“G:\1.txt”的File对象 File F3=new File(F1,"1.txt");//创建指向“G:\1.txt”的File对象
注意:
路径分隔符。在Linux/Unix下用斜线(/)路径处理正确;在Windows/DOS下使用反斜线(\),,那么就需要在字符串内使用转义字符\(\\)。
常用方法如下
方法 | 功能描述 |
boolean canRead() | 测试应用程序是否能从指定的文件中读取 |
boolean canWirte() | 测试应用程序是否能够写当前文件 |
boolean delete() | 删除当前指定的文件 |
boolean equals() | 比较该对象指定的对象 |
boolean exists() | 测试当前的File是否存在 |
String getAbosolutePath() | 返回该对象表示的文件的绝对的路径名 |
String getCanonicalPath() | 返回当前File对象的路径名的规范格式 |
String getName() | 返回当前对象的文件名 |
String getParent() | 获取父路径名,没有就返回null |
String getPath) | 返回当前对象的路径名 |
boolean isAbosolute() | 测试当前对象是否是一个绝对路径名 |
boolean isDirectory() |
是否是一个路径 |
boolean isFile() | 是否是一个file |
long islastModified() | 返回最后修改的时间 |
long length() | 返回当前File的文件的长度 |
String list() | 返回路径文件列表 |
boolean mkdir() | 创建一个目录路径名由当前File对象指定 |
boolean mkdirs() | 创建一个目录路径名由当前File对象指定包括任一必须的父路径 |
boolean renameTo() | 将当前file对象指定的文件更改名为指定参数File指定的路径名 |
范例
package Learn; import java.io.File; public class FileDemo { public static void main(String[] args) { File f=new File("c:\\1.txt"); if(f.exists()){ f.delete(); } try{ f.createNewFile(); }catch(Exception e){ System.out.println(e.getMessage()); } System.out.println(f.getName());//取得文件名 System.out.println(f.getPath());//取得文件路径 System.out.println(f.getAbsolutePath());//取得绝对路径名 System.out.println(f.getParent());//父文件夹名 System.out.println(f.exists());//文件是否存在 System.out.println(f.canWrite());//文件可不可写 System.out.println(f.canRead());//文件可不可度 System.out.println(f.isDirectory());//文件是不是个目录 System.out.println(f.isFile());//文件是不是文件 System.out.println(f.isAbsolute());//文件是不是绝对路径 System.out.println(f.lastModified());//文件最后的修改时间 System.out.println(f.length());//文件的额长度 } }
I:input 由外围输入到内存
O:output 由内存写出到外存。
I/O:是相对于内存来说的
2.RandomAccessFile类
可以跳转到文件的任意位置处读写数据
3.字节流和字符流
字节流
读:INputStream(抽象类)
写:OutputStream(抽象类)
字符流