1.线程的基本状态以及状态之间的关系?
2.简述synchronized 和java.util.concurrent.locks.Lock的异同?
Lock是Java5以后引入的新的API,和关键字synchronized相比主要相同点:Lock能完成synchronized所实现所有的功能;主要不同点:Lock有比synchronized更精确的线程语义和更好的性能,而且不强制性的要求一定要获得锁。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且最好在finally块中释放(这是释放外部资源最好的地方)。
3.Java中如何实现序列化,有什么意义?
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决对象流读写操作时可能引发的问题(如果不进行序列化可能会存在数据乱序的问题)。
要实现序列化,需要让一个类实现Serializable接口,该接口是一个标识性接口,标注该类对象是可被序列化的,然后使用一个输出流来构造一个对象输出流并通过writeObject(Object)方法就可以将实现对象写出(即保存其状态);如果需要反序列化则可以用一个输入流建立对象输入流,然后通过readObject方法从流中读取对象。序列化除了能够实现对象的持久化之外,还能够用于对象的深度克隆。
4.Java中有几种类型的流?
字节流和字符流。字节流继承于InputStream、OutputStream,字符流继承于Reader、Write。在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。关于Java的I/O需要注意的有两点:一是两种对称性(输入和输出的对称性,字节和字符的对称性);二是两种设计模式(适配器模式和装潢模式)。另外Java中的流不同于C#的是它只有一个维度一个方向。
package com.test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public final class MyUtil {
private MyUtil(){
throw new AssertionError();
}
public static void fileCopy(String source, String target) throws IOException{
try(InputStream in = new FileInputStream(source)){
try(OutputStream out = new FileOutputStream(target)){
byte[] buffer = new byte[4096];
int bytesToRead;
while(((bytesToRead = in.read(buffer))!=-1)){
out.write(buffer,0,bytesToRead);
}
}
}
}
public static void fileCopyNIO(String source, String target) throws IOException{
try(FileInputStream in = new FileInputStream(source)){
try(FileOutputStream out = new FileOutputStream(target)){
FileChannel inChannel = in.getChannel();
FileChannel outChannel = out.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(4096);
while(inChannel.read(buffer)!=-1){
buffer.flip();
outChannel.write(buffer);
buffer.clear();
}
}
}
}
}
5.写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数。
答:代码如下:
package com.file;
import java.io.BufferedReader;
import java.io.FileReader;
public class MyUtil {
private MyUtil(){
throw new AssertionError();
}
public static int countWordInFile(String filename, String word){
int count = 0;
try(FileReader fr = new FileReader(filename)){
try(BufferedReader br = new BufferedReader(fr)){
String line = null;
while((line = br.readLine()) != null){
int index = -1;
while(line.length() >= word.length() && (index = line.indexOf(word)) >= 0){
count++;
line = line.substring(index + word.length());
}
}
}
}catch(Exception e){
e.printStackTrace();
}
return count;
}
}
6.如何用Java代码列出一个目录下所有的文件?
答:
如果只要求列出当前文件夹下的文件,代码如下所示:
package com.file;
import java.io.File;
public class Test {
public static void main(String[] args) {
File f = new File("/Users/Hao/Downloads");
for(File temp : f.listFiles()){
if(temp.isFile()){
System.out.println(temp.getName());
}
}
}
}
如果需要对文件夹继续展开,代码如下所示: