学习笔记11-第十二章 输入输出流及文件处理
用书参考:孙连英,刘畅,彭涛所著的Java面向对象程序设计。
我的所有代码你都可以通过GitHub获取,
以下为我的GitHub地址:[[[https://github.com/MrNeoJeep/java-code.git]]]
文章目录
(1)利用输入及输出流及文件类编写一个程序,实现在屏幕显示文本文件的功能。要求显示文本的内容、文件名,路径,大小等。
代码
package demo.USTS.chapter12;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
public class Text12_1 {
public static void main(String[] args) {
/*利用输入及输出流及文件类编写一个程序,实现在屏幕显示文本文件的功能。
* 要求显示文本的内容、文件名,路径,大小等。
*/
FileRead f1 = new FileRead();
f1.getData();
}
}
class FileRead
{
public void getData()
{
try {
String ch = null;
//String encoding = "utf-8";
File fc = new File("C:\\Users\\风\\Desktop\\test\\a.txt");
InputStreamReader read = new InputStreamReader(new FileInputStream(fc), "utf-8");
BufferedReader bufferedReader = new BufferedReader(read);
while((ch = bufferedReader.readLine()) != null)
{
System.out.println(ch);
}
System.out.println("文件名:"+fc.getName());
System.out.println("绝对路径:"+fc.getAbsolutePath());
System.out.println("大小:"+fc.length());
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果
(2)设计一个通讯录,保存用户信息
设计一个通讯录,保存用户信息。通讯录中除了包括基本信息外,还要实现简单的检索功能。
通讯录写入文件,程序执行时需要从文件中导入数据,程序退出后再将数据保存到文件中。第一次执行时新创建一个文件。
代码
package demo.USTS.chapter12;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class Text12_2 {
public static void main(String[] args) {
/*设计一个通讯录,保存用户信息。通讯录中除了包括基本信息外,还要实现简单的检索功能。
* 通讯录写入文件,程序执行时需要从文件中导入数据,程序退出后再将数据保存到文件中。第一次执行时新创建一个文件。
*
*/
realizeBook testBook = new realizeBook();
testBook.test();
addressBook person = testBook.findByName("Tim",testBook.addrBooks);
System.out.println("name = "+person.getM_name());
System.out.println("number = "+person.getM_number());
System.out.println("addr = "+person.getM_address());
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
addressBook person1 = testBook.findByNum("15861563443",testBook.addrBooks);
System.out.println("name = "+person1.getM_name());
System.out.println("number = "+person1.getM_number());
System.out.println("addr = "+person1.getM_address());
}
}
//测试类
class realizeBook
{
List<addressBook> addrBooks = new ArrayList<addressBook>();
public void test()
{
addressBook person1 = new addressBook("TOM", "13761536843", "北京");
addressBook person2 = new addressBook("Tim", "18761567843", "上海");
addressBook person3 = new addressBook("kitti", "13961567843", "广州");
addressBook person4 = new addressBook("Mili", "15861563443", "深圳");
//数组保存联系人的信息
addrBooks.add(person1);
addrBooks.add(person2);
addrBooks.add(person3);
addrBooks.add(person4);
try {
FileOutputStream fos = new FileOutputStream("C:\\Users\\风\\Desktop\\test\\result.txt");
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(person1);
os.writeObject(person2);
os.writeObject(person3);
os.writeObject(person4);
os.close();
} catch (Exception e) {
System.out.println(e);
}
//读入数据
FileInputStream fis = null;
person1 = null;
person2 = null;
person3 = null;
person4 = null;
try {
try {
fis = new FileInputStream("C:\\Users\\风\\Desktop\\test\\result.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
ObjectInputStream oS = new ObjectInputStream(fis);
person1 = (addressBook)oS.readObject();
person2 = (addressBook)oS.readObject();
person3 = (addressBook)oS.readObject();
person4 = (addressBook)oS.readObject();
oS.close();
} catch (ClassNotFoundException e) {
System.out.println(e);
System.exit(-2);
}
catch (IOException e) {
e.printStackTrace();
}
System.out.println("name = "+person1.getM_name());
System.out.println("number = "+person1.getM_number());
System.out.println("addr = "+person1.getM_address());
System.out.println("name = "+person2.getM_name());
System.out.println("number = "+person2.getM_number());
System.out.println("addr = "+person2.getM_address());
System.out.println("name = "+person3.getM_name());
System.out.println("number = "+person3.getM_number());
System.out.println("addr = "+person3.getM_address());
System.out.println("name = "+person4.getM_name());
System.out.println("number = "+person4.getM_number());
System.out.println("addr = "+person4.getM_address());
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
}
public addressBook findByNum(String number,List<addressBook> addressBooks)
{
for(int i = 0; i < addressBooks.size();i++)
{
if(addressBooks.get(i).getM_number().equals(number))
{
return addressBooks.get(i);
}
}
return null;
}
public addressBook findByName(String name,List<addressBook> addrBooks2)
{
for(int i = 0; i < addrBooks2.size();i++)
{
if(addrBooks2.get(i).getM_name().equals(name))
{
return addrBooks2.get(i);//return 也是结束语句
}
}
return null;
}
}
//通讯录类
class addressBook implements Serializable
{
private String m_name;
private String m_number;
private String m_address;
public addressBook(String name,String number,String address) {
this.m_name = name;
this.m_number = number;
this.m_address = address;
}
public String getM_name() {
return m_name;
}
public void setM_name(String m_name) {
this.m_name = m_name;
}
public String getM_number() {
return m_number;
}
public void setM_number(String m_number) {
this.m_number = m_number;
}
public String getM_address() {
return m_address;
}
public void setM_address(String m_address) {
this.m_address = m_address;
}
}
运行结果
(3)理解字节流和字符流的概念
理解字节流和字符流的概念。已有.txt文件,文件中有中文字符。
使用FileInputStream和FileReader分别读取文件,并把内容显示在控制台,
比较两者的读取效率。
代码
package demo.USTS.chapter12;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
public class Text12_3 {
public static void main(String[] args) {
/*理解字节流和字符流的概念。已有.txt文件,文件中有中文字符。
* 使用FileInputStream和FileReader分别读取文件,并把内容显示在控制台,
* 比较两者的读取效率。
*/
long time1_stream = stream1();
System.out.println("\n~~~~~~~~~~~~~~~~~~");
long time2_buffer = buffer();
System.out.println("字节流耗费时间:"+time1_stream+"ms");
System.out.println("字符流耗费时间:"+time2_buffer+"ms");
}
public static long stream1()
{
long stime = System.currentTimeMillis();
FileInputStream fin;
FileOutputStream fout;
try {
int ch;
fin = new FileInputStream("C:\\Users\\风\\Desktop\\test\\a.txt");
fout = new FileOutputStream(FileDescriptor.out);
while((ch = fin.read()) != -1)
{
fout.write(ch);
}
} catch (Exception e) {
e.printStackTrace();
}
long etime = System.currentTimeMillis();
return (etime-stime);
}
public static long buffer()
{
long stime = System.currentTimeMillis();
try {
String ch = null;
//String encoding = "utf-8";
File fc = new File("C:\\Users\\风\\Desktop\\test\\a.txt");
InputStreamReader read = new InputStreamReader(new FileInputStream(fc), "utf-8");
BufferedReader bufferedReader = new BufferedReader(read);
while((ch = bufferedReader.readLine()) != null)
{
System.out.println(ch);
}
} catch (Exception e) {
e.printStackTrace();
}
long etime = System.currentTimeMillis();
return (etime-stime);
}
}
运行结果
(4)编写程序,对于给定的字符串,使用正则表达式判断该字符串是否是合法的IP地址并输出判断结果
代码
package demo.USTS.chapter12;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Text12_4 {
public static void main(String[] args) {
/*编写程序,对于给定的字符串,使用正则表达式判断该字符串是否是合法的IP地址并输出判断结果
*/
String str = "92.168.0.12";
Pattern pattern = Pattern.compile(
"^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."
+"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
+"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
+"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$");
//双斜杠是转义字符代表一个斜杠的意思
Matcher matcher = pattern.matcher(str);
System.out.println(matcher.matches());
}
}
正则表达式解析
下面给出相对应的正则表达式:
“^(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])\.”
+"(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\."
+"(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\."
+"(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)$"
上面的一个不漏就是正确的验证ip的正则表达式,简单的讲解一下
\d表示0~9的任何一个数字
{2}表示正好出现两次
[0-4]表示0~4的任何一个数字
| 的意思是或者
( )上面的括号不能少,是为了提取匹配的字符串,表达式中有几个()就表示有几个相应的匹配字符串
1\d{2}的意思就是100~199之间的任意一个数字
2[0-4]\d的意思是200~249之间的任意一个数字
25[0-5]的意思是250~255之间的任意一个数字
[1-9]\d的意思是10~99之间的任意一个数字
[1-9])的意思是1~9之间的任意一个数字
\.的意思是.点要转义(特殊字符类似,@都要加\转义)
正则表达式是真的不会QAQ,参考博客:https://blog.csdn.net/u012806692/article/details/50635590
运行结果
true
初学java,代码多有不足,如有错误,非常感谢你的指正。