Warning: Undefined array key "night" in /www/wwwroot/dhaomu.com/wp-content/themes/b2/header.php on line 18

java判断文件夹是否存在该文件-java读取apollo配置

说白了IO便是I/O。当手机软件与外界資源(如互联网,数据库查询和硬盘文档)互动时,将应用IO实际操作。在IO实际操作中,最常见的办法之一是流式传输,也称之为IO流式传输。IO实际操作繁杂,涉及到系统进程较多,与实际操作运行内存对比特性很低。殊不知,令人激动的是,Java带来了很多完成类来达到不一样的应用情景。有很多那样的完成类。我只挑选一些日常编号中常常采用的类来表述。这节关键详细介绍与文档实际操作有关的流。使我们看一下她们。

java判断文件夹是否存在该文件-java读取apollo配置插图文档

文档是全部文档IO系统软件中Java的基本上类。能够对文档,文件夹名称,途径开展实际操作,如创建文件或文件夹名称,获得相对路径,分辨是不是存有,重新命名,删掉,获得文件列表下的文档或文件夹名称等。

File file = new File("example"); //绝对路径 System.out.println(file.getAbsolutePath()); //获得相对路径 System.out.println(file.getName()); //获得名字 System.out.println(file.exists()); //分辨文档或文件夹名称是不是存有 boolean result = file.mkdirs();// 把 example 当做文件夹名称来建立,mkdirs()为联级建立System.out.println(result); result = file.createNewFile();// 把 example 当做文件夹名称来建立System.out.println(result);

应用文档时必须留意几个方面:

传到File中的主要参数途径能够存有还可以不会有。传到File中的主要参数途径如果是绝对路径,那麼这一途径是对应于当今Java Project网站根目录的。当传到的途径不会有的情况下,是没法依据 isDirectory() 或 isFile() 来分辨是文件夹名称或是文档

当必须解析xml特定文件中全部具备特定后缀名或名字的文档或文件夹名称时,必须在ListFile的技术参数中给予一个名叫filter的过滤装置来辅助完成过虑作用。这一过滤装置并不是Java给予的,应当按照自身的必须来完成。要应用此方式,您必须完成FileFilter类。用以过虑特定文件后缀名称的过滤装置完成如下所示。

class ExtendNameFilter implements FileFilter { private String extendName; public ExtendNameFilter(String extendName) { this.extendName = extendName; } public boolean accept(File dir){ if(dir.isDirectory()) return true; return dir.getName().endsWith(this.extendName); }}// 挑选特定文件夹名称下文档以.java末尾的文档File[] files = file.listFiles(new ExtendNameFilter(".java")); for(File f : files) { System.out.println(f.getName()); }

File常见的实际操作也是有许多,因为篇数比较有限,这儿便不一一展示了。more实际操作的使用方法和上边案例中的跳转方式不能差别,只必须留意主要参数和传参。

字节数,标识符和编码格式。

这儿沒有字节数,标识符,编码格式的含义叙述,但在网上有很多具体的表述,请自己参照。可是从表达方式上大概能够了解:字节数和标识符针对系统软件数据信息有不一样的表达方式,开启一些资料就可以留意到。假如打开图片或可执行文件文档,会见到相近错码标识符的物品;如果是文本文档,大部分会见到密文数据信息,例如“Hello”,“Hello World”等。针对前面一种,你不明白的用字节数表明,但你看得懂的用标识符表明。标识符也以字节数储存,但不一样编码格式应用的字节不一样。特殊标识符必须是多少字节数代表着必须相对应的编号表。比如,假如应用GBK编号储存中国汉字,则用2个字节数表明,但用UTF8表明为3个字节数。

輸出流&文档键入流字节流。

文档只有实际操作文档或文件夹名称,但不可以实际操作文档內容。要实际操作文档的內容,必须应用文档IO流。控制文档內容有二种关键方法:字节数和标识符。这节关键讲以字节数文件流的方式实际操作文档內容,以标识符文件流的方式实际操作。我将把它交给下一部分来表述。

