温故而知新,可以为师矣。至于你信不信,反正我是信了。知识这个东西吗,学了忘,忘了学,和正常,最近实习被各种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(); } }
还要注意一点,字符流只操作字符串,用他傻逼地操作图片文件结果就是指定目录下文件生成了,却没有内容。。。
好了,以上就是我的一点回顾和总结了,与君共勉,评论一下,点个赞哦
相关推荐
用Java语言实现编译原理中词法分析器,可以对关键字,运算符,分界符,标识符,常数,无识别符等类型进行识别。可以通过文件输入或者控制台进行输出
编译原理实验1——词法分析器设计(java) 利用Java实现基本初等函数词法分析器设计
编译原理——词法分析器设计与实现,而且完整项目,可运行 针对于pascal语言,也可针对于c语言,只需要更改好关键字保留字
NULL 博文链接:https://goon.iteye.com/blog/1775421
编译原理的课程设计,词法分析,语法分析,包含有first集,follow集,select集
1. 根据输入的文法 G 初始化辅助的数据结构,包括终结符集,非终结符集,非终结 2. 根据输入的文法 G,构造出 LR(1)状态机(项目集) 3. 根据构造出
编译原理Java实现完整自顶向下语法分析——First、Follow、Select、判断LL(1)、提取公因子、消除左递归、自顶向下分析输入串
用VC++/VB/JAVA语言实现对C语言子集的源程序进行词法分析。通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示 ;...
4、JAVA语言写后端 该项目完成的功能有:自动消去规则左递归;自动计算出First、Follow集;自动构造预测分析表;可输入句子进行判断。 代码我都写了注释,由于项目后期完成的比较急促,所以代码冗余度比较大,还...
主要介绍了java动态规划算法——硬币找零问题,结合实例形式分析了java动态规划算法——硬币找零问题相关原理、实现方法与操作注意事项,需要的朋友可以参考下
Java
Java源码分析与常用设计模式,分布式架构的框架结构,底层原理。手写spring mvc,微服务架构 spring 5新特新与源码解析。
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...
编译原理程序实例,实现预测分析器的构造,C++源代码
├─面试必问-webservice原理分析 │ webservice原理分析.mp4 │ ├─面试必问-使用Springboot快速搭建SSM框架 │ 使用SpringBoot快速搭建SSM框架.mp4 │ ├─面试必问-双十一系统架构之Mysql索引技术剖析 │ 双...
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...