三、I/O流
1.编写程序,当用户输入姓名和密码时,将该用户的姓名和密码保存在文件中。要求:使用字节流的方式实现,且使用try…catch…finally处理IO异常。
import java.io.*;
import java.util.Scanner;
public class Text1 {
public static void main(String[] args) throws Exception {
FileOutputStream fos=null;
System.out.print("请输入用户名:");
Scanner in = new Scanner(System.in);
String name = in.next();
System.out.print("请输入密码:");
String password = in.next();
String str="用户名:"+name+" 密码:"+password+"\t";
byte b[]=str.getBytes();
try{
fos = new FileOutputStream("people.txt",true);
for(int i=0;i<b.length;i++) {
fos.write(b[i]);
}
}
catch(Exception e){}
finally {
fos.close();
}
}
}
2.编写程序实现文件读写功能(将“Hello Java!”信息写入D盘根目录下的info.txt文件,然后读出info.tx文件中的信息并显示在控制台)。
要求:使用字节流的方式实现,并显示操作所用时间。
import java.io.*;
public class Text2 {
public static void main(String[] args) throws Exception {
//需要先建一个文件
FileInputStream in = new FileInputStream("D://info.txt");
int b=0;
long begin = System.currentTimeMillis();
while((b=in.read())!=-1) {
System.out.println(b);
}
long end = System.currentTimeMillis();
System.out.println("所用时间:"+(end-begin)+"毫秒");
in.close();
}
}
3.编写一个程序,使用字节流拷贝一个文件(文件类型可为:文本文件、图片文件、音频文件或视频文件等)。
提示:
(1)使用FileInputStream、FileOutputStream进行拷贝。
(2)定义一个1024长度的字节数组作为缓冲区。
import java.io.*;
public class Text3 {
public static void main(String[] args) throws Exception {
FileInputStream in = new FileInputStream("C://Windows/jian.jpg");
FileOutputStream out = new FileOutputStream("D://hi.jpg");
int len=0;
byte[] buff = new byte[1024];
long beginTime = System.currentTimeMillis();
while((len=in.read(buff))!=-1) {
out.write(buff, 0, len);
}
long endTime = System.currentTimeMillis();
System.out.println("花费的时间为"+(endTime-beginTime)+"毫秒");
out.flush();
in.close();
out.close();
}
}
4.编写一个程序,使用字节流拷贝一个文件(文件类型可为:文本文件、图片文件、音频文件或视频文件等)。
提示:
(1)使用FileInputStream、FileOutputStream进行拷贝。
(2)使用BufferedInputStream和BufferedOutputStream提高读写效率。
import java.io.*;
public class Text4 {
public static void main(String[] args) throws Exception {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C://Windows/jian.jpg"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D://lv.jpg"));
int len=0;
while((bis.read())!=-1) {
bos.write(len);
}
bos.flush();
bis.close();
bos.close();
}
}
5.定义学生类
class Student
{
byte id; //班内编号
String name; //姓名
int age; //年龄
char sex; //性别:M表示男,F表示女
boolean position; //是否为班委
double score; //成绩
}
测试类中创建Student类对象并为其每个属性赋值,使用DataOutputStream将每个属性的值写入student1.txt文件中,再使用DataInputStream将每个属性的值读出并显示。可以使用BufferedInputStream和BufferedOutputStream提高读写效率。
import java.io.Serializable;
public class Student implements Serializable{
byte id; //班内编号
String name; //姓名
int age; //年龄
char sex; //性别:M表示男,F表示女
boolean position; //是否为班委
double score; //成绩
}
import java.io.*;
public class Text5 {
public static void main(String[] args) throws Exception {
Student stu1 = new Student();
DataOutputStream out = new DataOutputStream(new FileOutputStream("student1.txt"));
out.writeByte(stu1.id=1);
out.writeUTF(stu1.name="张三");
out.writeInt(stu1.age=19);
out.writeChar(stu1.sex='M');
out.writeBoolean(stu1.position=true);
out.writeDouble(stu1.score=92);
DataInputStream in = new DataInputStream(new FileInputStream("student1.txt"));
System.out.println(in.readByte());
System.out.println(in.readUTF());
System.out.println(in.readInt());
System.out.println(in.readChar());
System.out.println(in.readBoolean());
System.out.println(in.readDouble());
}
}
6.编写程序实现文件读写功能(将学生基本信息写入D盘根目录下的info.txt文件,然后读出info.tx文件中的信息并显示在控制台)。
要求:使用字符流的方式实现,并显示操作所用时间。
import java.io.*;
public class Text1 {
public static void main(String[] args) throws Exception {
FileReader fr = new FileReader("d:/info.txt");
int len = 0;
long start = System.currentTimeMillis();
while((len=fr.read())!=-1) {
System.out.print((char)len);
}
fr.close();
long end = System.currentTimeMillis();
System.out.println("\n用时:"+(end-start)+"毫秒");
}
}
7.编写一个程序,使用字符流拷贝一个文本文件。
提示:
(1)使用FileReader、FileWriter进行拷贝。
(2)使用BufferedReader和BufferedWriter包装流提高读写效率。
import java.io.*;
public class Text2 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new FileReader("E://C练习/第九届蓝桥杯大赛个人赛省赛(软件类)真题/LanqiaoCB/C语言B组/7/题目.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("write.txt"));
String str = null;
while((str=br.readLine())!=null) {
bw.write(str);
bw.newLine();
}
bw.close();
br.close();
}
}
8.编写程序,将文本文件在控制台上显示出来,并在每一行的前面加上行号。
提示:
(1)使用FileReader进行读文件。
(2)使用BufferedReader包装流提高读效率。
(3)使用LineNumberReader或设置行号变量为读出的每一行加上行号。
import java.io.*;
public class Text3 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("xinxi.txt"));
LineNumberReader reader = new LineNumberReader(br);
String line = reader.readLine();
int lin = 0;
while (line != null) {
System.out.println("第"+(lin+1)+"行 "+line);
lin++;
line = reader.readLine();
}
reader.close();
br.close();
}
}
9.编写程序,将从键盘输入的若干行信息保存在一个文本文件中。
提示:
(1)使用System.in读取键盘输入。
(2)使用FileWriter将读取的内容写入文件。
(3)使用BufferedReader和BufferedWriter包装流提高读写效率。
import java.io.*;
import java.util.Scanner;
public class Text4 {
public static void main(String[] args) throws IOException {
System.out.println("请输入若干行信息,以end结尾:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new FileWriter("IO2-text4.txt"));
String s = null;
while(!(s = br.readLine()).equals("end")) {
bw.write(s);
bw.newLine();
}
bw.close();
br.close();
}
}
10.某人在玩游戏的时候输入密码123456后成功进入游戏(输错5次则被强行退出),要求用程序实现密码验证的过程。
提示:
(1)使用System.in包装为字符流读取键盘输入。
(2)BufferedReader对字符流进行包装。调用BufferedReader的readLine()方法每次读取一行。
(3)在循环中判断输入的密码是否为“123456”,如果是则打印“恭喜你进入游戏”,并跳出循环,否则继续循环读取键盘输入。
(4) 输错5次密码还不正确,则打印“密码错误,结束游戏”,结束程序。
import java.io.*;
public class Text5 {
public static void main(String[] args) throws Exception {
System.out.println("请输入6位密码:");
for(int i=0;i<5;i++) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
if(str.equals("123456")) {
System.out.println("恭喜你进入游戏");
break;
}
else {
if(i==4) {
System.out.println("密码错误,结束游戏");
}
else {
System.out.println("密码错误,请重新输入:");
}
}
}
}
}
11.编写程序,使用SequenceInputStream将多个输入流合并成一个输入流
import java.io.*;
public class Text6 {
public static void main(String[] args) throws Exception {
InputStream is1 = new FileInputStream("c://1.txt");
InputStream is2 = new FileInputStream("d://2.txt");
SequenceInputStream sis = new SequenceInputStream(is1, is2);
FileOutputStream fos = new FileOutputStream("d://new/3.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
byte b[] = new byte[1024];
int len = 0;
while ((len = sis.read(b)) != -1) {
bos.write(b, 0, len);
}
bos.close();
sis.close();
is2.close();
is1.close();
}
}
四、File类
1.使用File类操作某个文件。
要求:获取文件的大小,获得文件的路径,判断文件是否是只读文件,然后修改文件的名称。
import java.io.*;
public class Text1 {
public static void main(String[] args) {
File file = new File("d:\\1");
System.out.println("文件的大小:"+file.length()+" bytes");
System.out.println("文件的相对路径:"+file.getPath());
System.out.println("文件的绝对路径:"+file.getAbsolutePath());
System.out.println("是否是只读文件:"+file.canRead());
//修改文件的名称
String fileName=new String("d:\\2");//更改后的文件名
file.renameTo(new File(fileName));
}
}
2.使用随机文件流RandomAccessFile类将“Hello Java!”写入info.txt文件,然后再将info.txt文件内容逆序读出并显示。提示:使用 RandomAccessFile类的seek方法定位。
import java.io.*;
public class Text2 {
public static void main(String[] args) throws IOException {
RandomAccessFile raf = new RandomAccessFile("info.txt","rw");
String str = "Hello Java";
raf.writeUTF(str);
long len = raf.length();
long print = len - 1;
int c = 0;
while(print>=0) {
raf.seek(print);
c = raf.read();
System.out.print((char)c);
print--;
}
}
}
3.按“UTF-8”编码方式创建一个文本文件file1.txt,内容为“邯郸学院”;
按“GBK”编码方式创建一个文本文件file2.txt,内容为“软件学院2014级软件技术专业Java班”。
编写程序将file2.txt文件中内容追加到file1.txt文件中。参考教材P324例8-34。
import java.io.*;
import java.nio.channels.*;
public class Text3 {
public static void main(String[] args) throws Exception {
FileOutputStream fos = new FileOutputStream("file1.txt",true);
OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");
fos.write("邯郸学院".getBytes());
FileOutputStream f = new FileOutputStream("file2.txt");
OutputStreamWriter o = new OutputStreamWriter(f,"GBK");
String s = "软件学院2014级软件技术专业Java班";
f.write(s.getBytes());
RandomAccessFile infile = new RandomAccessFile("file2.txt","rw");
FileChannel inChannel = infile.getChannel();
RandomAccessFile outfile = new RandomAccessFile("file1.txt","rwd");
FileChannel outChannel = outfile.getChannel();
long transferTo = inChannel.transferTo(0, inChannel.size(), outChannel);
if(transferTo>0)
System.out.println("复制成功");
infile.close();
inChannel.close();
outfile.close();
outChannel.close();
fos.close();
osw.close();
f.close();
o.close();
}
}
4.遍历指定目录(包括该目录下所有子目录)下所有扩展名为.java的文件。提示:使用递归方式实现。
import java.io.*;
import java.util.Arrays;
public class Text4 {
public static void main(String[] args) {
File f = new File("E://JAVA/实验题/src/实验题05");
if(f.isDirectory()) {
String[] fileNames = f.list((dir,name)->name.endsWith(".java"));
Arrays.stream(fileNames).forEach(x->System.out.println(x));
}
}
}
5.通过递归方式将指定目录(包括该目录下所有子目录)下所有文件全部删除。
import java.io.*;
public class Text5 {
public static void main(String[] args) {
File files = new File("D://新建文件夹");
deleteDir(files);
}
public static void deleteDir(File files) {
File[] listFiles = files.listFiles();
for(File file:listFiles) {
if(file.isDirectory()) {
deleteDir(file);
}
file.delete();
}
files.delete();
}
}