在Java中,以字节流方式实际操作文档內容的类关键有FileOutputStream和FileInputStream。分别是OutputStream和InputStream抽象性基类的派生类。下列是表明此流应用情形的照片团本。

File sourceFile = new File("sourceFile.jpg"); File destFile = new File("destFile.jpg");FileInputStream fis=null; // 载入源代码的流FileOutputStream fos = null; // 輸出到总体目标文档的流try { fis = new FileInputStream(sourceFile); fos = new FileOutputStream(destFile); byte[] bytes= new byte[1024]; int len = 0; while((len=fis.read(bytes))!=-1) { fos.write(bytes, 0, len); }}catch(IOException ex) {}finally { try { fis.close();} catch(IOException ex) {} try { fos.close();} catch(IOException ex) {} }

在应用文档輸出流和文档键入流的环节中:

FileInputStream 所要实际操作的文档务必存有,不然便会抛出异常。而 FileOutputStream 载入的目地文档则不用存有,当不会有的时候会被建立,存有的过程中会被遮盖,还可以应用 FileOutputStream 造涵数的第二个主要参数,来完成增加文档內容。在应用 FileInputStream 载入字节数的情况下,当载入到字节数的结尾,再再次载入,不管几回都是会回到 -1,而传参len表示此次载入了多少个字节数。一般状况下每一次载入1024个字节数,能够做到时间与空间的均衡。可是真实情况也是必须深入分析的。字节流是不会有缓冲区域的,因此不用应用flush实际操作更新缓冲区域,字节数的载入和载入全是根据电脑操作系统来完成的。只需是流便是必须关掉的,不管是不是在异常现象下都必须关掉流,避免占有服务器资源,造成别的程序流程不能对该文件开展实际操作。可是在关掉流的情况下也是有将会会报出现异常,因此也必须 try…catch。

OutputStream和FileOutputStream关键用以实际操作字节数方式的文档,如照片和可执行文件。自然,实际操作标识符表示的文档没有问题,但那样做并不标准。

OutputStreamWriter & InputStreamReader

这节关键探讨标识符流方式的实际操作文档。在Java中,相匹配实际操作的关键类是OutputStreamWriter和InputStreamReader。有时候他们被称作变换流。实际缘故之后会探讨。大家先看来一个事例。

File sourceFile = new File("sourceFile.txt");File destFile = new File("destFile.txt"); FileInputStream fis= new FileInputStream(sourceFile);FileOutputStream fos = new FileOutputStream(destFile); InputStreamReader reader=null;OutputStreamWriter writer=null;try { reader= new InputStreamReader(fis,"utf-8"); writer =new OutputStreamWriter(fos,"gbk"); char[] cbuf =new char[1024]; int len=0; while((len=reader.read(cbuf))!=-1) { System.out.println(String.copyValueOf(cbuf,0,len)); writer.write(cbuf, 0, len); }}catch(IOException ex) { try{reader.close();}catch(IOException ex) { } try{writer.close();}catch(IOException ex) { }}

上边的事例关键完成了文档的拷贝。与字节流的使用方法不一样,标识符流的构造方法必须传送字节流和编码格式。这是由于实际操作文档的信息全是以字节数的方式开展使用的。键入流依据数字表将从字节流中载入的字节数转义为标识符,这也表明了传送编号表文件格式主要参数的必要性。假如读取文件的编码格式是UTF-8,而且沒有传送此参数,则此参数是电脑操作系统的默认设置编号表(Windows的GBK)。假如默认设置编号表与UTF-8不一样(与系统软件编号表文件格式同样,很有可能不传送此参数),则在转义成标识符的环节中会产生难题。假如文档內容为“好”,UTF-8相匹配的字节数为-10-20-30。随后用软件的默认设置时速表转义。假如默认设置编码是,“好”字的编码是-50-60。原先3个字节数意味着中国汉字,如今改为2个字节数意味着中国汉字。由于编码表兼容问题,因此会发生错码。应用标识符輸出流时,依据数字表主要参数将字符转换为字节数,随后载入相对应编码格式的文档。假如增加輸出內容,必须确保2个輸出文档內容的编码格式同样,不然会发生错码。假如前一个輸出文档是GBK文件格式,您应用标识符輸出流輸出的字符串文件格式是UTF8并额外到文档中,那麼这时将转化成错码标识符。总的来说,我们知道为何大家也称FileOutputStream和InputStreamReader为变换流。

