java流的总结——从原理分析 博客分类: java IO javaio数据源字节字符
温故而知新,可以为师矣。至于你信不信,反正我是信了。知识这个东西吗,学了忘,忘了学,和正常,最近实习被各种UI界面搞的头寻目眩,主要有fragmentTabhost,ViewPager,Adapter,自定义控件,侧滑菜单。现在完成了界面开发后我想利用一点时间完成io流的回顾,数据交互时不可避免的需要写数据到网络和本地。
正式开始:java程序怎么获取本地文件(字符文件,二进制文件)或者文件夹呢?Jdk提供了文件File类行驶这个功能。
File类译为:联系,File类实例化有多个构造函数。
File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。 File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。 File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。 File(URI uri) 通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。
System.out.println(File.separator);//文件分割符,在windows下输出\字符串
关联一个文件:File file=new File("F:\\xp\test\\2.jpg");为什么两个反斜杠呢?资源管理器打开的方式是:F:\xp\test。这是因为:\本身是标志一个转义字符,\r,\n。所以是双反斜杠。
在java里关联时,一般这样:File file2=new File("F:/xp/test/2.jpg");
2、已知File类有isDirectory(),lisfFiles()方法,用递归的方式,遍历出这个文件夹下的所有的子文件和文件夹
//输出一个文件夹的子孙及文件和文件夹 public class Demo4 { public static void main(String[] args) { File path=new File("F:/xp/test"); test(path); } public static void test(File file){ if(file==null){ return; } System.out.println(file.getAbsolutePath()); if(file.isDirectory()){ for(File src:file.listFiles()){ test(src); } } } }
是不是很短小精悍,提供形参:File,输出你的绝对路径,如果你是目录的话,遍历这个目录下一级的文件和文件夹。并且判断他们里面有没有文件夹,有求继续遍历文件夹,递归的出口就是isDirectory()不成立。
拓展:打印一个盘符下的文件和文件夹
File[] roots=path.listRoots();
对roots数组test(file)就可以了。
3、介绍完了“联系后”,接下来我们就要实现数据如何通过在java.class里流入或者流出文件。
我们从字节流和字符流的角度来介绍:
字节流:抽象类:InputStream,OutputStream。画图吧;语言表达太差了,真是日了狗了。
遵循一个原则,以程序为中心,输入到程序里的是输入流。从程序输出的流是输出流
package com.lin.bytearray; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; //ByteArray的输入输出 public class ByteArrayDemo01 { public static void main(String[] args) throws Exception { read(write()); } public static void read(byte[] src) throws Exception{ InputStream is=new BufferedInputStream(new ByteArrayInputStream(src)); int len=0; byte[] buffer=new byte[1024]; while(-1!=(len=is.read(buffer))){ System.out.println(new String(buffer,0,len)); } is.close();//这个可以不要关闭 } public static byte[] write() throws IOException{ byte[] dest; ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream(); String str="我爱java,不爱搞基我爱java,不爱搞基fesfsgsggggggggg"; byte[] info=str.getBytes(); byteArrayOutputStream.write(info, 0, info.length); dest=byteArrayOutputStream.toByteArray(); byteArrayOutputStream.close(); return dest; } }
ByteArrayOutputStream是OutputStream的子类。把字符串数据写给了数组。注意我刚才画的图,数据源不一定是文件,也可以是数组,网络。。。。。
buffer数组是一个杯子,装了1024滴的水,当没有装满(没有水滴可以装了),或者说装满该倒了,就返回-1。
以上程序的输出为:
我爱java,不爱搞基我爱java,不爱搞基fesfsgsggggggggg
而如果,换成一个小杯子:只能装10滴水,就要梅十个字节就打印:而一个汉字代表两个字节
输出:
不爱搞基我
爱java,不
爱搞基fesf
sgsggggggg
gg
是不是很爽,还是要把原理摸清楚
4、程序,文件,数组三者之间的数据流动
package com.lin.bytearray; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; public class ByteArrayDemo02 { //字节数组-程序-文件 public static void main(String[] args) throws Exception { byte[] datas=getBytesFromFile("F:/xp/test/1.txt"); System.out.println(new String(datas)); toFileFromByteArray(datas, "F:/xp/test/arrs.txt"); } //文件-程序-字节数组 public static byte[] getBytesFromFile(String srcPath)throws Exception{ File src=new File(srcPath); byte[] dest=null; InputStream is=new BufferedInputStream(new FileInputStream(src)); ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream(); byte[] flsh=new byte[1024]; int len=0; while(-1!=(len=is.read(flsh))){ byteArrayOutputStream.write(flsh, 0, len); } byteArrayOutputStream.flush(); dest=byteArrayOutputStream.toByteArray(); byteArrayOutputStream.close(); is.close(); return dest; } public static void toFileFromByteArray(byte[] src,String destPath)throws Exception{ InputStream is=new BufferedInputStream(new ByteArrayInputStream(src)); OutputStream os=new BufferedOutputStream(new FileOutputStream(new File(destPath))); byte[] buffer=new byte[1024]; int len=0; while(-1!=(len=is.read(buffer))){ os.write(buffer, 0, len); } os.flush(); os.close(); is.close(); } }
还要注意一点,字符流只操作字符串,用他傻逼地操作图片文件结果就是指定目录下文件生成了,却没有内容。。。
好了,以上就是我的一点回顾和总结了,与君共勉,评论一下,点个赞哦
下一篇: 我的各项打算 博客分类: 生活