|
Java程序设计辅导资料十五主 题:第九章 字符输入/输出流类、文件操作(课件)
“不忘初心、牢记使命”主题理论学习:
每周文摘:忠诚是共产党人必须具备的优秀品格。“忠诚印寸心,浩然充两间”的坚毅,“砍头不要紧,只要主义真”的无畏,腹中满是草根而宁死不屈的气节,食指钉入竹签而永不叛党的坚贞,无数先烈用鲜血诠释了对党的忠诚。对党忠诚必须是纯粹的、无条件的,是政治标准、更是实践标准,鲜明体现在坚决贯彻党中央决策部署上。
摘选自《在第十九届中央纪律检查委员会第二次全体会议上的讲话》
内 容:
我们这周主要学习《Java程序设计》这门课程的第9章后两节关于字符输入/输出流类、文件操作的相关内容。希望通过下面的内容能使同学们对此方面的知识有进一步的了解。
知识要点:
抽象字符流
InputStream、OutputStream
Reader、Writer
文件操作
重点与难点:
重点:InputStream、OutputStream与Reader、Writer的区别
难点:InputStream、OutputStream与Reader、Writer的区别采用字节流可以对以字符基本类型的流式文件进行数据读/写操作,方法如下:
采用文件字节流类,将字节缓冲区数组中的字节数据转化为字符。
采用数据字节流类,readChar()方法读取一个字符,writeChar(int c)方法写入一个字符,writeChars(String s)方法写入一个字符串。
注意:DataInputStream类中读取一行字符串的readline()方法已过时,被BufferedReader类中的readLine()方法取代。
此外,Java提供字符流类对字符流式文件进行数据读写操作。字符输入流类是Reader类及其子类,字符输出流类是Writer类及其子类。
抽象字符流
java.io.Reader、java.io.Writer与其子类等是处理字符流(Character Stream)的相关类。简单地说,就是对流数据以一个字符(两个字节)的长度为单位来处理(0~65 535、0x0000~0xffff),并进行适当的字符编码转换处理,即Reader、Writer与其子类可以用于进行所谓纯文本文件的字符读/写。
1、Reader和Writer
java.io.Reader和java.io.Writer支持Unicode标准字符集(Character Set)(字节流则只支持ISO-Latin-1 8-bit)。在处理流数据时,会根据系统默认的字符编码来进行字符转换,Reader和Writer是抽象类,在进行文本文件的字符读写时真正会使用其子类,子类通常会重新定义相关的方法。
下面看一个例子:
package onlyfun.caterpillar;import java.io.*;public class ReaderDemo {
public static void main(String[] args) {
try {
PushbackInputStream pushbackInputStream =
new PushbackInputStream(
new FileInputStream(args[0]));
byte[] array = new byte[2]; ByteArrayInputStream byteArrayStream =
new ByteArrayInputStream(array);// reader会从已读的位数组中取出数据
InputStreamReader reader =
new InputStreamReader(byteArrayStream);int tmp = 0;
int count = 0;while((count = pushbackInputStream.read(array))
!= -1) {
// 两个字节转换为整数
tmp = (short)((array[0] << 8) |
(array[1] & 0xff));
tmp = tmp & 0xFFFF;// 判断是否为BIG5,如果是则显示BIG5中文字
if(tmp >= 0xA440 && tmp < 0xFFFF) {
System.out.println("BIG5: " +
(char) reader.read());
// 重置ArrayInputStream的读取光标
// 下次reader才会再重头读取数据
byteArrayStream.reset();
}
else {
// 将第二个字节推回流
pushbackInputStream.unread(array, 1, 1);
// 显示ASCII范围的字符
System.out.println("ASCII: " +
(char)array[0]);
}
}pushbackInputStream.close();
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("请指定文件名称");
}
catch(IOException e) {
e.printStackTrace();
}
}
}此例子注意的是Reader的read()方法,该方法每次会读入一个字符的数据,并以系统默认的编码作字符转换,然后以int类型返回。也可以直接在构建Reader的实例时,自行指定读取时的编码。二、 InputStream、OutputStream与Reader、Writer的区别
InputStream、OutputStream直接操作byte数组。
Reader、Writer在操作时会进行decode、encode,会根据你的系统属性编码格式对数据进行编码或解码。但是当文件的编码格式与当前系统的不一致时,就需要做编码的转换。
转换
new OutputStreamWriter(FileUtils.openOutputStream(new File(filePath)), "ms932")
new InputStreamReader(FileUtils.openInputStream(new File(filePath)), "ms932")三、 文件字符流
分别是Reader类和Writer类的子类。FileInputStream类使用字节读取文件时不能直接操作Unicode字符,读取汉字(2字节)时可能会出现乱码。
FileReader in=new FileReader("Example20)1.java"); //构造方法
read();
write(String s,int off,int len);
BufferedReader类:
BufferedReader(Reader in);
readLine(); //读取一行四、 文件操作
Java支持对文件进行顺序存取和随机存取操作,提供File类记载文件属性信息,对文件的读/写操作通过流实现;RandomAccessFile类以随机存取方式进行文件读/写操作。在对文件操作过程中,还需要使用文件过滤器接口和文件对话框类。
1、文件操作类
File文件操作类保存文件或目录的各种属性,包括文件名、文件长度、最后修改时间、是否只读等,提供获得当前文件的路径名、判断指定文件是否存在、获得当前目录中所有文件列表、创建文件、删除文件、创建目录、删除目录等操作的方法。
在打开、保存、复制文件时,读/写文件中数据内容的操作由流实现,不同类型的文件需要使用不同的流类。
文件和目录路径名的抽象表示形式。
用户界面和操作系统使用与系统相关的路径名字符串来命名文件和目录。此类呈现分层路径名的一个抽象的、与系统无关的视图。抽象路径名有两个组件:
一个可选的与系统有关的前缀字符串,比如盘符,"/" 表示 UNIX 中的根目录,"\\\\" 表示 Microsoft Windows UNC 路径名,以及零个或更多字符串名称的序列。
除了最后一个,抽象路径名中的每个名称代表一个目录;最后一个名称既可以代表目录,也可以代表文件。空的抽象路径名没有前缀和名称序列。
路径名字符串与抽象路径名之间的转换与系统有关。将抽象路径名转换为路径名字符串时,每个名称与下一个名称之间由单个默认分隔符字符 隔开。默认名称分隔符由系统属性 file.separator 定义,也可以从此类的公共静态字段 separator 和 separatorChar 中得到。将路径名字符串转换为抽象路径名时,可以使用默认名称分隔符或者受基础系统支持的其他任何名称分隔符来分隔其中的名称。
无论是抽象路径名还是字符串路径名,都可以是绝对 路径名或相对 路径名。绝对路径名是完整的路径名,不需要任何其他信息就可以定位自身表示的文件。相反,相对路径名必须使用来自其他路径名的信息进行解释。默认情况下,java.io 包中的类总是根据当前用户目录来分析相对路径名。此目录由系统属性 user.dir 指定,通常是 Java 虚拟机的调用目录。
前缀的概念用于处理 UNIX 平台的根目录,以及 Microsoft Windows 平台上的盘符、根目录和 UNC 路径名,如下所示:
1、对于 UNIX 平台,绝对路径名的前缀始终是 "/"。相对路径名没有前缀。表示根目录的绝对路径名的前缀为 "/" 并且没有名称序列。
2、对于 Microsoft Windows 平台,包含盘符的路径名的前缀由驱动器名和一个 ":" 组成:如果路径名是绝对路径名,后面可能跟着 "\\"。UNC 路径名的前缀是 "\\\\";主机名和共享名是名称序列中的前两个名称。没有指定驱动器的相对路径名无前缀。
File 类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变。
构造方法:
File(File parent, String child)
根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
File(String pathname)
通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例。
File(String parent, String child)
根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
File(URI uri)
通过将给定的 file: URI 转换成一个抽象路径名来创建一个新的 File 实例。例题
一、判断题
1、FileInputStream类使用字节读取文件时可以直接操作Unicode字符。()
二、填空题
1、采用文件字节流类,可以将字节缓冲区数组中的字节数据转化为()。
2、字符输入流类是()及其子类,字符输出流类是()及其子类。
3、InputStream、OutputStream直接操作()数组。例题答案
一、判断题
1、错误
二、填空题
1、字符
2、Reader类、Writer类
3、byte本内容由易百教育整理发布
网址www.openhelp100.com
QQ 515224986
|
|