——————----------------------------------------------------------------------------------------———————
前言:本次学习,学了io流,文件流。整体难度还是挺大,但是要静下心去学,应该还是没有什么问题;
一:文件流;(file类相对于io流简单不少,只需要了解几个比较常用的方法就可以了);‘
要注意的是在创建完file对象后,在括号里要添加上你要进行操作的文件的地址
1;获取文件名.getName方法,这个方法可以获取文件名;
2;判断文件是否存在.exists方法,返回T或F;可以用于判断文件是否存在,不存在在创建文件;
3;判断是否是文件.isDirectory方法,用于判断是否是文件,也是返回T或F;
4;创建文件夹,这里分两种情况,一种是.mkdir方法他是创建一个单级目录,另外一种是.mkdirs方法他是创建一个多级目录,需要区分;
二;io流(个人感觉io流比较抽象,也很容易搞混,需要注意的是io流要先搞清输入和输出的作用以及字符流,字节流的差别才更好理解;)
1:字符输出流;(用于读取一些文件里的数据比较合适),可以分为两类必将常用的
FileWriter:简单来说就是利用代码将数据写入文件之中;
1:先创建一个FileWriter对象,在括号里加上你要操作的文件地址;
因为,后续需要关闭操作,节省资源,并且需要一个try catch抛出错误:
FileWriter fileWriter=null; try { //先创建一个字符流输出对象 fileWriter=new FileWriter("D:\\JAVApro\\io\\2.txt"); fileWriter.write("james"); //这边需要对fileWriter进行一个刷新操作,这样才能打印出数据; // fileWriter.flush();需要注意的是如果加上了close就可以不用进行文件刷新就可以直接打印出数据; } catch (IOException e) { e.printStackTrace(); } //这里因为需要关闭操作,否则会一直占用文件资源; finally { try { fileWriter.close(); } catch (IOException e) { e.printStackTrace(); }
还有一种输入方法,除了需要输入你要的字符串,还要输入一个偏移量(就是从第几个字符开始读取值),最后输入一个你需要的长度;
fileWriter.write("asdfg",2,3);
这边还有一个更加高效的输出流叫做Bufferedwriter;它更高效,体现在有一个缓冲区,当数据满了时才会统一输出;
这边需要注意的是,在传入地址时,首先要传入一个writer对象才行,可以new FileWriter对象,再将路径传入进去就行;
方法与FileWriter方法差不多,多了一个换行的功能;
BufferedWriter writer=null; try { //因为这里需要传入的是一个Writer对象,因为FileWriter和BufferedWriter是同一种Writer类型; writer=new BufferedWriter(new FileWriter("D:\\JAVApro\\io\\2.txt")); writer.write("abcdef",3,3); //这里进行一个换行操作; writer.newLine(); writer.write("zxcvb",2,2); } catch (IOException e) { e.printStackTrace(); }finally { try { writer.close(); } catch (IOException e) { e.printStackTrace(); }
2,字符输入流;(通俗来说就是读取文件里的数据,通过代码来实现);
2.1FileReader;前面两个步骤与输出流一样,都是先创建一个对象,然后先赋空值,便于最后将系统关闭,这边读取时,要先设置一个为-1的变量(当数据为空时返回的是-1),用于当作循环条件,这里不设置变量的话,他在读取时会读取一个覆盖一个,无法实现效果;在打印出结果时,必须要进行一个强制转换,这样才能输出想要的字符要不然默认是ASCLL码;
FileReader reader = null; try { //先创建一个字符流输入对象 reader = new FileReader("D:\\JAVApro\\io\\2.txt"); //这边使用一个int数组并赋初值-1;因为在没有数据时输出的是-1,这样就可以当作循环的条件 int num=-1;//这边如果没有用一个变量来接受的话,他就会打印一个覆盖一个,达不到需要的效果; while ((num=reader.read())!=-1){ //这边进行一个强制转换将ASCILL码转换为字符类型就可以输出想要的结果; System.out.println((char) num); } // fileWriter.flush();需要注意的是如果加上了close就可以不用进行文件刷新就可以直接打印出数据; } catch (IOException e) { e.printStackTrace(); } //这里因为需要关闭操作,否则会一直占用文件资源; finally { try { reader.close(); } catch (IOException e) { e.printStackTrace(); }
这边还有一种利用循环读取字符数组的方法,需要注意的是最后得通过new String构造器将字符数组转换为字符串:
FileReader fileReader=null; try { fileReader=new FileReader("D:\\JAVApro\\io\\2.txt"); //这边需要一个参数用于接收,才能起到不被覆盖的效果 int num; //设定一个数组,用于存放数据 char[] c=new char[3]; //使用一个while循环,以不等于空数据为-1,作为循环退出的条件,将数组c放在read里读出 while ((num=fileReader.read(c))!=-1){ //这边直接使用一个String构造器然后就可以输出你需要的数组效果,因为已经包含了.read方法就不要在使用 System.out.println(new String(c,0,num)); } } catch (FileNotFoundException e) { e.printStackTrace();
同样这边也有一个更为高效的方法BufferedReader,高效点在于可以整行读取数据;
这边需要注意的是,在传入地址时,首先要传入一个Reader对象才行,可以new FileReader对象,再将路径传入进去就行;
try { BufferedReader reader=new BufferedReader(new FileReader("D:\\JAVApro\\io\\2.txt")); //定义一个字符串来接受方法的变量 String str=null; //高效点在于就是能读取一整行的数据 while ((str=reader.readLine())!=null){ System.out.println(str); } } catch (FileNotFoundException e) { e.printStackTrace(); }
二:字节流(用于一些音频,图片比较适合)与字符流最大的不同在于,前者通过字符数组实现
而后者是通过字节数组来实现功能;
1;高效输出流 :BufferedOutputStream
方法和前面的高效字符流的方法差不多;只是需要注意的是要传入的是字节数组;
2;高效输入流:BufferedInputStream
最后也是需要通过一个new String构造器将字节数组强制转换为字节串;
一个通过字节流复制文件的例子;
BufferedOutputStream bufferedOutputStream=null; BufferedInputStream bufferedInputStream=null; try {// //高效输出流 bufferedOutputStream=new BufferedOutputStream //创建一个新的文件,将要复制的文件放到这个文件里 (new FileOutputStream("D:\\JAVApro\\io\\湖人总冠军\\3.txt")); //高效输入流 bufferedInputStream=new BufferedInputStream //放要复制的文件 (new FileInputStream("D:\\JAVApro\\io\\湖人总冠军\\2.txt")); //创建一个字节型的数组,并在里面放入复制文件的字节大小,1kb=1024字节; byte[] bytes=new byte[1024]; int num=-1; //使用循环打出需要复制的数据 while ((num=bufferedInputStream.read(bytes))!=-1){ //这边输出要复制的数据的格式 bufferedOutputStream.write(bytes,0,num); } } catch (FileNotFoundException e) { e.printStackTrace(); }finally { //进行一个判断,看输入和输出是否为空值,如果不为空值,证明已经被调用,可以关闭系统; if(bufferedInputStream!=null){ bufferedInputStream.close(); if (bufferedOutputStream!=null){ bufferedOutputStream.close(); } }