23)不可变对象:创建后对象的(状态/值)不能被更改。其内在的成员变量也不能修改。包括八个基本类别的包装类、String、BigInteger和BigDecimal等。
24)不可变对象也是传指针。由于不可变(值对象不再修改,或者说是指针指向的值不能修改),临时变量指向新内存(因为值对象不可修改,所以要申请新的空间,把指针指向它)。
25)不可变对象的要求:
- 1.所有熟悉final和private。
- 2.不提供setter方法。
- 3.类是final的,或者所有的方法都是final。
- 4.类中包含mutable对象,那么返回拷贝需要深度clone。
26)不可变对象优点:线程安全,提高性能,可重用。缺点:浪费空间。(每次对不可变对象进行修改都会开辟新空间,旧对象搁置直到垃圾回收)
27)用StringBuffer(同步/线程安全/修改快速)和StringBuilder(不同步/线程不安全/修改更快速)类的append方法修改String,不产生空间浪费。
28)java.io包:
节点类字节{InputStream,OutputStream} 字符{Reader,Writer}
转换类: {InputSteamReader} 文件读取时字节,转化为java能理解的字符 {OutputSteamWriter} Java将字符转化为字节输入到文件中
装饰类:{DataInputSteam、DataOutputStream}封装数据流
{BufferedInputStream、BufferOutputStream}缓存字节流
{BufferedReader、BufferedWriter}缓存字符流
文本文件读写
//写文件1:BufferedWriter(OutputStreamWriter(FileOutputStream))
public static void WriteFile(){
FileOutputStream fos = null;
OutputStreamWriter osw = null;
BufferedWriter bw = null;
try{
fos = new FileOutputStream("c:/a.txt");//节点类
osw = new OutputStreamWriter(fos,"UTF-8");//转化类
bw = new BufferedWriter(osw);//装饰类
//或者可以 br = new BufferedWriter(new OutputStreamWriter(new
//FileOutputStream("c:/a.txt")));
bw.write("内容"); //关闭时只需要关闭bw.close,因为bw在最外层
bw.newLine();
}catch(Exception ex){
ex.printStackTrace();
}finally{
try{
bw.close();
}catch (Exception ex){
ex.printStackTrace();
}
}
}
//写文件2:使用try-resource
public static void WriteFile(){
try(BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("c:/a.txt")))){
bw.write("内容");
bw.newLine();
}catch (Exception ex){
ex.printStackTrace();
}
}
//读文件1:BufferedReader(InputStreamReader(FileInputStream))
public static void ReadFile(){
FileInputStream fis = null;
InputStreamReader isr = null;
BufferedReader br = null;
try{
fis = new FileInputStream("c:/a.txt"); //节点类
isr = new InputStreamReader(fis,"UTF-8"); //转化类
br = new BufferedReader(isr); //装饰类
String line;
while((line = br.readLine()) != null){
//...
}
}
catch (Exception ex){
ex.printStackTrace();
}finally{
try{
br.close();
}catch (Exception ex){
ex.printStackTrace();
}
}
}
//读文件2:使用try-resource
public static void ReadFile(){
String line;
try(BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("c:/a.txt")))){
while((line = br.readLine()) != null){
System.out.println(line);
}
}catch (Exception ex){
ex.printStackTrace();
}
}
二进制文件读写
与文本文件读写的不同在于最外层由BufferedReader / BufferedWriter转变为了BufferedInputStream / BufferedOutputStream
//写文件 DataOutputStream(BufferedOutputStream(FileOutputStream))
public static void WriteFile(){
FileOutputStream fos = null;
BufferedOutputStream bos = null;
DataOutputStream dos = null;
try{
fos = new FileOutputStream("c:/a.dat");//节点类
bos = new BufferedOutputStream(fos);//装饰类
dos = DataOutputStream(bos);//装饰类
dos.writeUTF("a");
}catch(Exception ex){
ex.printStackTrace();
}finally{
try{
dos.close();
}catch (Exception ex){
ex.printStackTrace();
}
}
}
//读文件 try-resource
//DataInputStream(BufferedInputStream(FileInputStream))
public static void ReadFile(){
try(DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream("c:/a.dat")))){
String a,b;
int c,d;
a = dis.readUTF();
b = dis.readInt();
c = dis.readInt();
d = dis.readUFT();
System.out.println("a:"+a);
System.out.println("c:"+c);
System.out.println("d:"+d);
System.out.println("b:"+b);
}
}catch (Exception ex){
ex.printStackTrace();
}
}
压缩:1.打开输出Zip文件 2.添加一个ZipEntry 3.打开一个输入文件,读数据,向ZipEntry写数据,关闭输入文件。 4.重复以上两个步骤,写入多个文件到zip文件中。 5.关闭Zip文件。
//单个压缩
public class SingleFileZip{
public static void main(String args[]) throws Exception{
File file = new File("c:/temp/abc.txt"); //定义要压缩的文件
File zipFile = new File("c:/temp/single2.zip"); //定义压缩文件的名称
InputStream input = new FileInputStream(file); //定义文件输入流
ZipOutputStream zipOut = null; //声明压缩流的对象
zipOut = new ZipOutputStream(new FileOutputStream(zipFile));
zipOut.putNextEntry(new ZipEntry(file.getName())); //设置ZipEntry对象
zipOut.setComment("single file zip"); //设置注释
//压缩过程
int temp = 0;
while((temp=input.read())!=-1){ //读取内容
zipOut.write(temp); //压缩输出
}
input.close(); //关闭输入流
zipOut.close(); //关闭输出流
System.out.println("single file zip done.");
}
//把单个文件改成多个文件压缩
int temp = 0 ;
if(file.isDirectory()){ //判断是否是文件夹
File lists[] = file.listFiles() ; //列出全部子文件
for(int i=0;i<lists.length;i++){
input = new FileInputStream(lists[i]) ; //定义文件的输入流
zipOut.putNextEntry(new ZipEntry(file.getName()
+File.separator+lists[i].getName())) ; //设置ZipEntry对象
System.out.println("" + lists[i].getName());
while((temp=input.read())!=-1){ //读取内容
zipOut.write(temp) ; //压缩输出
}
input.close() ; //关闭输入流
}
}
zipOut.close() ; //关闭输出流
System.out.println("multiple file zip done.");
解压:1.打开Zip文件 2.获取下一个ZipEntry 3.新建一个目标文件,从ZipEntry读取数据,向目标文件写入数据。 4.重复以上两步骤。 5.关闭Zip文件。
public class SingleFileUnzip{
public static void main(String args[]) throws Exception{
//待解压文件, 需要从zip文件打开输入流,读取数据到java中
File zipFile = new File("c:/temp/single.zip") ;//定义压缩文件名称
ZipInputStream input = null ; // 定义压缩输入流
input = new ZipInputStream(new FileInputStream(zipFile)) ;//实例化ZIpInputStream
ZipEntry entry = input.getNextEntry() ;//得到一个压缩实体
System.out.println("压缩实体名称:" + entry.getName()) ;//获取压缩包中文件名字
//新建目标文件,需要从目标文件打开输出流,数据从java流入
File outFile = new File("c:/temp/" + entry.getName());
OutputStream out = new FileOutputStream(outFile) ;//实例化文件输出流
int temp = 0 ;
while((temp=input.read())!=-1){
out.write(temp) ;
}
input.close() ; //关闭输入流
out.close() ; //关闭输出流
System.out.println("unzip done.") ;
}
}
public class MultipleFileUnzip{
public static void main(String args[]) throws Exception{
//待解压的zip文件,需要在zip文件上构建输入流,读取数据到Java中
File file = new File("c:/temp/multiple.zip") ; //定义压缩文件名称
File outFile = null ; // 输出文件的时候要有文件夹的操作
ZipFile zipFile = new ZipFile(file) ; //实例化ZipFile对象
ZipInputStream zipInput = null ; //定义压缩输入流
//定义解压的文件名
OutputStream out = null ; //定义输出流,用于输出每一个实体内容
InputStream input = null ; //定义输入流,读取每一个ZipEntry
ZipEntry entry = null ; //每一个压缩实体
zipInput = new ZipInputStream(new FileInputStream(file)) ; //实例化ZIpInputStream
//遍历压缩包中的文件
while((entry = zipInput.getNextEntry())!=null){ //得到一个压缩实体
System.out.println("解压缩" + entry.getName() + "文件") ;
outFile = new File("c:/temp/" + entry.getName()) ; //定义输出的文件路径
if(!outFile.getParentFile().exists()){ //如果输出文件夹不存在
outFile.getParentFile().mkdirs() ;
// 创建文件夹 ,如果这里的有多级文件夹不存在,请使用mkdirs()
// 如果只是单纯的一级文件夹,使用mkdir()就好了
}
if(!outFile.exists()){ //判断输出文件是否存在
if(entry.isDirectory())
{
outFile.mkdirs();
System.out.println("create directory...");
}
else
{
outFile.createNewFile() ; //创建文件
System.out.println("create file...");
}
}
if(!entry.isDirectory())
{
input = zipFile.getInputStream(entry) ; //得到每一个实体的输入流
out = new FileOutputStream(outFile) ; //实例化文件输出流
int temp = 0 ;
while((temp=input.read())!=-1){
out.write(temp) ;
}
input.close() ; //关闭输入流
out.close() ; //关闭输出流
}
}
input.close() ;
}
}