Java核心技术习题(二)

三、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();
	}

}
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值