传送给标识符流的字节流不用独立关系,关掉标识符流的时候会启用字节流的close()方式。

文档载入器和文档读取器

FileWriter和FileReader分别是OutputStreamWriter和InputStreamReader的派生类,除开他们是电脑操作系统默认设置状况下只有对表开展编号的标识符流。还可以简易了解为OutputStreamWriter和InputStreamReader的构造方法不兼容传送第二个主要参数,这也是电脑操作系统的默认设置编号表。因此在运用时只必须留意实际操作的文档编码格式是不是与系统软件默认设置的编码格式一致就可以。即然不通过第二个主要参数也可以做到相同的实际效果,怎么会有这两个类呢?由于这两个类非常容易实际操作。使我们以拷贝文档为例子。

File sourceFile = new File("sourceFile.txt"); File destFile = new File("destFile.txt"); FileReader reader=null; FileWriter writer=null; try { reader= new FileReader(sourceFile); writer =new FileWriter(destFile); char[] cbuf =new char[1024]; int len=0; while((len=reader.read(cbuf))!=-1) { System.out.println(String.copyValueOf(cbuf,0,len)); writer.write(cbuf, 0,len); } } catch(IOException ex) { } finally { try{reader.close();}catch(IOException ex) { } try{writer.close();}catch(IOException ex) { } }

不论是应用FileWriter & FileReader或是outputstreamwriter & inputstreamreader,里边一定会有缓冲区域,默认设置尺寸为8192字节数。假如流沒有关掉,数据信息将持续存有于缓冲区域中,不容易储存在文档中。除非是手动式启用flush方式,或是载入缓冲区域的数据信息超出缓冲区域的尺寸,不然数据信息将在文档上更新。而內部启用close方式将启用flush来最先更新缓冲区域。

bufferedoutstream & BufferedInputStream & BufferedWriter & BufferedReader

缓冲区域开始的这四个类为字节流和标识符流给予了适宜的缓冲区域,以提升读写能力特性,尤其是在读写能力信息量比较大时。它的使用说明与无缓存流沒有什么不同,仅仅它给予了一些根据无缓存流的更便捷的方式,例如newLine(),ReadLine()和ReadAllBytes()。她们将按照不一样的电脑操作系统加上适度的回车符,并依据合理的回车符载入一行数据信息和全部字节数。大家一起来看看使用方法。以缓存标识符流为例子。

File sourceFile = new File("sourceFile.txt");File destFile = new File("destFile.txt");BufferedWriter bw =null;BufferedReader br =null;try { FileReader reader= new FileReader(sourceFile); FileWriter writer=new FileWriter(destFile); bw =new BufferedWriter(writer); br =new BufferedReader(reader); String line =null; while((line=br.readLine())!=null) { bw.write(line); bw.newLine(); }}catch(IOException ex) {}finally { try { bw.close();} catch(IOException ex) {} try { br.close();} catch(IOException ex) {} }

以上编码中有二点必须留意:

当依照行来载入标识符的情况下,时下一行沒有內容,再次载入下一行的內容,結果会回到 null,能够此来分辨文档中是不是也有标识符。当载入的文档行回到为null后,依然会实行一次循环系统,这时启用newLine() 会在载入的文档中有加上一个回车符,这一回车符无关痛痒,能够不需要考虑到解决掉。

目标輸出流&目标輸出流

在程序编写全过程中,难以避免地要达到与外界程序流程的数据通讯要求,如启用外界功能和互相传送目标。这时,在与外界程序流程互动以前,必须将传送的目标实例化为流。比如,您必须对目标开展深层拷贝,或是您还可以将目标实例化为流,随后将其反序列化为新目标。Java给予ObjectOutputStream和ObjectInputStream来完成目标的实例化和反序列化。实例化流是字节流。为了更好地清晰地见到实例化的結果,下边将实例化的流輸出到一个文档,随后将其反序列化为一个目标。使我们一起来看看。

