目录
1、
判断E盘指定目录下是否有后缀名为.jpg的文件,如果有,就输出此文件名称。
import java.io.*;
public class SevenDemo {
public static void main(String[] args) {
//创建File对象,并不是创建文件(文件有可能不存在)
File file = new File("E:");
//创建过滤器对象,并重写accept方法
FilenameFilter filter = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
File currFile = new File(dir, name);
//dir为该file对象所在的目录,name为该对象对应的文件或目录名称
if (currFile.isFile() && currFile.getName().endsWith(".jpg")) {
return true;//既是文件,又是jpg,则筛选出来
} else {
return false;
}
}
};
if (file.exists()) {
String[] lists = file.list(filter);
//将file(E盘)下面的所有文件和目录用list调出来,再用filter将jpg文件筛选出来
for (String list : lists) {
System.out.println(list);
}
}
}
}
2、
分别使用字节流和字节缓冲流的两种读取方式实现对图片文件的复制操作。
(1)、使用字节流实现对图片进行复制操作
import java.io.*;
public class SevenDemo1 {
public static void main(String[] args) throws Exception{//要记得throws抛出异常
FileInputStream fis = new FileInputStream("E:/pic2.zhimg.jpg");
FileOutputStream fos = new FileOutputStream("E:/Java课程实验7-1.jpg");
//注意是Input和Output,不要只写In和Out
int len = 0;
while ((len = fis.read()) != -1) {
fos.write(len);
}
fis.close();
fos.close();
}
}
(2)、使用字节缓冲流对图片进行复制操作
import java.io.*;
public class SevenDemo2 {
public static void main(String[] args) throws Exception {//throws抛出异常
FileInputStream is = new FileInputStream("E:/Java课程实验7-1.jpg");
BufferedInputStream bi = new BufferedInputStream(is);//注意字节缓冲流的名称,及传入参数
FileOutputStream os = new FileOutputStream("E:/Java课程实验7-2.jpg");
BufferedOutputStream bo = new BufferedOutputStream(os);
int len = 0;
while ((len = bi.read()) != -1) {
bo.write(len);//注意这里操作的都是缓冲流
}
bi.close();
bo.close();
//只需要关闭缓冲流即可,如果不关闭缓冲流只关闭输入输出流,图片会有残缺
}
}
需要注意的是,这里只需要关闭缓冲流从而使得缓冲流中的数据完全进入输入输出流中,这样图片是完整的;如果仅仅关闭输入输出流而不关闭缓冲流,则图片会有残缺;如果四个流同时关闭,则会出现IOException。
3、
编写一个程序,分别使用转换流、字符流和缓冲字符流拷贝一个文本文件。要求:
• (1)使用InputStreamReader、OutputStreamWriter类和FileReader、FileWriter类分别用两种方式(字符和字符数组)进行拷贝。
转换流配单个字节:
import java.io.*;
public class SevenDemo1 {
public static void main(String[] args) throws Exception {
//转换流 配 单个字节
FileInputStream is = new FileInputStream("E:/Java课程实验7.txt");
FileOutputStream os = new FileOutputStream("E:/Java课程实验7-2.txt");//如果不存在会直接创建
InputStreamReader isr = new InputStreamReader(is);
OutputStreamWriter osw = new OutputStreamWriter(os);//这俩就转成了字符流
int ch = 0;
while((ch = isr.read()) != -1) {
osw.write((char) ch);
}
isr.close();
osw.close();
}
}
转换流配字符数组:
import java.io.*;
public class SevenDemo1 {
public static void main(String[] args) throws Exception {
//转换流 配 字符数组
FileInputStream is = new FileInputStream("E:/Java课程实验7.txt");
FileOutputStream os = new FileOutputStream("E:/Java课程实验7-3.txt");//如果不存在会直接创建
InputStreamReader isr = new InputStreamReader(is);
OutputStreamWriter osw = new OutputStreamWriter(os);//这俩就转成了字符流
int len = 0;
char[] c = new char[1024];//
while((len = isr.read(c)) != -1) {
osw.write(c, 0, len);
}
isr.close();
osw.close();
//只需要关闭转换流即可,可以理解为关闭了转换流,就自动把传进来的参数(输入输出流)给关闭了
}
}
字符流配单个字节:
import java.io.*;
public class SevenDemo2 {
public static void main(String[] args) throws Exception {
//字符流 配 单个字节
FileReader r = new FileReader("E:/Java课程实验7-3.txt");
FileWriter w = new FileWriter("E:/Java课程实验7-4.txt");
int ch = 0;
while ((ch = r.read()) != -1) {//字符流的read方法返回值为int型
w.write(ch);//或w.write((char) ch);
}
r.close();
w.close();
}
}
字符流配字符数组:
虽然read方法的返回值是int,但是其输入的仍是字符,所以需要用字符数组来做缓冲区。
import java.io.*;
public class SevenDemo2 {
public static void main(String[] args) throws Exception {
//字符流 配 字节数组
FileReader r = new FileReader("E:/Java课程实验7-3.txt");
FileWriter w = new FileWriter("E:/Java课程实验7-5.txt");
int len = 0;
char[] c = new char[1024];
while ((len = r.read(c)) != -1) {//字符流的read方法返回值为int型
w.write(c, 0, len);
}
r.close();
w.close();
}
}
• (2)使用BufferedReader、BufferedWriter类的特殊方法进行拷贝。
import java.io.*;
public class SevenDemo3 {
public static void main(String[] args) throws Exception {
FileReader r = new FileReader("E:/Java课程实验7-5.txt");//记得加上后缀名txt
BufferedReader br = new BufferedReader(r);
FileWriter w = new FileWriter("E:/Java课程实验7-6.txt");
BufferedWriter bw = new BufferedWriter(w);
String s;
while ((s = br.readLine()) != null) {//注意L大写
bw.write(s);//可以直接输入字符串,因为write有多种重载
bw.newLine();//L大写
}
br.close();
bw.close();
}
}
经过检查,txt文件内容都符合要求
需要注意的是,这里如果不加newLine方法,则所有内容全部复制到一行中,所以当一行内容输入完成后,需要使用该方法移动到下一行继续复制。
4、
编程序实现下列功能:
• (1)向指定的txt文件中写入键盘输入的内容,然后再重新读取该文件的内容,显示到控制台上。
知识点:
next()方法读取到空白符就结束l;
nextLine()读取到回车结束也就是“\r”
注意Scanner类需要java.util.*;
且FileReader定义的先后位置并不影响结果。
import java.util.*;
import java.io.*;
public class SevenDemo1 {
public static void main(String[] args) throws Exception {
//因为以后要将写入的内容打印出来,所以使用字符流比较方便
FileWriter w = new FileWriter("E:/Java课程实验7-6.txt");//字符流就不能加true
//true表示接着之前的内容写
BufferedWriter bw = new BufferedWriter(w);
System.out.println("请向文件中输入内容:");
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();//输入一行字符串
bw.write(str);//多个重载,其中一个为传入字符串
bw.close();
//读取文件内容
FileReader r = new FileReader("E:/Java课程实验7-6.txt");
BufferedReader br = new BufferedReader(r);
String s;
System.out.println("打印文件内容如下:");
while ((s = br.readLine()) != null){//注意字节缓冲流不能使用readLine,而字符缓冲流可以
System.out.println(s);
//错误:br.newLine(); 因为只有字符缓冲输入流可以用newLine
}
br.close();
}
}
•(2) 键盘录入5个学生信息(姓名, 成绩),按照成绩从高到低存入文本文件。
import java.util.*;
import java.io.*;
public class SevenDemo2 {
public static void main(String[] args) throws Exception {
FileWriter w = new FileWriter("E:/Java课程实验7-6.txt");
BufferedWriter bw = new BufferedWriter(w);
//注意,在map集合中,泛型的哪个类型在前面,则这个类型放在Comparator的泛型中
TreeMap<Integer, String> tm = new TreeMap<Integer, String>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1 == 0 ? 1 : o2 - o1;
}
});
//输入学生信息,并按成绩降序排序
for (int i = 0; i < 5; i ++ ) {
System.out.println("请输入学生姓名:");
Scanner sc = new Scanner(System.in);
String name = sc.next();
System.out.println("请输入学生成绩:");
Scanner sc1 = new Scanner(System.in);
int score = sc.nextInt();
tm.put(score, name);
}
//将集合中的信息输入到文件中
System.out.println("输出文本内容:");
bw.write(tm.toString());
FileReader r = new FileReader("E:/Java课程实验7-6.txt");
BufferedReader br = new BufferedReader(r);
String s;
while ((s = br.readLine()) != null) {
System.out.println(s);
}
bw.close();
br.close();
}
}
可以在txt文件中看到输入的内容(已经排序完成),但是想要把文件中的内容打印到控制台却不行。 (单独输入到文件,再单独打印到控制台是可行的,但是将这两个操作写进一个程序中是不行的)