知识点
缓冲流,字符流 基础,练习
1.写出4个IO流中的抽象基类,4个文件流,4个缓冲流?
抽象基类:InputStream,OutputStream,Reader,Writer
文件流:FileInputStram,FileOutputSteam,FileReader,FileWriter
缓冲流:BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter
2.字节流与字符流的区别与使用情境?
字节流:读写数据是以字节为单位。可以复制任意文件的数据;
字符流:读写数据是以字符为单位,字节流+编码表=字符流。适用于文本文件;
3.转换流是哪两个类,分别的作用是什么?请分别创建两个类的对象。(注意是可以有字符集的那种)
转换流是InputStreamReader类和OutputStreamWriter类;InputStreamReamder的作用是字节流到字符流的桥梁,并使用指定的编码将字节解码为字符,有默认字符集,也可指定字符集;OutputStreamWriter的作用是从字符到字节的桥梁,使用指定的编码解码字符为字节,有默认字符集,也可指定字符集;
4.使用缓冲流实现a.jpg文件复制为b.jpg文件的操作
public class Work8_1_4 {
public static void main(String[] args) throws IOException {
//创建字节缓冲输入流对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\itcast\\a.jpg"));
//创建字节缓冲输入流对象
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\itcast\\b.jpg"));
//复制数据
byte[] bys = new byte[1024];
int len;
while((len=bis.read(bys))!=-1){
bos.write(bys,0,len);
bos.flush();
}
//释放资源
bis.close();
bos.close();
}
}
5.在指定的路径下新建一个 .txt 文件 “test.txt”,利用程序在文件中写入如下内容:
“Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于 1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称。Java 技术具有 卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科 学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互 联网的产业环境下,Java更具备了显著优势和广阔前景。”
并且成功读出在控制台打印,而且利用程序复制 test.txt 给 test1.txt
public class Work8_1_5 {
public static void main(String[] args) throws IOException {
//创建字符缓冲输入流对象用于test复制到test1
BufferedReader br1 = new BufferedReader(new FileReader("E:\\itcast\\test.txt"));
//创建字符缓冲输入流对象 用于写入数据
BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\itcast\\test.txt"));
BufferedWriter bw1 = new BufferedWriter(new FileWriter("E:\\itcast\\test1.txt"));
//写入文本数据
bw.write("Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言," +
"是由Sun Microsystems公司于 1995年5月推出的Java程序设计语言和Java平台" +
"(即JavaSE, JavaEE, JavaME)的总称。Java 技术具有 卓越的通用性、高效性、" +
"平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科 学超级计算机、" +
"移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互" +
"联网的产业环境下,Java更具备了显著优势和广阔前景。");
bw.flush();
//复制数据到test1中,并读数据输出在控制台
String line;
while((line=br1.readLine())!=null){
bw1.write(line);
System.out.print(line);
}
//释放资源
br1.close();
bw1.close();
bw.close();
}
}
6.利用IO流操作文件
- 利用java代码在D盘下创建一个mytemp文件夹
- 显示D盘下所有的.Java文件(没有可创建一个Hello.java做测试),包括D盘的子文件夹下的.java文件(利用递归)
- 给Hello.java文件里面随便写一些内容,然后把这个文件复制到mytemp文件夹中,名字也叫Hello.java
public class Work8_1_6 {
public static void main(String[] args) throws IOException {
//1) 利用java代码在D盘下创建一个mytemp文件夹
File file = new File("D:\\mytemp");
file.mkdir();
File file1 = new File("D:\\Hello.java");
file1.createNewFile();
FileOutputStream fos = new FileOutputStream(file1);
fos.write("你好!".getBytes());
fos.flush();
FileInputStream fis = new FileInputStream(file1);
FileOutputStream fos1 = new FileOutputStream("D:\\mytemp\\Hello.java");
int len;
byte[] bys = new byte[1024];
while((len=fis.read(bys))!=-1){
// fos1.write(bys,0,len);
fos1.write(bys,0,len);
}
fos1.close();
fis.close();
fos.close();
//2) 显示E盘下所有的.Java文件(没有可创建一个Hello.java做测试),包括E盘的子文件夹下的.java文件(利用递归)
File file5 = new File("D:/");
getAllJavaFile(file5);
}
public static void getAllJavaFile(File file) {
File[] listFiles = file.listFiles();
if (null == listFiles) {
return;
}
for (File file1 : listFiles) {
if (file1.isDirectory()) {
getAllJavaFile(file1);
} else {
String fileName = file1.getName();
//endWith判断字符串指定后几位的值
if (fileName.endsWith(".java")) {
System.out.println(fileName);
}
}
}
}
}
7.重新完成 "File流练习0"中会出现乱码的题:编写程序向文本文件中写入自己的信息,格式为:姓名:XXX 性别:X 年龄:XX 班级:XXX,将该信息读出后显示的屏幕上后把文件删除。(如果出现问题,想一下会不会没有flush()方法,没有就算了~)
public class Work8_1_7 {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
//编写程序向文本文件中写入自己的信息,
File file = new File("E:\\Work8_1_7\\myselfData.txt");
//目的地
FileOutputStream fos = new FileOutputStream(file);
//数据源
FileInputStream fis = new FileInputStream(file);
System.out.println("请输入自己的姓名:");
String name = scanner.next();
name = "姓名:"+name;
System.out.println("请输入自己的年龄:");
String age = scanner.next();
age = "年龄:"+age;
System.out.println("请输入自己的性别:");
String sex = scanner.next();
sex = "性别:"+sex;
System.out.println("请输入自己的班级:");
String garde = scanner.next();
garde = "班级:"+garde;
//格式为:姓名:XXX 性别:X 年龄:XX 班级:XXX,
fos.write(name.getBytes());
fos.write(" ".getBytes());
fos.write(age.getBytes());
fos.write(" ".getBytes());
fos.write(sex.getBytes());
fos.write(" ".getBytes());
fos.write(garde.getBytes());
fos.write(" ".getBytes());
fos.flush();
System.out.println("成功!");
//将该信息读出后显示的屏幕上后把文件删除。
//将数据按一组一组数组读
byte[] bytes = new byte[2048];
//一个数组读取的实际字符个数
int len;
while ((len=fis.read(bytes)) != -1){
System.out.print(new String(bytes,0,len));
}
//释放资源
fos.close();
fis.close();
//必须在释放后删除!
file.delete();
}
}
8.(字符流)读取一个文本文件,每行都追加一个“好”,在文件结尾再追加“完毕”。
public class Work8_1_8 {
public static void main(String[] args) throws IOException {
//创建字符缓冲输入流对象
BufferedReader br = new BufferedReader(new FileReader("E:\\itcast\\javase.txt"));
//创建字符缓冲输出流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\itcast\\javase1.txt"));
//读取一个文本文件,每行都追加一个“好”,在文件结尾再追加“完毕”。
String line;
while((line=br.readLine())!=null){
//每行都追加一个“好”
line=line+"好";
bw.write(line);
bw.newLine();
bw.flush();
}
//在文件结尾再追加“完毕”
bw.write("完毕");
bw.flush();
//释放资源
bw.close();
br.close();
}
}
9.使用Java的输入、输出流将一个文本文件的内容按行读出,每读出一行就顺序添加行号,并写入到另一个文件中。
public class Work8_1_9 {
public static void main(String[] args) throws IOException {
//创建字符缓冲输入流
BufferedReader br = new BufferedReader(new FileReader("E:\\itcast\\java.txt"));
//创建字符缓冲输出流
BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\itcast\\java1.txt"));
//更改数据并复制
String line;
int num = 0;
char[] chs = new char[1024];
while ((line = br.readLine()) != null) {
//每行添加添加序号
line = ++num + ":" + line;
bw.write(line);
bw.newLine();
bw.flush();
}
//释放资源
bw.close();
br.close();
}
}
10.(实践题)使用输入流读取试题文件,每次显示试题文件中的一道题目。读取到字符“*”时暂停读取,等待用户从键盘输入答案。用户做完全部题目后。程序给出用户的得分(10分一道题)。
1) 试题内容如下:
(1)英雄联盟S9全球总决赛是什么时间开幕的?
A.2018-08-08 B. 2018-08-01
C.2019-10-01 D. 2019-10-02
.********************
(2)下列哪个英雄不属于《英雄联盟》?
A.卡特 B.盲僧 C.剑豪 D.后羿
.********************
(3).以下哪一句不是疾风剑豪亚索的台词?
A.死亡如风,常伴吾身。B.面对疾风吧!C.真正的大师,永远都怀着一颗学徒的心。D.哈塞给!
.********************
(4).英雄联盟世界S赛被OMG基地50血翻盘的战队是?
A.SKT B.Najin C.FNC D.G2
.********************
(5)英雄联盟中,戏称最争气的英雄是?
A迅捷斥候 B蒸汽机器人 C德玛西亚之力 D疾风剑豪
.********************
-------》程序运行如下:
(1)英雄联盟S9全球总决赛是什么时间开幕的?
A.2018-08-08 B. 2018-08-01
C.2019-10-01 D. 2019-10-02
输入选择的答案(A、B、C、D):D
(2)下列哪个英雄不属于《英雄联盟》?
A.卡特 B.盲僧 C.剑豪 D.后羿
输入选择的答案(A、B、C、D):D
…
…
完成试题,恭喜你 你最后的得分为:20 分。
public class Work8_1_10 {
static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) throws IOException {
//创建字符缓冲输入流
BufferedReader br = new BufferedReader(new FileReader("E:\\itcast\\试题文件.txt"));
//读取一行数据
String line;
//总积分
int sum = 0;
//答案数组 博主并不知道正确答案,此处乱写的
char[] chs = {'A', 'D', 'D', 'B', 'C'};
//答案索引
int i = 0;
while ((line = br.readLine()) != null) {
//每次显示试题文件中的一道题目
System.out.println(line);
//读取到字符“*”时暂停读取
if (line.contains("*****")) {
System.out.println("输入选择的答案(A、B、C、D):");
//等待用户从键盘输入答案
char c = isValueAnswer();
if (c == chs[i++]) {
sum += 20;
}
}
}
System.out.println("恭喜你获得" + sum + "分!");
//释放资源
br.close();
}
public static char isValueAnswer() {
String answer;
boolean flag=true;
char c=' ';
while(flag){
try {
answer = scanner.next();
if (answer.length() > 1) {
throw new Exception("请输入长度为1的答案:");
} else {
c = answer.toUpperCase().charAt(0);
if (c<'A' || c>'D'){
throw new Exception("请输入A-D之间:");
}else{
flag =false;
break;
}
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
return c;
}
}