Student stu =new Student("vitamin",20,1);File destFile = new File("destFile.txt");// 实例化目标到文档中ObjectOutputStream oos= null;try { FileOutputStream fos = new FileOutputStream(destFile); oos =new ObjectOutputStream(fos); oos.writeObject(stu);}catch(IOException ex) {}finally { try {oos.close();}catch(IOException ex) {}}// 反序列化文档中的流为目标ObjectInputStream ois= null;try { FileInputStream fis = new FileInputStream(destFile); ois =new ObjectInputStream(fis); Student newStu = (Student)ois.readObject(); System.out.println(newStu.toString());}catch(Exception ex) {}finally { try {ois.close();}catch(IOException ex) {}}// Student 类界定class Student implements Serializable{ private String Name; public int Age; public transient int Sex; public static String ClassName; private final static long serialVersionUID= -123123612836L; public Student(String name,int age,int sex) { this.Name =name; this.Age = age; this.Sex = sex; } @Override public String toString() { return String.format("Name=%s,Age=%d,Sex=%d", this.Name,this.Age,this.Sex); }}

假如要想取得成功实例化和反序列化目标,应当留意以下几个方面:

目标要想完成实例化,被实例化的目标要完成标识插口 Serializable。不管特性访问限制怎样,都能够开展实例化和反序列化,但静态数据特性没法被实例化和反序列化。假如在目标实例化的环节中,不愿让某一特性参加在其中,能够应用关键词 transient 开展标识。实例化到文档后是不必开展flush实际操作的,同字节流一样也不会有缓冲区域。假如目标在实例化后,对目标的特性的改动(例如浏览特性的变动,字段名种类的变动)都是会造成在反编码序列后发生相近不正确 :Student; local class incompatible: stream classdesc serialVersionUID = -123123612836, local class serialVersionUID = -1225000535040348600 这也是因为目标在编写出class文件全过程时会对特性转化成一个 serialVersionUID ,这一特性也会储存到实例化后的另一半中,每一次特性的变动都是会造成它开展改动,假如发生前后左右不一致,则造成发生之上不正确。假如想防止这个问题,必须在目标内特定 serialVersionUID ,实际标值什么都。可是特性的界定一定如果 final static long。反序列化后的另一半是Object种类,并不是Student。假如要应用Student目标的特性或方式,必须开展强制性种类转换。目标在实例化和反序列化的环节中,抛出去的不仅有IOException。假如删掉Student类界定或者Student.class文件,随后对实例化后的流启用toString()方式 System.out.println(ois.readObject()); ,便会抛出异常: java.lang.ClassNotFoundException: Student , 假如反序列化后的目标变为非Student目标,也会报别的的非IOException出现异常。因此在解决出现异常的情况下,必须充分考虑这种状况。

特性

在学习培训Java的环节中,大家一定会触碰到用Map构造储存键值关联的数据信息。在我以前的blogJava中对泛型结合类储存的归纳中,我提及了它的一个完成类HashMap。可是除开HashMap以外,还有一个完成类HashTable,能够完成和HashMap一样的作用。可是,因为它是线程安全的(同歩的),而且保存的另一半是目标种类,因此针对进程不安全的(多线程的)HashMap,它的特性会减少,因此它没有很常见。殊不知,哈希表有一个派生类特性,这也是十分普遍的。它还可以在文档中以Key=Value的方式储存数据信息,能够用于载入配备。

Properties prop =new Properties();prop.setProperty("Name", "vitamin");prop.setProperty("Age", "20"); File file =new File("destFile.txt");FileWriter writer =new FileWriter(file);prop.store(writer, "this is a test conf"); // 储存到文档中并设定备注名称,假如备注名称是汉语则会被转换格式 FileReader reader =new FileReader(file);prop.load(reader);System.out.println(prop.getProperty("Name")); // vitaminSystem.out.println(prop.getProperty("Sex")); // nullSystem.out.println(prop.getProperty(" Name")); // null

