实现对文件进行读写
- 使用PrintWriter对文件进行写操作
- 使用Scanner对文件进行读操作
- 使用缓冲设计对文件进行读写操作
使用PrintWriter对文件进行写操作
java.io.PrintWriter类可用来创建一个文件并向文件中写入数据,首先必须先为文件创建一个PrintWriter对象。
File file = new File("text.java");
PrintWriter put = new PrintWriter(file);
调用Printwriter的构造方法,如果文件不存在,则会在当前目录下创建一个新文件。如果文件已经存在,那么文件中的当前内容将在不与用户确认的情况下被格式化。
注:
- 在Windows系统中目录的分割符为反斜杠(\),但是在程序语言中反斜杠是一个特殊字符(转义字符),因此在程序中应写成\\的形式。此外,也可使用斜杠(/),这样在Windows、UNIX或其他任何系统上都能够工作
- 在程序中,尽量不要直接使用绝对文件名。如果使用了像(“D:\\Users\\lenovo\\eclipse-workspace\\demo\\text.java”)
之类的文件名,那么它能在Windows上工作,但是不能在其他平台上工作,导致兼容性差。推荐使用相对文件名,例如,可以使用new File(“text.java”)为当前目录下的文件text.java创建一个File对象。
此处提到的相对文件名和绝对文件名区别如下:
- 绝对文件名(absolute file name)是由文件名和它的完整路径以及驱动器字母组成。例如,C:\book\Welcome.java是文件Welcome.java在Windows操作系统上的绝对文件名。
- 相对文件名是相对于当前工作目录的。对于相对文件名而言,完整目录被忽略。例如Welcome.java是一个相对文件名。如果当前工作目录是C:\book,绝对文件名将是C:\book\Welcome.java 。
代码如下:
import java.io.*;
import java.util.Scanner;
public class TestFile {
public static void main(String[] args) throws IOException{
// TODO 自动生成的方法存根
Scanner in = new Scanner(System.in);
File file = new File("text.java");//相对文件名
if(file.exists()) {
System.out.println("File already exists!");
//System.exit(1);//如果存在,(正常)退出该程序
}
PrintWriter put = new PrintWriter(file);
while(!in.hasNext("END")) {
/*
* 执行hasNext()时,它会先扫描缓冲区中是否有字符,有则返回true,
* 继续扫描。直到扫描为空,这时并不返回false,
* 而是将方法阻塞,等待你输入内容然后继续扫描
* 因此此处不建议使用while(in.hasNext())
*/
String str = in.nextLine();
put.println("Good morning!"); //写入内容的同时换行
put.println(str);
}
/*PrintWriter put = new PrintWriter(file);
若文件存在则直接写入(文件内容将在不与用户确认的情况下被丢弃)
若文件不存在则在当前目录下(eclipse-workspace\demo)创建新文件(text.java)*/
in.close();
put.close();
System.out.println("文件绝对路径名:"+file.getAbsolutePath());
}
}
调用PrintWriter的构造方法时可能会抛出一个I/O异常,Java强制要求编写代码来处理这类异常(即使用try{}catch{}来检测处理异常),但此处为简单起见只需在方法头声明throws IOException。
使用Scanner对文件进行读操作
Java.util.Scanner类用于从控制台读取字符串和基本类型值。为了从文件中读取内容,需为文件创建一个Scanner,如下:
File file = new File("text.java");
Scanner input = new Scanner(file);
完整代码如下:
//读文件:
File file = new File("text.java");//相对文件名
Scanner input = new Scanner(file);
while(input.hasNext()) {
String s = input.nextLine();
System.out.println(s);
}
input.close();
结果如下:
使用缓冲设计对文件进行读写操作
完整代码如下:
import java.io.*;
import java.util.Scanner;
public class Mod8_Mod9 {
public static void main(String args[]) {
try {
Scanner in = new Scanner(System.in);
File file = new File("text.txt");
BufferedWriter out = new BufferedWriter(new FileWriter(file));
//FileWriter()向文件写入数据
//out为字符缓冲输出流对象
System.out.println("输入内容:");
while(!in.hasNext("END")) {
/*
* 执行hasNext()时,它会先扫描缓冲区中是否有字符,有则返回true,
* 继续扫描。直到扫描为空,这时并不返回false,
* 而是将方法阻塞,等待你输入内容然后继续扫描。
*/
String str = in.nextLine();
//String str1 = str+"\r\n";
out.write(str);
out.newLine();//换行
//out.flush();
} //刷新缓冲流
// 手动把缓存区内容压入文件,否则直接调用.close()后会造成缓冲区未填满的数据丢失
in.close();
out.close(); //关闭输入流释放内存,同时释放文件
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println("文件内容为:");
try{
File file = new File("text.txt");
FileInputStream fis = new FileInputStream(file);
//实例化FileInputStream()对象,并直接传入已打开文件的File对象
InputStreamReader is = new InputStreamReader(fis);
//InputStreamReader用于将字节流中的字节码解码成字符
BufferedReader br = new BufferedReader(is);
//BufferedReader类从字符输入流中读取文本并缓冲字符
//以便有效地读取字符、数组和行
String txtLine = null;
while((txtLine=br.readLine())!=null){ //按行读取字符串
System.out.println(txtLine);
}
br.close();
System.out.println("路径:"+file.getAbsolutePath());
}
catch (FileNotFoundException e1) { //异常处理
System.err.println("File not found!");
}
catch(Exception e2){
e2.printStackTrace();
}
}
}
运行截图: