今天也是学习Java的一天,由于没有做项目,就用这篇博客记录一下我今天所学的新知识。
①try()语句:
与平时的try-catch语句不同,这个try它后面接了括号,通过查阅资料发现,这种编写代码的方式叫做 try-with-resources, 这是从JDK7开始支持的技术,而这种语句最主要且明显的作用就是在IO流中,当你把流放在try()里,try,catch或者finally结束的时候,流会自动关闭,不用再调用close方法关闭流。
下面用简单的代码演示一下:
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class try_kuokao {
public static void main(String[] args) {
File file = new File("D:\\桌面\\文本文档");
try (FileWriter fw = new FileWriter(file)){
String data = "将这句话写到文本文档里面去";
char[] charArray = data.toCharArray();//将字符串转换为字符数组
fw.write(charArray);//将字符数组写入到文本文档中
}catch (IOException E){
E.printStackTrace();
}
}
}
上述代码我将字符串写入到了文本文档中,而且当我到桌面文档打开文本文档时,里面就有 " 将这句话写到文本文档里面去 "这一句话,很明显代码中我没有写什么fw.close,输出流定义try()中便自动关闭了。就不用在finally中关闭了,同时也不用担心忘记关闭了,还减少了代码量,感觉非常的有用!
tips:(如果流没有关闭流,文本文档将无法正确保存,你输出到里面的东西,你打开就是空空如也!)
②arraycopy(Object src, int srcPos, Object dest, int destPos, int length)方法:
这个方法是在看别人写的代码当中,发现他调用的这样一个方法,刚开始我是看不懂的,一个方法里面竟然有如此多的参数,于是我到API文档中查询,结果如下:
这是在Java.lang包下System类的一个方法,对此方法的描述是说:从指定的源数组中的指定位置开始,将数组复制到目标数组的指定位置。
简单来说就是实现复制数组这一次操作。于是我想试着自己用一下这个方法,我先创建了好了俩个文件,一个文件中有内容一个没有,然后试着用这个方法将一个源文件的内容复制到另一个目标文件当中,代码如下,当中我做好了注释:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ArrayCopy {
public static void main(String[] args) throws IOException {
File srcFile = new File("D:\\桌面\\IDEA实验室\\1.txt");
File destFile = new File("D:\\桌面\\IDEA实验室\\2.txt");
byte[] a = new byte[(int) srcFile.length()];//创建一个数组,长度为目标文件长度
FileInputStream fis = new FileInputStream(srcFile);
fis.read(a);//读取文件内容到数组a中
fis.close();
byte[] b = new byte[1024];//创建另一个数组,长度为1024字节
System.arraycopy(a, 0, b, 0, (int) srcFile.length());
//调用该方法,从a数组0位置开始,复制到b数组中,也是0位置,复制的元素数量即为 (int) srcFile.length()个。
FileOutputStream fos = new FileOutputStream(destFile);
fos.write(b);//把b数组内容写入到目标文件
fos.close();
}
}
结果目标文件中出现了和源文件中一样的内容,即表示复制成功了。值得思考的是,这样的复制方法,和一般的只创建一个数组来读写就可以复制到另一个文件的方法,有什么优点呢,显而易见,前者方法复制的内容是具有可控性的,可以通过自定义源数组和目标数组的起始位置来操控要复制的内容。
而后者的实现代码更简单无需调用前者的arraycopy方法,但是复制内容是源文件的全部内容,不具有较强的可控性。
③copyOfRange(byte[] original, int from, int to)方法:
同样的,在学拆分文件时,学会了该方法,我通过API文档查询,查询结果如图:
这是Java.util包下的Arrays类下的一个方法,文档对此方法的描述为:
将指定数组的指定范围复制到新数组中。
这样的描述我感觉和上面的arraycopy方法简直如出一辙,我是比较兴奋的对于这一发现,都是复制数组,都是指定范围,虽然类似,但肯定是有区别的,我便试着去用一下这个方法去感受他们之间的区别。
同样还是创建俩个文件,以数组为中介,将一个文件的内容复制到另一个数组中,看看能否实现。代码如下:
import java.io.*;
import java.util.Arrays;
public class copyRange {
public static void main(String[] args) throws IOException {
File srcfile = new File("D:\\桌面\\IDEA实验室\\1.txt");
File desfile = new File("D:\\桌面\\IDEA实验室\\2.txt");
byte[] a = new byte[(int) srcfile.length()];//创建一个数组
FileInputStream fis = new FileInputStream(srcfile);
fis.read(a);
fis.close();
byte[] b ;
b = Arrays.copyOfRange(a,0,a.length);//调用此方法,返回了一个新的数组给b
FileOutputStream fos = new FileOutputStream(desfile);
fos.write(b);
fos.close();
}
}
结果并不意外,另一个文件当中出现了该源文件的内容,说明复制成功了,而且如果要定义复制范围是通过该方法的后面俩个参数去定义,其实到这里就已经可以看出区别了,我们观察,这后面俩个参数都是对源数组的范围定义的,也就是可以定义源数组中的这样一个范围,去复制你想要复制的东西到新数组中去。
而上面的arraycopy方法,不仅可以对源数组的范围进行定义,还可以对目标数组的范围进行定义,也就是说,你可以将源数组的你想要复制的东西去复制到新数组中你想要复制到的位置去。
此外,copyOfRange方法是具有返回值的,它返回的是一个新的数组,包含指定范围的元素。
而arraycopy方法是没有返回值的,所以是在俩个已有的数组中进行复制操作。
简单来讲:copyOfRange方法常用于创建一个新的数组,并将源数组中的指定范围复制到新数组。arraycopy方法常用在俩个已经创建好的数组之间进行复制元素的操作。
tips:当然copyOfRange方法当中的参数不仅仅只有字节(byte)类型数组,还有字符类型,布尔类型,整数类型,浮点数类型等等,API文档中搜索如下:
比如参数字符类型数组,那代码中的输入输出流就应该要是字符流了,代码演示如下:
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
public class copyOfRange_char {
public static void main(String[] args) throws IOException {
File srcfile = new File("D:\\桌面\\IDEA实验室\\1.txt");
File desfile = new File("D:\\桌面\\IDEA实验室\\2.txt");
char[] a = new char[(int) srcfile.length()];
FileReader fr = new FileReader(srcfile);
fr.read(a);
fr.close();
char[] b;
b = Arrays.copyOfRange(a,0,a.length);
FileWriter fw = new FileWriter(desfile);
fw.write(b);
fw.close();
}
}