学习笔记11从零开始学java-第十二章课后习题

学习笔记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,代码多有不足,如有错误,非常感谢你的指正。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值