JAVA I/O流(10)
来源:互联网 发布:淘宝助理批量修改价格 编辑:程序博客网 时间:2024/06/16 06:48
这一讲就是JAVA中的I/O流的一部分内容,当然,跟前面一样,咱们浅尝辄止,需要深入了解的推荐大家看一本JAVA核心技术 这本书讲的比较深入也很全面。
第一节 I/O流简介
流的本质是数据传输。
流分为两类主要:字符流和字节流
第二节 文件操作File类
先讲两个比较经典的用法就是创建文件和监测文件是否创建成功:
public class no1{public static void main(String[] args) throws IOException {File file = new File("d://hhh");//创建一个文件boolean b = file.mkdirs();//创建虚拟目录if(b){System.out.println("successful!");file = new File("d://hhh//hh.txt");boolean a = file.createNewFile();//检测是否创建文件成功?if(a){System.out.println("sucessful,too!");}}else{System.out.println("false!");}}}
里面的注释都很清楚,作用就是在本地电脑的D盘创建了一个相应的文件,并在文件里面创建了一个文本文档,之所以会惊醒if判断,是因为这个是可能出现错误的,而且这个检测是否创建成功的这个方法还会抛出异常,可以使用TRY或者直接Throw都可以。
下面一个方法就是删除文件了,比较简单,就是文件对象名点delete()方法,但是会出现一个问题,就是有的时候文件删的掉,有的时候删不掉,经过多次尝试,发现因为当前文件正在被占用所以导致无法删除。在写程序的时候咬住以这个问题,但是一般不会遇到,毕竟没有谁创建一个文件正在运行中就要删了,感觉脑子有问题。删除文件目录的时候,文件目录下面必须为空,不能有任何的文件存在。
public static void main(String[] args) throws IOException {File file = new File("d://hhh//hh.txt");boolean aa = file.delete();System.out.println(aa);}
然后是遍历一个目录下的一级文件,什么叫做一级文件,就是直接在里面的不区分类型的文件。
public static void main(String[] args) throws IOException {File file = new File("d://hhh");//遍历一个文件目录下的所有文件File[] files = file.listFiles();for(int a = 0;a<files.length;a++)System.out.println(files[a]);}
那么问题来了,大家想不想知道如何便利所有的文件呢,而不是有的是文件目录,有的是文件?我们自己编写一个listFile()方法就可以实现这些!
//改写遍历文件的方法,一层一层全部遍历出来public static void listFile (File f){if(f!=null){if (f.isDirectory()){//文件如果是目录File fi[] = f.listFiles();if(fi!=null)for(int a = 0;a<fi.length;a++)listFile(fi[a]);elseSystem.out.println(f);}}}
第三节 流的典型
1、InputStream() 把硬盘上的文件读取到内存中,也就是最简单的输入流:硬盘——>内存
大家要注意几点地方,首先读取的文件要加上后缀名.txt。
public static void main(String[] args) throws IOException {File f = new File("D://hhh//1.txt");InputStream io = new FileInputStream(f);//实例化输入流byte b[] = new byte[1024];io.read(b);io.close();//关闭输入流System.out.println(new String(b));}
但是这样会出现最后的没有存上的字节的读出来就是乱码,怎么解决呢,自然而然时提前获取文件字节数,然后按照大小创建数组,既节省空间,有防止乱码。
int fl = (int)f.length();//提前获取文件大小
上面的都是一批一批的读取,那么我们想一个一个的读就要:
public static void main(String[] args) throws IOException {File f = new File("D://hhh//1.txt");InputStream io = new FileInputStream(f);//实例化输入流int fl = (int)f.length();//提前获取文件大小byte b[] = new byte[fl];int tem = 0;int len = 0;while((tem = io.read())!= -1){//当读到最后的时候就会出现-1b[len++] = (byte)tem;}io.close();//关闭输入流System.out.println(new String(b));}
2、outputStream()输出流
首先我们讲的是覆盖的方式,就是直接把原文件中的内容覆盖
public static void main(String[] args) throws IOException {File f = new File("D://hhh//1.txt");OutputStream out = new FileOutputStream(f);String a = "fdihnfjdnkfbudfdjkdniv";byte[] b = a.getBytes();out.write(b);out.close();}
那当我们想在已经有的内容里面添加的话,我们就要用另外一种方法了:
OutputStream out = new FileOutputStream(f,true);
后面加一个true就可以在后面追加
3、BufferedInputStream()和BufferedOutputStream()
缓冲其实就是一个用来暂存的东西,举个例子来说,我们的长江三峡水库就是一个缓冲,这样可以防止水流大量涌来的时候导致下游泛滥成灾害!
我们先来测试一个关键问题,那就是用无缓冲的流和有缓冲的流到底有什么区别?
我们写一个利用无缓冲的输入输出流实现文件从D盘复制到F盘的操作:
//非缓冲public static void stream() throws Exception{InputStream io = new FileInputStream("D://hhh//1.txt");OutputStream out = new FileOutputStream("F://LOL//ll.txt");int b = 0;long startTime = System.currentTimeMillis();//记录开始的时间,即程序运行到此处的时间while((b = io.read())!=-1){out.write(b);}io.close();out.close();System.out.println("系统花费时间:"+(System.currentTimeMillis()-startTime));}
我们可以看到,花费的时间是34073ms,可以说时间很长
那么有缓冲的时候又会变成什么样子呢?
//缓冲public static void stream() throws Exception{BufferedInputStream io = new BufferedInputStream(new FileInputStream("D://hhh//1.txt"));BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("F://ll.txt"));int b = 0;long startTime = System.currentTimeMillis();//记录开始的时间,即程序运行到此处的时间while((b = io.read())!=-1){out.write(b);}io.close();out.close();System.out.println("系统花费时间:"+(System.currentTimeMillis()-startTime));}
时间变成了158ms。
那么缓冲是怎么回事呢。相当于在内存中开辟了一个内存空间——缓冲区。如果来不及写或者数量太大,就先一次性放入缓冲区,然后写读都从里面拿。
新人上路,望老司机指点迷津 QQ815884631
- JAVA I/O流(10)
- java I/O流
- java I/O流
- java I/O流
- Java I/O流
- JAVA--I/O流
- java I/O流
- java I/O流
- java I/O流
- Java I O流
- java i/o流
- Java I/O流
- Java I/O流
- java I/O流
- java I/O流
- Java - I/O流
- java-I/O流
- JAVA I/O流
- PAT-A1061
- Transformations转换入门经典实例
- uoj#207. 共价大爷游长沙
- Linux学习——关机重启命令
- Array-Leetcode
- JAVA I/O流(10)
- UVA 11987 Almost Union-Find 并查集的删除操作 懒惰标记
- 我的传智播客之javaweb_day02学习总结
- 【面试题4】替换空格
- c++派生类内存分布图
- Linux 安装器添加安全功能的必要性
- Codeforces Round #403 Div. 2 B. The Meeting Place Cannot Be Changed(二分)
- 创建和使用线程
- 二,性能测试