# JAVA 实验四:输入流和输出流
# 实验目的
- 掌握流的概念和分类。
- 掌握文件字符流和缓冲字符流
- 掌握随机读写流。
- 掌握标准输入 / 输出。
- 掌握 File 类。
# 实验内容
第一部分
编写一个 Java 源程序,其中包含编写一个包含主方法 main 的公共类(访问权限为 public 的类),主方法 main 中完成的任务是:
(1)从键盘上输入两个文件的路径名及其文件名。
(2)从键盘上输入若干学生的信息(姓名,数学成绩,计算机成绩,各项之间用空格隔开),以 finish 结束,将这些学生的信息写入第一个文件。
(3)将第一个文件作为输入流的源,找出姓 “张” 的学生,将他们的信息写入第二个文件。
提示:将输入的每一行学生的信息作为一个字符串来处理。第二部分
编写一个 Java 源程序,其中的文件读写部分使用 RandomAccessFile 类来完成,程序实现的功能如下:
编写一个包含主方法 main 的公共类(访问权限为 public 的类),主方法 main 中完成的任务是:
(1)将第一部分产生的文件中的姓名 “李善” 改为 “王山”。
(2)之后,在文件的最后继续添加新的学生信息。
(如果没有保存第一部分的文件,也可以在记事本中输入若干同学的姓名和成绩等信息作为第二部分的原文件。)
提示:
(1)用 RandomAccessFile 来对文件进行操作时,读写模式应该是 “rw”。
(2)假设有 RandomAccessFile 类的对象 raf,则
String s=raf.readLine ();
表示从文件中读取一行,将读取的内容放入字符串对象 s 中。但是,如果读入的内容有汉字时,可能会读入乱码,导致读入的内容出错。通常采用如下语句
byte [] b=s.getBytes ("ISO-8859-1");
String s1=new String(b);
进行转换,之后,用数组 b 创建的新字符串 s1 就没有乱码问题了。
(3)在改名字的程序段中,应该存取两个指针的位置,一个是读完上一行之后的文件指针的位置,另一个是读完当前行之后的文件指针的位置(想一想,为什么?)。使用 RandomAccessFile 类的对象调用 getFilePointer () 和 seek () 方法实现上述任务。
(4)向文件中添加信息时,假设从键盘上输入的学生信息存放在字符串 s 中,则 raf.write (s.getBytes ());
可以向文件写入字符串。
# 实验代码实现
# 第一部分
import java.io.*; | |
import java.util.*; | |
public class Main | |
{ | |
public static void main(String[] args) throws IOException | |
{ | |
Scanner in = new Scanner(System.in); | |
System.out.println("请输入第一个文件的路径与文件名:"); | |
File file1 = new File(in.nextLine()); | |
System.out.println("请输入第二个文件的路径与文件名:"); | |
File file2 = new File(in.nextLine()); | |
write(file1); | |
rewrite(file1,file2); | |
in.close(); | |
} | |
public static void write(File file1) throws IOException | |
{ | |
LinkedList<String> student = new LinkedList<String>(); | |
Scanner in = new Scanner(System.in); | |
System.out.println("\n第一个文件存放学生的姓名,数学成绩和计算机成绩,各项之间用空格隔开。\n请向第一个文件输入内容,以finish结束:\n"); | |
while(true) | |
{ | |
String s = in.nextLine(); | |
if(!"finish".equals(s)) | |
{ | |
student.add(s); | |
} | |
else | |
{ | |
break; | |
} | |
} | |
Iterator<String> it = student.iterator(); | |
FileOutputStream out = new FileOutputStream(file1); | |
while(it.hasNext()) | |
{ | |
byte[] b = it.next().getBytes(); | |
out.write(b); | |
out.write((int)'\n'); | |
} | |
out.close(); | |
in.close(); | |
} | |
public static void rewrite(File file1,File file2) throws IOException | |
{ | |
ArrayList<String> li = new ArrayList<String>(); | |
BufferedReader br = new BufferedReader(new FileReader(file1)); | |
BufferedWriter bw = new BufferedWriter(new FileWriter(file2)); | |
String s = new String(); | |
while((s = br.readLine())!=null) | |
{ | |
if(s.startsWith("张")) | |
{ | |
li.add(s); | |
} | |
} | |
Iterator<String> it = li.iterator(); | |
while(it.hasNext()) | |
{ | |
bw.write(it.next()); | |
bw.write('\n'); | |
} | |
bw.close(); | |
br.close(); | |
System.out.println("\n第一个文件中姓“张”的学生的信息已经存放到第二个文件,请到其存放路径查阅!"); | |
} | |
} |
# 第二部分
import java.io.*; | |
public class Main | |
{ | |
public static void main(String[] args) throws IOException | |
{ | |
InputStream input =System.in; | |
BufferedReader br=new BufferedReader(new InputStreamReader(input)); | |
System.out.println("请输入你要处理的文件:"); | |
String s=br.readLine(); | |
File file=new File(s); | |
RandomAccessFile af=new RandomAccessFile(file,"rw"); | |
int length=(int) af.length(); | |
int position=0; | |
int index=0; | |
af.seek(position); | |
while(position<length) | |
{ | |
index=(int) af.getFilePointer(); | |
String s1=af.readLine(); | |
byte[] b=s1.getBytes("ISO-8859-1"); // 防止乱码 | |
s1=new String(b); | |
if(s1.startsWith("李善")) | |
{ | |
s1="王山"+s1.substring("李善".length(),s1.length()); | |
af.seek(index); | |
af.write(s1.getBytes()); | |
} | |
position=(int) af.getFilePointer(); | |
} | |
af.close(); | |
System.out.println("文件中李善的名字已经改为王山:\n"); | |
System.out.println("可继续添加学生信息:\n"); | |
RandomAccessFile af1=new RandomAccessFile(file,"rw"); | |
af1.seek(af1.length()); | |
String s2=new String(); | |
while(!"finish".equals(s2 = br.readLine())) | |
{ | |
af1.write(("\n"+s2).getBytes()); | |
af1.seek(af1.length()); | |
} | |
af1.close(); | |
} | |
} |