try(
FileInputStream fis = new FileInputStream("./IO流.java");//输入流 , 把指定文件中的数据,读取(输入)到当前文件中
FileOutputStream fos = new FileOutputStream("./新建文本文档.txt");//输出流 , 把指定的数据,输出到指定的文件中去
){
byte[] bytes = new byte[1024];//动态声明一个byte数组,且1024个字节
int tmp;//为什么用int声明?因为read(bytes);返回值是bytes这个数组中,添加元素的个数(字节数),如果达到了指定的个数(这里是1024),tmp就会为0,数组也会清空,然后依次循环,且 当读取到最后一位的时候,返回值为-1
while((tmp = fis.read(bytes)) != -1){//这是判断语句,当输入流指定的文件中,读取到最后一位的时候,就会返回-1,然后这个tmp != -1 判断语句 就为false 就不在循环了
fos.write(bytes,0,tmp);//将bytes数组,从下标为0开始,输出tmp个,(tmp就代表是数组里面已添加的字节个数)
}
fos.flush();//磕两下,往输出流指定的文件中添加东西,都要磕两下
}catch(Exception e){//捕捉异常
e.printStackTrace();//对异常进行打印追踪栈帧
}
try(
FileReader fr = new FileReader("./IO流.java");//字符输入流 指定文件
FileWriter fw = new FileWriter("./新建文本文档.txt");//字符输出流 指定文件
){
char[] chars = new char[512];//这里是char类型的数组,因为纯字符流复制,就是纯文本,一个汉字就是一个字符,就是两个字节,就是16位,所以这里用的是char字符型数组
int tmp = 0;//和上面一样,这里为什么要用int声明?
while(-1 != (tmp = fr.read(chars))){//遍历循环 将输出流指定的文件中的内容,先复制到char数组,
fw.write(chars,0,tmp);//把数组的内容,复制到输出流指定的文件中,并清空数组
}
fw.flush();//磕两下 输出流的方法
}catch(Exception e){//捕捉异常
e.printStackTrace();
}
BufferedReader : //字符输入缓冲流
readLine :
方法 : readLine();//一次读取一行
//返回值 : 返回该行内容的字符串,不包含任何行终止符,如果已到达流末尾(最后的,没有东西了),则返回 null
BufferedWriter : //字符输出缓冲流
newLine :
方法 : newLine();//新建一行,相当于换行符,
try(
BufferedReader br = new BufferedReader(new FileReader("./IO流.java"));//字符输入流的缓冲流
BufferedWriter bw = new BufferedWriter(new FileWriter("./新建文本文档.txt"));//字符输出流的缓冲流
){
String tmp = null;//为什么用String?因为里面都是字符串,读取一行,是以字符串的形式 ,所以要用String
int count = 0;//这里现在是判断作用,用于添加换行符(下面)
while(true){//while循环,如果不,判断语句是true 如果不终止,就是死循环把
count++;
tmp = br.readLine();//读取字符输入流指定文件的一行,并赋值给tmp
if (tmp == null) {//判断,如果tmp==null 就执行一下语句 当readLine()方法,读取到文件尾端的时候,读取完成,就返回null,所以,当读取完成后就要终止循环
break;//终止循环
}
//另起一行开始写,就是一个符号,在两行之间,显示的是换行
if (count > 1) {//这是判断,除了第一行,别的我们都需要换行,这里就是判断,如果大于1 那就是第二行,和以下行了,就需要换行
bw.newLine();//换行符,是在行首
}
bw.write(tmp);//添加(复制)到输出流指定的文件中,(一次是一行),然后数组清空
}
bw.flush();//添加(复制)完,就要磕两下
}catch(Exception e){//捕捉异常
e.printStackTrace();//处理异常(打印追踪栈帧)
}