File与网络编程

一、IO汇总

写法整理

字节流:以stream结尾

抽象类:OutputStream/InputStream

字节节点流:FileOutputStream/FileInputStream

字节缓冲流:BuferedOutputStream/BufferedInputStream

对象流: ObjectOutputStream/ObjectInputStream

字符流: 以Writer/Reader结尾

抽象类:Writer/Reader

字符节点流:FileWriter/FileReader

字符缓冲流:BufferedWriter/BufferedReader

字符输出流:PrintWriter

字符转换流:OutputStreamWriter/InputStreamReader

应用场景

数据量小的内容拷贝使用字节节点流,例如图片拷贝; 只是拷贝简单文本内容则使用字符节点流

读写内容较大的二进制,且需要考虑性能则使用字节缓冲流; 非二进制或读写换行则用字符缓冲流

从字节流转字符流,或需要乱码处理,则使用转换流;

读写对象内容,则使用对象流;

简单的换行打印输出,则使用输出流;

结论:常用的流–字节节点流,字节缓冲流,字符缓冲流

二、File类

概述:和IO的读写无关,File类主要获取文件或目录本身的属性信息

应用:实例化对象(传路径),然后调用常用方法

常用方法

//获取文件名,获取路径,是否可读,是否可写;是否存在;是否为文件,是否为目录;创建目录,创建文件...
//File类的常用方法:
//相对路径:相对于当前位置的路径;例如此处相对当前工程目录下的a.txt
//绝对路径:从盘符出发指定的路径
File file = new File("a.txt"); //传相对路径
System.out.println("是否可读:"+ file.canRead());
System.out.println("是否可写:"+ file.canWrite());
System.out.println("是否隐藏:"+ file.isHidden());
System.out.println("是否为文件:"+ file.isFile());
System.out.println("是否为目录:"+ file.isDirectory());
System.out.println("是否存在:"+ file.exists());
System.out.println("长度:"+ file.length());
System.out.println("获取文件名:"+ file.getName());
System.out.println("获取绝对路径:"+ file.getAbsoluteFile()); //带判断
System.out.println("获取父目录:"+file.getParentFile());
System.out.println("获取相对路径:"+ file.getPath()); 

//System.out.println("删除文件或空目录:"+ file.delete());
System.out.println("文件重命名:"+ file.renameTo(new File("b.txt")));

创建文件或目录

//案例:创建多级目录下的文件: a/b/a.txt
//分析:先获取上一级目录,判断是否存在,如果不存在则创建;才能创建子文件
File file = new File("a/b/a.txt");
File parent = file.getParentFile(); //a/b 获取父目录
if(parent!=null&&!parent.exists()) {//如果上一级目录不为null且不存在,则创建
    if(parent.mkdirs()) { //创建一级或多级目录
        System.out.println("创建目录成功~");
    }
}
if(!file.exists()) {  //如果文件不存在,则创建
    if(file.createNewFile()) {
        System.out.println("创建文件成功~");
    }
}

查找文件

//案例:遍历当前目录层下的文件和目录,并找出txt文件
//分析:调用file方法,得到数组或容器;然后循环遍历每个File对象,并判断
//判断是否为文件;是否以txt结尾
File file = new File("a"); 
/*
		File[] fs = file.listFiles();  //调方法返回容器
		for(File f:fs) { //循环遍历File对象
			//判断是否为文件;是否以txt结尾
			if(f.isFile()&&f.getName().endsWith("txt")){
				System.out.println(f);
			}
		}*/

System.out.println("-----------文件过滤器-----------");
File[] fs = file.listFiles(new FileFilter() {
    @Override
    public boolean accept(File pathname) {
        //false-过滤  true-存数组
        return pathname.isFile()&&pathname.getName().endsWith("txt");
    }
});
System.out.println(Arrays.toString(fs));

三、文件递归

public static void main(String[] args) {
    //案例:遍历当前目录层下的所有子文件和子目录,并找出txt文件
    //分析:有循环规律--递归(循环调自己-设计方法),空目录(出口)
    //此处只能用递归才能更好的完成多级遍历(递归往往就是用在文件的操作中-其他地方基本不会涉及)
    f(new File("a")); //传入的File对象应该是目录
}
private static void f(File dir) {
    File[] fs = dir.listFiles(); 
    for(File file :fs) {
        if(file.isFile()) { //如果是文件
            if(file.getName().endsWith("txt")) {
                System.out.println(file);
            }
        }else {  //如果是目录
            f(file); //递归调自己
        }
    }
}

四、Properties使用

Properties是Map集合,确切的说是Hashtable的子类,主要用于存键值对;往往key和value都存字符串。

应用场景:从配置文件中加载数据,或存储数据到配置文件

//Properties集合的使用:
Properties p = new Properties();
p.put("aa", "111");
p.put("cc", "777");
p.put("bb", "333");
System.out.println(p);

//可以将集合的数据,存储到文件中
p.store(new FileOutputStream("a.txt"), "666");  //参数2:描述内容

//将文件中的数据进行加载
Properties properties = new Properties();
properties.load(new FileInputStream("a.txt"));
Set<String> set = properties.stringPropertyNames(); //把所有key放入Set
for(String key :set) {
    System.out.println(key+":"+properties.getProperty(key));
}

五、网络编程理论

网络概念

网络:由点和线构成的网状结构

计算机网络:不同区域的计算机,通过线路连接,能够实现数据通讯和资源共享

网络编程:实现数据通讯和资源共享的具体技术

网络模型

网络模型是传输数据过程中的模型结构,由软件和硬件组成。

网络模型共有两种模型:OSI七层模型、TCP/IP四层模型

七层模型:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层

四层模型:应用层、传输层,网络层、网络接口层

结论: 上层都是软件层面,下层数据链路和物理层是硬件层面

编程三要素

网络编程三要素,在网络编程中需要用到,包括:IP,Port,协议

IP:计算机的唯一识别

IP分为IPV4和IPV6两种,IPV6是在IPV4的基础上进行扩充,所表示的ip地址更宽泛

但现在依然还是使用IPV4

分类:A~E类,网络段逐渐增加,主机段逐渐减少;常用C类网

回环地址:127.0.0.1, 代表的是当前的IP地址

DOS指令描述: ipconfig-查看ip地址 ping ip地址,测试电脑间是否能通信

Port: 通讯软件的唯一标识

端口范围:0~65535

在使用或保留的端口:0~1023

可以使用的端口:1024~65535 ; 除去几个特殊端口,例如:3306,1521,8080等

协议:在传输层的协议约定,主要包括tcp和udp协议

tcp:建立连接,安全可靠的协议,效率低——–案例:打电话

udp:无连接协议,不安全的协议,效率高——-案例:发短信

六、网络编程

INetAddress

获取IP地址的类

InetAddress net = InetAddress.getLocalHost(); //获取本地ip
System.out.println(net);

//net = InetAddress.getByName("www.baidu.com"); //根据主机或域名获取ip
//System.out.println(net);

//根据主机或域名获取所有ip
InetAddress[] nets = InetAddress.getAllByName("www.baidu.com");
System.out.println(Arrays.toString(nets));

System.out.println(net.getHostAddress()); //获取主机地址

System.out.println(net.getHostName());  //获取主机名

传输数据

在网络编程中,往往tcp编程比较常用,TCP编程也叫Socket编程,通过Socket建立连接

TCP编程通讯模型:客户端-服务器

服务器接收数据:

//实例化服务器的socket,并指定自身端口9999
ServerSocket ss = new ServerSocket(9999);
System.out.println("监听9999端口...");
Socket socket = ss.accept(); //阻塞 调用监听方法,如果简单到客户端访问,在继续往下执行
System.out.println("有一个客户端连接过来了...");

//服务器-----接收数据
InputStream is = socket.getInputStream();
byte[] b = new byte[1024];
int len = is.read(b); //读取数据
System.out.println(new String(b, 0,len)); //byte[]转String
Utils.closeAll(is,socket,ss);

客户端发送数据:

Socket socket = new Socket("127.0.0.1", 9999);
System.out.println("客户端连接成功...");

//客户端--发送数据
OutputStream os = socket.getOutputStream(); //使用socket获取输出流
os.write("xxxx777777".getBytes()); //将数据从socket中写出去
Utils.closeAll(os,socket);   //统一资源关闭,先关小的再关大的

七、总结与作业

总结

作业

1.将字节流转换为字符缓冲流,并进行换行读写内容
2.使用File,输出文件的父路径,绝对路径,文件名,长度等
3.使用File创建文件/文件夹
4.使用FileNameFilter接口完成后缀为txt文件的查找

选做(不交):
5.删除指定目录,注意,非空目录不能直接删除,需要先将文件删除后,才能删除空目录--使用递归删除

晨考

晨考:
1.什么是计算机网络? 网络编程主要完成什么功能
答:计算机网络不同区域的计算机,通过线路连接,能够实现数据通讯和资源共享。
2.网络模型的TCP/IP四层模型有哪些?
应用层、传输层,网络层、网络接口层
3.网络编程三要素是哪三个? 分别有什么含义