文件过滤器:
dir.list(过滤器);把符合条件的过滤出来。
写法:
String[] arr = dir.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
//System.out.println(dir);
//System.out.println(name);
File file = new File(dir, name);
return file.isFile() && file.getName().endsWith(".jpg");
}
});
File 类,是一个路径。这个路径可以表示文件或者文件夹。我们通过这个File类对这个路径进行判断或者获取相应的
信息
如果这个路径是一个文件,那么对文件的内部内容是不做任何操作的。
按操作类型分为两种:
* 字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是
以字节的形式存储的
* InputStream (抽象父类)
FileInputStream 字节输入流
* OutputStream(抽象父类)
FileOutputStream 字节输出流
* 字符流 : 字符流只能操作纯字符数据,比较方便。
* Reader(抽象父类)
* Writer(抽象父类)
read()方法返回值为什么是int而不是byte?
其实就是因为byte取值范围只有256种,太过于短小,读图片音频等文
件时读到1111 1111,就自动停止了。
小数组的读写和带Buffered的读取哪个更快?
* 定义小数组如果是8192个字节大小和Buffered比较的话
* 定义小数组会略胜一筹,因为读和写操作的是同一个数组
* 而Buffered操作的是两个数组
flush和close方法的区别:
flush()方法 //相当于office中的保存
用来刷新缓冲区的,刷新后可以再次写出
close()方法 //相当于office中的保存并退出
用来关闭流释放资源的的,如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再
关闭流之前刷新缓冲区,关闭后不能再写出
字节流读取中文的问题
字节流在读中文的时候有可能会读到半个中文,造成乱码
字节流写出中文的问题
字节流直接操作的字节,所以写出中文必须将字符串转换成字节数组
写出回车换行 write("\r\n".getBytes());
FileReader 字符输入流
* 字符流是可以直接读写字符的IO流
* 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写出
.
* FileReader类的read()方法可以按照字符大小读取
//按照相应的码表去读,如果遇到中文,就一次读一个字符。
不同的字符在不同的码表中所占的字节是不同的。
ASCII码:
一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。
一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进
制。最小值0,最大值255。如一个ASCII码就是一个字节。
UTF-8编码:
一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。
Unicode编码:
一个英文等于两个字节,一个中文(含繁体)等于两个字节。
符号:
英文标点占一个字节,中文标点占两个字节。举例:英文句号“.”占1个字节的大小,中文句号“
。”占2个字节的大小。
什么情况下使用字符流:
* 字符流也可以拷贝文本文件, 但不推荐使用. 因为读取时会把字节转为字符, 写出时还要把字符
转回字节.
* 程序需要读取一段文本, 或者需要写出一段文本的时候可以使用字符流
* 读取的时候是按照字符的大小读取的,不会出现半个中文,//遇到中文读一个字符,所以不会出现
半个中文
* 写出的时候可以直接将字符串写出,不用转换为字节数组
字符流是否可以拷贝非纯文本的文件
* 不可以拷贝非纯文本的文件
* 因为在读的时候会将字节转换为字符,在转换过程中,可能找不到对应的字符,就会用?代替,写出
的时候会将字符转换成字节写出去
* 如果是?,直接写出,这样写出之后的文件就乱了,看不了了
//不是文字就不要用字符流
BufferedReader 和 BufferedWriter 的特有方法readLine()和newLine()方法:
LineNumberReader:
BufferedReader的子类, 具有相同的功能, 并且可以统计行号。
* setLineNumber(100)方法可以设置当前行号//行号从101开始计算
* getLineNumber()方法可以获取当前行号
序列流:了解//读取多个文件,往同一个文件里写时使用
把多个字节输入流整合成一个, 从序列流中读取数据时, 将从被整合的第一个流开始读, 读完一个之后继续
读第二个, 以此类推
//按顺序读取整合的字节输入流
内存输出流:掌握
该输出流可以向内存中写数据, 把内存当作一个缓冲区, 写出之后可以一次性获取出所有数据
//不是读一个显示一个,要一下子全都显示出来的情况下使用。比如QQ聊天
//把数据都先写到内存中,然后一下子全都显示出来
随机访问流概述和读写数据 了解
//用于多线程下载 raf.seek(0); //在指定位置设置指针
ObjectOutputStream 对象操作流 了解
//该流可以将一个对象写出,执行了序列化的操作.
*序列化:将对象写出到文件
ObjectInputStream 对象操作流 了解
//该对象可以读取一个对象到程序中,执行了反序列化的操作。
*反序列化:将文件中的字节数据翻译成对象
打印流的概述和特点 掌握
该流可以很方便的将对象的toString()结果输出, 并且自动加上换行, 而且可以使用自动刷出的模
式
PrintStream//打印字节流
PrintWriter//打印字符流
System.out就是一个PrintStream, 其默认向控制台输出信息
标准输入输出流概述和输出语句
* System.in是InputStream, 标准输入流, 默认可以从键盘输入读取字节数据
* System.out是PrintStream, 标准输出流, 默认可以向Console中输出字符和字节数据
//以上两个流,如果不关联文件就不需要关闭
JVM启动至少启动了垃圾回收线程和主线程,所以是多线程的。
多线程程序实现的方式
两种方式的区别:
* a.继承Thread : 由于子类重写了Thread类的run(), 当调用start()时, 直接找子类的run()方
法
* b.实现Runnable : 构造函数中传入了Runnable的引用, 成员变量记住了它, start()调用run
()方法时内部判断成员变量Runnable的引用是否为空,
不为空编译时看的是Runnable的run(),运行时执行
的是子类的run()方法
* 继承Thread
* 好处是:可以直接使用Thread类中的方法,代码简单
* 弊端是:如果已经有了父类,就不能用这种方法
* 实现Runnable接口
* 好处是:即使自己定义的线程类有了父类也没关系,因为有了父类也可以实现接口,而且
接口是可以多实现的
* 弊端是:不能直接使用Thread中的方法需要先获取到线程对象后,才能得到Thread的方
法,代码复杂
获取名字和设置名字:
设置名字的两种方式
setDaemon() 守护线程 不单独执行, 当其他非守护线程都执行结束后, 自动退出
join()加入线程, 当前线程暂停, 等待指定的线程执行结束后, 当前线程再继续
join(int), 可以等待指定的毫秒之后继续
yield 让出cpu 礼让线程//效果不明显,了解
setPriority()设置线程的优先级//效果不明显,了解
范围1-10;越大,执行的几率越多。也是几率问题,不能保证完全。也就是成功率99%也有可能爆掉装备。
同步代码块
* 使用synchronized关键字加上一个锁对象来定义一段代码, 这就叫同步代码块
* 多个同步代码块如果使用相同的锁对象, 那么他们就是同步的
锁对象是任意的,但是不能是匿名对象。
同步方法
使用synchronized关键字修饰一个方法, 该方法中所有的代码都是同步的
使用继承Thread实现多线程时,如果使用类中的成员变量做为锁对象,那么该成员变量必须是静态的
非静态的同步方法的锁对象是 this.
静态的同步方法的锁对象是该类的字节码对象 xxxxx.class
//锁对象不能用匿名对象,因为匿名对象不是同一个对象
死锁:
多线程同步的时候, 如果同步代码嵌套, 使用相同锁, 就有可能出现死锁
单例设计模式
饿汉式和懒汉式的区别
* 1,饿汉式是空间换时间,懒汉式是时间换空间
* 2,在多线程访问时,饿汉式不会创建多个对象,而懒汉式有可能会创建多个对象
两个线程间的通信
等待唤醒机制
wait(); 当前线程等待
this.notify(); //随机唤醒单个等待的线程
//if语句是在哪里等待,就在哪里起来
//while循环是循环判断,每次都会判断标记
notifyAll();//唤醒所有等待的线程
* 1,在同步代码块中,用哪个对象锁,就用哪个对象调用wait方法
* 2,为什么wait方法和notify方法定义在Object这类中?
* 因为锁对象可以是任意对象,Object是所有的类的基类,所以wait方法和notify方法需要定义在Object这个类
中
* 3,sleep方法和wait方法的区别?
* a,sleep方法必须传入参数,参数就是时间,时间到了自动醒来
* wait方法可以传入参数也可以不传入参数,传入参数就是在参数的时间结束后等待,不传入参数就是直接等待
* b,sleep方法在同步函数或同步代码块中,不释放锁,睡着了也抱着锁睡
* wait方法在同步函数或者同步代码块中,释放锁
线程的五种状态
新建,就绪,运行,阻塞,死亡
网络编程,套接字编程,Socket编程
.网络编程的三要素?
(1)IP地址 :每个设备在网络中的唯一标识
(2)端口号 :每个程序在设备上的唯一标识,每个网络程序都需要绑定一个端口号 范围从0-65535,
1024以下的基本上都被系统程序占用了
tomcat: 8080
(3)协议 UDP TCP
.UDP和TCP的区别?
UDP:面向无连接,数据不安全,速度快。不区分客户端与服务端。
把数据打包,数据有限制不超过64K,面向无连接,不安全,速度快
举例:蓝牙,QQ单聊,打电话。
TCP:面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。
三次握手: 客户端先向服务端发起请求, 服务端响应请求, 传输数据
建立连接通道,无限制,面向连接,(三次握手),速度慢,安全
举例:飞秋群聊,不保证消息一定收到
发短信
掌握 Socket通信原理图解
这是我总结的面试题 |