Spraing※boy该次实验主要就是考察各种流的对文件的读写操作,实际上步骤基本都是一样的,只不过是效率的高低以及编码方式不同罢了,弄明白了一个,基本上其他的流也无师自通了,文件的读写操作在项目开发中是非常常见的,很多系统都会在运行的过程中产生一定的数据信息,而系统一般会自动生成对应文件,所以在项目开发中像这种类似的读写操作是十分频繁的,希望大家能好好看一下这篇博客的内容❀❀。
推荐链接:Java学习笔记
1、判断E盘指定目录下是否有后缀名为.jpg的文件,如果有就输出此文件名称。
·方法1:File[] files = file.listFiles() 获取file对象数组
·方法2:String[] f = files.list() 获取String字符串数组
学习链接:Java File类
public class S7_1 {
public static void main(String[] args) {
File file = new File("D:\\");
//方法1:获取file对象数组
File[] files = file.listFiles();
boolean isExist = false;
for (File f : files){
if (f.exists()){
if (f.getName().endsWith(".jpg")){
isExist = true;
System.out.println(f);
}
}
}
if (!isExist){
System.out.println("你要查找的文件不存在");
}
//方法2:获取文件名的String数组
String[] f = file.list();
for (String s : f){
if (s.endsWith(".jpg")){
System.out.println(s);
}
}
}
}
2、分别使用字节流和字节缓冲流的两种读取方式实现对图片文件的复制操作并比较两种方式在复制时间上的效率。
复制文件步骤:
1.创建输入输出流 (一般使用字节缓冲流,效率比较高)
2.定义字节数组缓冲区 byte[] buff = new byte[1024];
3.开始拷贝
4.关闭输入输出流 in.close(); out.close();
学习链接:java学习笔记
public class S7_2 {
public static void main(String[] args) throws IOException {
/*字节流拷贝*/
//1.创建字节输入输出流
InputStream in = new FileInputStream("D:\\上海外滩.jpg");
OutputStream out = new FileOutputStream("D:\\copy1.jpg");
//定义字节数组作为缓冲区
byte[] buff = new byte[1024];
int len;
long start = System.currentTimeMillis(); //获取开始时间
//2.开始拷贝
while ((len = in.read(buff)) != -1){
out.write(buff,0,len);
}
long end = System.currentTimeMillis();
//3.关闭输入输出流
in.close();
out.close();
System.out.println("字节流拷贝需要的时间是:"+(end-start)+"ms");
/*字节缓冲流拷贝*/
//1.创建字节缓冲输入输出流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\上海外滩.jpg"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\copy2.jpg"));
//2.开始拷贝
long begintime = System.currentTimeMillis();
while ((len = bis.read(buff)) != -1){
bos.write(buff,0,len);
}
long endtime = System.currentTimeMillis();
//3.关闭输入输出流
bis.close();
bos.close();
System.out.println("字节缓冲流拷贝需要的时间为:"+(endtime-begintime)+"ms");
}
}
3、编写一个程序,分别使用转换流、字符流和缓冲字符流拷贝一个文本文件。要求:
• 分别使用InputStreamReader、OutputStreamWriter类和FileReader、FileWriter类用两种方式(字符和字符数组)进行拷贝。
• 使用BufferedReader、BufferedWriter类的特殊方法进行拷贝。
学习链接:Java学习笔记
public class S7_3 {
public static void main(String[] args) throws IOException {
/*转换流,用默认的编码方式读取*/
//FileReader fr = new FileReader("\"D:\\java程序设计\\\\text.txt\"");
//1.创建转换输入输出流
InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\java程序设计\\text.txt"));
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\java程序设计\\text1.txt"));
//2.读写数据
char[] chars = new char[100];
int len;
while ((len = isr.read(chars)) != -1){
osw.write(chars,0,len);
}
//3.关闭转换流
isr.close();
osw.close();
/*字符流*/
//1.创建一个字符输入流
FileReader fr = new FileReader("D:\\java程序设计\\text.txt");
FileWriter fw = new FileWriter("D:\\java程序设计\\text2.txt");
//2.读取数据
char[] charbuff = new char[100];
while ((len = fr.read(charbuff)) != -1){
fw.write(charbuff,0,len);
}
//3.关闭输入输出流
fr.close();
fw.close();
/*缓冲字符流*/
//1.创建缓冲字符输入输出流
BufferedReader br = new BufferedReader(new FileReader("D:\\java程序设计\\text.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\java程序设计\\text3.txt"));
//2.读取数据
char[] chars1 = new char[1024];
while ((len = br.read(chars1)) != -1){
bw.write(chars1,0,len);
}
//3.关闭输入输出流
br.close();
bw.close();
}
}
4、编程序实现下列功能:
• 向指定的txt文件中写入键盘输入的内容,然后再重新读取该文件的内容,显示到控制台上。
• 键盘录入5个学生信息(姓名, 成绩),按照成绩从高到低追加存入上述的文本文件中。
思路:
1.成绩降序:在学生类实现Comparable接口<Student>泛型,并重写CompareTo()方法
该知识点在实验6的第5小题讲到过
2.学生信息的存储:采用TreeSet集合
3.将TreeSet集合中的内容转换为字符串再进行读入操作
public class S7_4 {
public static void main(String[] args) throws IOException {
Scanner in = new Scanner(System.in);
//创建TreeSet集合储存学生的信息
TreeSet<Stu> treeSet = new TreeSet<>();
for (int i = 0; i < 5; ++i){
System.out.println("请输入姓名:");
String str = in.next();
System.out.println("请输入成绩:");
int score = in.nextInt();
//加入list集合
treeSet.add(new Stu(str,score));
}
//将list集合中的内容转换为字符串
String str1 = "";
for (Stu student : treeSet){
str1 += student.toString()+"\n";
}
//创建输入输出流
FileOutputStream fos = new FileOutputStream(new File("D:\\java程序设计\\text.txt"));
//将得到的字符串直接转换为字节数组
byte[] bytes = str1.getBytes();
//写入文件
int len = bytes.length;
fos.write(bytes,0,len);
}
}
//创建学生类,实现Comparable接口<Student>泛型
class Stu implements Comparable<Stu> {
public String name;
public int score;
public Stu(String name, int score) {
this.name = name;
this.score = score;
}
@Override
public String toString() {
return "Stu{" +
"name='" + name + '\'' +
", score=" + score +
'}';
}
@Override
public int compareTo(Stu stu) {
if (this.score < stu.score){
return 1;
}
return -1;
}
}
5、复制指定目录中的指定类型(如.java)的文件到另一个目录中。
依旧是文件的读写操作。。。。
public class S7_5 {
public static void main(String[] args) throws IOException {
//复制文件所在目录
File file = new File("D:\\java程序设计\\实验作业");
//得到目录下的文件数组
File[] files = file.listFiles();
//遍历文件
for (File f : files){
//这里我们要复制的文件是以”.iml“结尾的
if (f.getName().endsWith(".iml")) {
//利用缓冲流开始复制文件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\java程序设计\\"+f.getName())); //文件名字由程序自动生成
//读写操作
int len;
byte[] bytes = new byte[1024];
while ((len = bis.read(bytes)) != -1){
bos.write(bytes,0,len);
}
//关闭缓冲流
bis.close();
bos.close();
}
}
}
}
6、已知s.txt文件中有这样的一个字符串:“hcexfgijkamdnoqrzstuvwybpl”,请编写程序读取数据内容,把数据排序后写入ss.txt中。
思路:
1.获取字符串:实际就是读取文件内容储存在字符串中
2.排序:将字符串转换为字符数组,然后调用Arrays.sor()进行排序
3.读入文件:重新将字符数组转换为字符串,然后直接读入
学习链接:Java学习笔记
public class S7_6 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("D:\\java程序设计\\text1.txt"));
//读取文件内容并储存在字符串中
char[] chars = new char[100];
int len;
String str = null;
while ((len = br.read(chars)) != -1) {
str = new String(chars, 0, len);
}
System.out.println(str);
//将字符串转换为字符数组
char[] chars1 = str.toCharArray();
//对字符串数组进行排序
Arrays.sort(chars1);
//再重新转换为字符串
String newStr = new String(chars1);
//将字符串写入文件
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\java程序设计\\text2.txt"));
bw.write(newStr);
br.close();
bw.close();
}
}