Java学习笔记-14

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());
			}
		}
	}
}

如果需要对文件夹继续展开,代码如下所示:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值