尽管特性是以哈希表承继的,可是它的键合值只有是字符串类型,可是put(Object,Object)方式已经在完成內部启用。特性容许您立即启用put(目标,目标)方式。终究,他们是Map的完成类。可是,以这类方法启用后,它会在操作时汇报一个不正确,并警示您只有设定字符串类型的数据信息。

文本文件中载入Key=Value的对应关系,根据载入和储存的方法变换为Properties目标,将Key=Value的对应关系变换为Properties目标,储存在文档中。留意:针对文档中储存的Key=Value关联,等于号两侧有时间是十分关键的。假如有时间,看起来没有问题,但不是你要想的Properties目标的結果,能够自身试一下。假如必须在Load文档中加上注解,只需在行首加上#就可以。

#this is a test conf#Sat Sep 21 15:03:54 CST 2019Age=20Name=vitamin

打印出流和打印出创作者

最终,大家来谈一谈Java给予的PrintStream和PrintWriter,他们能够对輸出数据信息开展一些恢复出厂设置实际操作。提及PrintStream很有可能会感觉怪异,可是你有没有注意到常常采用的System.out.print()方式的內部完成,它的最底层是由PrintStream实际操作的,承继了文档字节流FileOutputStream?后面一种PrintWriter更常见,因为它完成了前面一种的全部方式,能够打印出标识符流,而PrintStream沒有。因而,PrintWriter也更为灵便。使我们用接下来的事例一起来看看PrintWriter。

File file =new File("destFile.txt");PrintWriter pw =null;try{ pw = new PrintWriter(file); pw.printf("Name=%s", "vitamin"); pw.flush();}catch(IOException ex) {}finally { pw.close(); }

特别注意的是,PrintWriter的close()方式不容易抛出去IOException,由于这一出现异常早已在最底层被捕捉和解决。

PrintWriter內部有一个缓冲区域(当构造方法传到File种类时,內部由BefferedWriter完成),因此必须手动式启用flush()方式。可是PrintWriter的构造方法适用第二个主要参数:是不是开启自动更新缓冲区域。当设定为true时,它将仅在启用println,printf,format方式时起效。

io流的挑选。

上边早已提及了这么多IO流,在某些环境下都应当应用什么流呢?看一张图片。

java判断文件夹是否存在该文件-java读取apollo配置插图1除开图中,你还是必须问一下自己好多个附加的难题:

是不是必须开展实例化和反序列化实际操作?如果是则挑选 ObjectInputStream 或 ObjectOutputStream。是不是必须载入Key=Value方式或是是要想储存成Key=Value方式的配备?如果是能够挑选 Properties 实际操作起來更为便捷。是不是必须打印出特定文件格式的数据信息到輸出文档?能够考虑到应用 PrintWriter,实际上它便是在流的根基上出示了一些更为简约的实际操作。

末尾:如果你觉得本文对您有协助,还记得侧重点赞的分享。你的认可就是我升级的驱动力。

温馨提示:
1.本站大部分内容均收集于网络!若内容若侵犯到您的权益,请发送邮件至:duhaomu@163.com,我们将第一时间处理!
2.资源所需价格并非资源售卖价格,是收集、整理、编辑详情以及本站运营的适当补贴,并且本站不提供任何免费技术支持。
3.所有资源仅限于参考和学习,版权归原作者所有,更多请阅读网站声明

给TA赞赏
共{{data.count}}人
人已赞赏
未整理

雨婷《服装直播带货运营落地实操课》新号0粉快速带货日销10W+

2021-7-31 0:00:00

未整理

XnSay机器人授权系统源码

2021-8-2 0:00:00

0 条回复 A文章作者 M管理员

Warning: Trying to access array offset on value of type null in /www/wwwroot/dhaomu.com/wp-content/themes/b2/functions.php on line 3914

Warning: Trying to access array offset on value of type null in /www/wwwroot/dhaomu.com/wp-content/themes/b2/functions.php on line 3914
----《》
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索