本课目标
会使用字符流读写文本文件
会使用字节流读写二进制文件
使用序列化和反序列化保持和恢复对象信息
一、Reader类
Reader类常用方法
- int read( )
- int read(char[] c)
- read(char[] c,int off,int len)
- void close( )
子类 InputStreamReader 常用的构造方法
- InputStreamReader(InputStream in)
- InputStreamReader(InputStream in,String charsetName)
1.FileReader 类
FileReader类是InputStreamReader的子类
- FileReader(File file)
- FileReader(String name)
该类只能按照本地平台的字符编码来读取数据,用户不能指定其他的字符编码类型
- System.out.println(System.getProperty("file.encoding")); 获得本地平台的字符编码类型
使用 FileReader 读取文件
BufferedReader类
如何提高字符流读取文本文件的效率
使用FileReader 类与BufferedReader 类
- BufferedReader类是Reader类的子类
- BufferedReader类带有缓冲区
-
按行读取内容的readLine()方法
BufferedReader常用的构造方法:BufferedReader(Reader in)
子类BufferedReader特有的方法:readLine()
使用 BufferedReader 读文本文件步骤
二、Writer 类
Writer 类常用方法
- write(String str)
- write(String str,int off,int len)
- void close()
- void flush()
子类 OutputStreamWriter 常用的构造方法
- OutputStreamWriter(OutputStream out)
- OutputStreamWriter (OutputStream out, String charsetName)
1.FileWriter 类
FileWriter 类是 OutputStreamWriter 的子类
- FileWriter (File file)
- FileWriter (String name)
该类只能按照本地平台的字符编码来写数据,用户不能指定其他的字符编码类型
使用 FileWriter 写文件
如何提高字符流写文本文件的效率:使用FileWriter类与BufferedWriter类
BufferedWriter常用的构造方法:BufferedWriter(Writer out)
使用 BufferedWriter 写文件的步骤
public class CopyPasteReplace {
public static void main(String[] args) {
FileReader fr = null;
BufferedReader br = null;
FileWriter fw = null;
BufferedWriter bw = null;
try {
fr = new FileReader("D:\\KD50\\project\\files\\pet.txt");
br = new BufferedReader(fr);
fw = new FileWriter("D:\\KD50\\project\\files\\ppet.txt");
bw = new BufferedWriter(fw);
String line;
while ( (line = br.readLine() ) != null) {
line = line.replace("替换前:","替换后:")
.replace("{name}","欧欧")
.replace("{type}","狗狗")
.replace("{master}","李伟");
bw.write(line);
}
System.out.println("复制并修改完毕");
bw.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}finally {
if (fr != null) {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fw != null) {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
三、读写二进制
DataInputStream 类
- FileInputStream的子类
- 与FileInputStream类结合使用读取二进制文件
DataOutputStream 类
- FileOutputStream 的子类
- 与 FileOutputStream 类结合使用写二进制文件
使用 DataInputStream 读二进制文件步骤
使用 DataInputStream 写二进制文件步骤
四、序列化和反序列化
1.过程
2.实现序列化的步骤
3.实现反序列化的步骤
登陆系统
public class User implements Serializable {
private String userCode;
private String userPassword;
public User(String userCode, String userPassword) {
this.userCode = userCode;
this.userPassword = userPassword;
}
public User() {
}
@Override
public String toString() {
return "User{" +
"userCode='" + userCode + '\'' +
", userPassword='" + userPassword + '\'' +
'}';
}
public String getUserCode() {
return userCode;
}
public void setUserCode(String userCode) {
this.userCode = userCode;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
}
public class Menu {
Scanner sc = new Scanner(in);
static Map<String,User> userMap;
static{
InputStream is = null;
ObjectInputStream ois = null;
try {
is = new FileInputStream("files/user/userMap.txt");
ois = new ObjectInputStream(is);
userMap = (Map<String,User>)ois.readObject();
}catch (FileNotFoundException e){
userMap = new HashMap<>();
//e.printStackTrace();
}catch (IOException e){
userMap = new HashMap<>();
//e.printStackTrace();
} catch (ClassNotFoundException e) {
userMap = new HashMap<>();
//e.printStackTrace();
} finally {
if(is != null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(ois != null){
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void register(){
System.out.print("请输入用户名:");
String userCode = sc.next();
System.out.print("请输入密码:");
String userPassword = sc.next();
User user = new User(userCode,userPassword);
userMap.put(userCode,user);
//将注册的信息序列化
oosObject();
}
public User login(){
System.out.println("***************用户登录***************");
System.out.print("请输入用户名:");
String userCode = sc.next();
System.out.print("请输入密码:");
String userPassword = sc.next();
if(!userMap.containsKey(userCode) || !userPassword.equals(userMap.get(userCode).getUserPassword())){
return null;
}
return userMap.get(userCode);
}
private void oosObject(){
//将注册的信息保存到外部文件中
ObjectOutputStream oos = null;
OutputStream os = null;
try {
os = new FileOutputStream("files/user/userMap.txt");
oos = new ObjectOutputStream(os);
oos.writeObject(userMap);
oos.flush();
}catch (IOException e){
e.printStackTrace();
}finally {
if(os != null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(oos != null){
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
public class Test {
public static void main(String[] args) {
Menu menu = new Menu();
//menu.register();
User user = menu.login();
if(user!=null){
System.out.println("登录成功,登录信息为:" + user);
}else {
System.out.println("登录失败!");
}
}
}