<h2 class="md-end-block md-heading md-focus"><span class="md-plain">一,File类</span></h2> <h3 class="md-end-block md-heading"><span class="md-plain">1.1 概述</span></h3> <p class="md-end-block md-p"><span class="md-pair-s"><code>  java.io.File</code><span class="md-plain"> 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。</span></span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item md-focus-container"> <p class="md-end-block md-p md-focus"><span class="md-plain md-expand">它是文件和目录路径名的抽象表示</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">文件和目录是可以通过File封装成对象的</span></p> </li> <li class="md-list-item md-focus-container"> <p class="md-end-block md-p md-focus"><span class="md-plain md-expand">对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。它可以是存在的,也可以是不存在的。将来是要通过具体的操作把这个路径的内容转换为具体存在的</span></p> </li> </ul> <h3 class="md-end-block md-heading"><span class="md-plain">1.2 构造方法</span></h3> <ul class="ul-list" data-mark="*"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s"><code>public File(String pathname)</code><span class="md-plain"> :通过将给定的<span class="md-pair-s "><strong>路径名字符串</strong><span class="md-plain">转换为抽象路径名来创建新的 File实例。 </span></span></span></span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s"><code>public File(String parent, String child)</code><span class="md-plain"> :从<span class="md-pair-s "><strong>父路径名字符串和子路径名字符串</strong><span class="md-plain">创建新的 File实例。</span></span></span></span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s"><code>public File(File parent, String child)</code><span class="md-plain"> :从<span class="md-pair-s "><strong>父抽象路径名和子路径名字符串</strong><span class="md-plain">创建新的 File实例。 </span></span></span></span></p> </li> </ul> <ul class="ul-list" data-mark="*"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">构造举例,代码如下:</span></p> </li> </ul> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-comment">// 文件路径名<br><span><span class="cm-variable-3">String <span class="cm-variable">pathname <span class="cm-operator">= <span class="cm-string">"D:\\aaa.txt";<br><span><span class="cm-variable">File <span class="cm-variable">file1 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">File(<span class="cm-variable">pathname); <br><span><span>​<br><span><span class="cm-comment">// 文件路径名<br><span><span class="cm-variable-3">String <span class="cm-variable">pathname2 <span class="cm-operator">= <span class="cm-string">"D:\\aaa\\bbb.txt";<br><span><span class="cm-variable">File <span class="cm-variable">file2 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">File(<span class="cm-variable">pathname2); <br><span><span>​<br><span><span class="cm-comment">// 通过父路径和子路径字符串<br><span> <span class="cm-variable-3">String <span class="cm-variable">parent <span class="cm-operator">= <span class="cm-string">"d:\\aaa";<br><span> <span class="cm-variable-3">String <span class="cm-variable">child <span class="cm-operator">= <span class="cm-string">"bbb.txt";<br><span> <span class="cm-variable">File <span class="cm-variable">file3 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">File(<span class="cm-variable">parent, <span class="cm-variable">child);<br><span><span>​<br><span><span class="cm-comment">// 通过父级File对象和子路径字符串<br><span><span class="cm-variable">File <span class="cm-variable">parentDir <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">File(<span class="cm-string">"d:\\aaa");<br><span><span class="cm-variable-3">String <span class="cm-variable">child <span class="cm-operator">= <span class="cm-string">"bbb.txt";<br><span><span class="cm-variable">File <span class="cm-variable">file4 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">File(<span class="cm-variable">parentDir, <span class="cm-variable">child);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> <blockquote> <p class="md-end-block md-p"><span class="md-plain">小贴士:</span></p> <ol class="ol-list" start=""> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">一个File对象代表硬盘中实际存在的一个文件或者目录。</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">无论该路径下是否存在文件或者目录,都不影响File对象的创建。</span></p> </li> </ol> </blockquote> <h3 class="md-end-block md-heading"><span class="md-plain">1.3 常用方法</span></h3> <h4 class="md-end-block md-heading"><span class="md-plain">获取功能的方法</span></h4> <ul class="ul-list" data-mark="*"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s"><code>public String getAbsolutePath()</code><span class="md-plain"> :返回此File的绝对路径名字符串。</span></span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s"><code>public String getPath()</code><span class="md-plain"> :将此File转换为路径名字符串。 </span></span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s"><code>public String getName()</code><span class="md-plain"> :返回由此File表示的文件或目录的名称。 </span></span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s"><code>public long length()</code><span class="md-plain"> :返回由此File表示的文件的长度。 </span></span></p> <p class="md-end-block md-p"><span class="md-plain">方法演示,代码如下:</span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">FileGet {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">File <span class="cm-variable">f <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">File(<span class="cm-string">"d:/aaa/bbb.java"); &nbsp; &nbsp; <br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"文件绝对路径:"<span class="cm-operator">+<span class="cm-variable">f.<span class="cm-variable">getAbsolutePath());<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"文件构造路径:"<span class="cm-operator">+<span class="cm-variable">f.<span class="cm-variable">getPath());<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"文件名称:"<span class="cm-operator">+<span class="cm-variable">f.<span class="cm-variable">getName());<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"文件长度:"<span class="cm-operator">+<span class="cm-variable">f.<span class="cm-variable">length()<span class="cm-operator">+<span class="cm-string">"字节");<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">File <span class="cm-variable">f2 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">File(<span class="cm-string">"d:/aaa"); &nbsp; &nbsp; <br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"目录绝对路径:"<span class="cm-operator">+<span class="cm-variable">f2.<span class="cm-variable">getAbsolutePath());<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"目录构造路径:"<span class="cm-operator">+<span class="cm-variable">f2.<span class="cm-variable">getPath());<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"目录名称:"<span class="cm-operator">+<span class="cm-variable">f2.<span class="cm-variable">getName());<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"目录长度:"<span class="cm-operator">+<span class="cm-variable">f2.<span class="cm-variable">length());<br><span> &nbsp; }<br><span>}<br><span><span class="cm-variable">输出结果:<br><span><span class="cm-variable">文件绝对路径:<span class="cm-variable">d:<span class="cm-variable">\aaa\bbb.<span class="cm-variable">java<br><span><span class="cm-variable">文件构造路径:<span class="cm-variable">d:<span class="cm-variable">\aaa\bbb.<span class="cm-variable">java<br><span><span class="cm-variable">文件名称:<span class="cm-variable">bbb.<span class="cm-variable">java<br><span><span class="cm-variable">文件长度:<span class="cm-number">636<span class="cm-variable">字节<br><span><span>​<br><span><span class="cm-variable">目录绝对路径:<span class="cm-variable">d:<span class="cm-variable">\aaa<br><span><span class="cm-variable">目录构造路径:<span class="cm-variable">d:<span class="cm-variable">\aaa<br><span><span class="cm-variable">目录名称:<span class="cm-variable">aaa<br><span><span class="cm-variable">目录长度:<span class="cm-number">4096</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> </li> </ul> <blockquote> <p class="md-end-block md-p"><span class="md-plain">API中说明:length(),表示文件的长度。但是File对象表示目录,则返回值未指定。</span></p> </blockquote> <h4 class="md-end-block md-heading"><span class="md-plain">绝对路径和相对路径</span></h4> <ul class="ul-list" data-mark="*"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s "><strong>绝对路径</strong><span class="md-plain">:从盘符开始的路径,这是一个完整的路径。</span></span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s "><strong>相对路径</strong><span class="md-plain">:相对于项目目录的路径,这是一个便捷的路径,开发中经常使用。</span></span></p> </li> </ul> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">FilePath {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) {<br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">// D盘下的bbb.java文件<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">File <span class="cm-variable">f <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">File(<span class="cm-string">"D:\\bbb.java");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">f.<span class="cm-variable">getAbsolutePath());<br><span class="cm-tab-wrap-hack"> &nbsp; &nbsp; <span class="cm-tab"> <br><span><span class="cm-tab"> <span class="cm-tab"> <span class="cm-comment">// 项目下的bbb.java文件<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">File <span class="cm-variable">f2 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">File(<span class="cm-string">"bbb.java");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">f2.<span class="cm-variable">getAbsolutePath());<br><span> &nbsp; }<br><span>}<br><span><span class="cm-variable">输出结果:<br><span><span class="cm-variable">D:<span class="cm-variable">\bbb.<span class="cm-variable">java<br><span><span class="cm-variable">D:<span class="cm-variable">\idea_project_test4\bbb.<span class="cm-variable">java</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> <h4 class="md-end-block md-heading"><span class="md-plain">判断功能的方法</span></h4> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s"><code>public boolean exists()</code><span class="md-plain"> :此File表示的文件或目录是否实际存在。</span></span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s"><code>public boolean isDirectory()</code><span class="md-plain"> :此File表示的是否为目录。</span></span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s"><code>public boolean isFile()</code><span class="md-plain"> :此File表示的是否为文件。</span></span></p> </li> </ul> <p class="md-end-block md-p"><span class="md-plain">方法演示,代码如下:</span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">FileIs {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">File <span class="cm-variable">f <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">File(<span class="cm-string">"d:\\aaa\\bbb.java");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">File <span class="cm-variable">f2 <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">File(<span class="cm-string">"d:\\aaa");<br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">// 判断是否存在<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"d:\\aaa\\bbb.java 是否存在:"<span class="cm-operator">+<span class="cm-variable">f.<span class="cm-variable">exists());<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"d:\\aaa 是否存在:"<span class="cm-operator">+<span class="cm-variable">f2.<span class="cm-variable">exists());<br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">// 判断是文件还是目录<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"d:\\aaa 文件?:"<span class="cm-operator">+<span class="cm-variable">f2.<span class="cm-variable">isFile());<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"d:\\aaa 目录?:"<span class="cm-operator">+<span class="cm-variable">f2.<span class="cm-variable">isDirectory());<br><span> &nbsp; }<br><span>}<br><span><span class="cm-variable">输出结果:<br><span><span class="cm-variable">d:<span class="cm-variable">\aaa\bbb.<span class="cm-variable">java <span class="cm-variable">是否存在:<span class="cm-atom">true<br><span><span class="cm-variable">d:<span class="cm-variable">\aaa <span class="cm-variable">是否存在:<span class="cm-atom">true<br><span><span class="cm-variable">d:<span class="cm-variable">\aaa <span class="cm-variable">文件<span class="cm-operator">?:<span class="cm-atom">false<br><span><span class="cm-variable">d:<span class="cm-variable">\aaa <span class="cm-variable">目录<span class="cm-operator">?:<span class="cm-atom">true</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> <h4 class="md-end-block md-heading"><span class="md-plain">创建删除功能的方法</span></h4> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s"><code>public boolean createNewFile()</code><span class="md-plain"> :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。 </span></span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s"><code>public boolean delete()</code><span class="md-plain"> :删除由此File表示的文件或目录。 </span></span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s"><code>public boolean mkdir()</code><span class="md-plain"> :创建由此File表示的目录。</span></span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s"><code>public boolean mkdirs()</code><span class="md-plain"> :创建由此File表示的目录,包括任何必需但不存在的父目录。</span></span></p> </li> </ul> <p class="md-end-block md-p"><span class="md-plain">方法演示,代码如下:</span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">FileCreateDelete {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) <span class="cm-keyword">throws <span class="cm-variable">IOException {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">// 文件的创建<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">File <span class="cm-variable">f <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">File(<span class="cm-string">"aaa.txt");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"是否存在:"<span class="cm-operator">+<span class="cm-variable">f.<span class="cm-variable">exists()); <span class="cm-comment">// false<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"是否创建:"<span class="cm-operator">+<span class="cm-variable">f.<span class="cm-variable">createNewFile()); <span class="cm-comment">// true<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"是否存在:"<span class="cm-operator">+<span class="cm-variable">f.<span class="cm-variable">exists()); <span class="cm-comment">// true<br><span class="cm-tab-wrap-hack"><span class="cm-tab"> <span class="cm-tab"> <br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">// 目录的创建<br><span class="cm-tab-wrap-hack"> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-variable">File <span class="cm-variable">f2<span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">File(<span class="cm-string">"newDir");<span class="cm-tab"> <br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"是否存在:"<span class="cm-operator">+<span class="cm-variable">f2.<span class="cm-variable">exists());<span class="cm-comment">// false<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"是否创建:"<span class="cm-operator">+<span class="cm-variable">f2.<span class="cm-variable">mkdir());<span class="cm-tab"> <span class="cm-comment">// true<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"是否存在:"<span class="cm-operator">+<span class="cm-variable">f2.<span class="cm-variable">exists());<span class="cm-comment">// true<br><span><span>​<br><span><span class="cm-tab"> <span class="cm-tab"> <span class="cm-comment">// 创建多级目录<br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-variable">File <span class="cm-variable">f3<span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">File(<span class="cm-string">"newDira\\newDirb");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">f3.<span class="cm-variable">mkdir());<span class="cm-comment">// false<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">File <span class="cm-variable">f4<span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">File(<span class="cm-string">"newDira\\newDirb");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">f4.<span class="cm-variable">mkdirs());<span class="cm-comment">// true<br><span> &nbsp; &nbsp; &nbsp;<br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">// 文件的删除<br><span> &nbsp; &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">f.<span class="cm-variable">delete());<span class="cm-comment">// true<br><span> &nbsp; &nbsp; &nbsp;<br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">// 目录的删除<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">f2.<span class="cm-variable">delete());<span class="cm-comment">// true<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">f4.<span class="cm-variable">delete());<span class="cm-comment">// false<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> <blockquote> <p class="md-end-block md-p"><span class="md-plain">API中说明:delete方法,如果此File表示目录,则目录必须为空才能删除。</span></p> </blockquote> <h3 class="md-end-block md-heading"><span class="md-plain">1.4 目录的遍历</span></h3> <ul class="ul-list" data-mark="*"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s"><code>public String[] list()</code><span class="md-plain"> :返回一个String数组,表示该File目录中的所有子文件或目录。</span></span></p> </li> </ul> <ul class="ul-list" data-mark="*"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s"><code>public File[] listFiles()</code><span class="md-plain"> :返回一个File数组,表示该File目录中的所有的子文件或目录。 </span></span></p> </li> </ul> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">FileFor {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">File <span class="cm-variable">dir <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">File(<span class="cm-string">"d:\\java_code");<br><span> &nbsp; &nbsp; &nbsp;<br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">//获取当前目录下的文件以及文件夹的名称。<br><span><span class="cm-tab"> <span class="cm-tab"> <span class="cm-variable-3">String[] <span class="cm-variable">names <span class="cm-operator">= <span class="cm-variable">dir.<span class="cm-variable">list();<br><span><span class="cm-tab"> <span class="cm-tab"> <span class="cm-keyword">for(<span class="cm-variable-3">String <span class="cm-variable">name : <span class="cm-variable">names){<br><span><span class="cm-tab"> <span class="cm-tab"> <span class="cm-tab"> <span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">name);<br><span><span class="cm-tab"> <span class="cm-tab"> }<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//获取当前目录下的文件以及文件夹对象,只要拿到了文件对象,那么就可以获取更多信息<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">File[] <span class="cm-variable">files <span class="cm-operator">= <span class="cm-variable">dir.<span class="cm-variable">listFiles();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">for (<span class="cm-variable">File <span class="cm-variable">file : <span class="cm-variable">files) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">file);<br><span> &nbsp; &nbsp; &nbsp; }<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> <blockquote> <p class="md-end-block md-p"><span class="md-plain">小贴士:</span></p> <p class="md-end-block md-p"><span class="md-plain">调用listFiles方法的File对象,表示的必须是实际存在的目录,否则返回null,无法进行遍历。</span></p> </blockquote> <h2 class="md-end-block md-heading"><span class="md-plain">二,递归</span></h2> <h3 class="md-end-block md-heading"><span class="md-plain">2.1 概述</span></h3> <ul class="ul-list" data-mark="*"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s "><strong>递归</strong><span class="md-plain">:指在当前方法内调用自己的这种现象。把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算</span></span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s "><strong>递归的分类:</strong></span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">递归分为两种,直接递归和间接递归。</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">直接递归称为方法自身调用自己。</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。</span></p> </li> </ul> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s "><strong>注意事项</strong><span class="md-plain">:</span></span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">构造方法,禁止递归</span></p> </li> </ul> </li> </ul> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">Demo01DiGui {<br><span><span class="cm-tab"> <span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) {<br><span><span class="cm-tab"> <span class="cm-tab"> <span class="cm-comment">// a();<br><span><span class="cm-tab"> <span class="cm-tab"> <span class="cm-variable">b(<span class="cm-number">1);<br><span><span class="cm-tab"> }<br><span class="cm-tab-wrap-hack"><span class="cm-tab"> <br><span><span class="cm-tab"> <span class="cm-comment">/*<br><span><span class="cm-tab"> <span class="cm-comment">* 3.构造方法,禁止递归<br><span><span class="cm-tab"> <span class="cm-comment">* 编译报错:构造方法是创建对象使用的,不能让对象一直创建下去<br><span><span class="cm-tab"> <span class="cm-comment">*/<br><span><span class="cm-tab"> <span class="cm-keyword">public <span class="cm-variable">Demo01DiGui() {<br><span><span class="cm-tab"> <span class="cm-tab"> <span class="cm-comment">//Demo01DiGui();<br><span><span class="cm-tab"> }<br><span><span>​<br><span><span>​<br><span><span class="cm-tab"> <span class="cm-comment">/*<br><span><span class="cm-tab"> <span class="cm-comment">* 2.在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。<br><span><span class="cm-tab"> <span class="cm-comment">* 4993<br><span class="cm-tab-wrap-hack"><span class="cm-tab"> <span class="cm-comment">* <span class="cm-tab"> Exception in thread "main" java.lang.StackOverflowError<br><span><span class="cm-tab"> <span class="cm-comment">*/<br><span><span class="cm-tab"> <span class="cm-keyword">private <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">b(<span class="cm-variable-3">int <span class="cm-variable">i) {<br><span><span class="cm-tab"> <span class="cm-tab"> <span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">i);<br><span><span class="cm-tab"> <span class="cm-tab"> <span class="cm-comment">//添加一个递归结束的条件,i==5000的时候结束<br><span><span class="cm-tab"> <span class="cm-tab"> <span class="cm-keyword">if(<span class="cm-variable">i<span class="cm-operator">==<span class="cm-number">5000){<br><span><span class="cm-tab"> <span class="cm-tab"> <span class="cm-tab"> <span class="cm-keyword">return;<span class="cm-comment">//结束方法<br><span><span class="cm-tab"> <span class="cm-tab"> }<br><span><span class="cm-tab"> <span class="cm-tab"> <span class="cm-variable">b(<span class="cm-operator">++<span class="cm-variable">i);<br><span><span class="cm-tab"> }<br><span><span>​<br><span><span class="cm-tab"> <span class="cm-comment">/*<br><span><span class="cm-tab"> <span class="cm-comment">* 1.递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。 Exception in thread "main"<br><span><span class="cm-tab"> <span class="cm-comment">* java.lang.StackOverflowError<br><span><span class="cm-tab"> <span class="cm-comment">*/<br><span><span class="cm-tab"> <span class="cm-keyword">private <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">a() {<br><span><span class="cm-tab"> <span class="cm-tab"> <span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"a方法");<br><span><span class="cm-tab"> <span class="cm-tab"> <span class="cm-variable">a();<br><span><span class="cm-tab"> }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> <h3 class="md-end-block md-heading"><span class="md-plain">2.2 递归累加求和 </span></h3> <h4 class="md-end-block md-heading"><span class="md-plain">计算1 ~ n的和</span></h4> <p class="md-end-block md-p"><span class="md-pair-s "><strong>分析</strong><span class="md-plain">:num的累和 = num + (num-1)的累和,所以可以把累和的操作定义成一个方法,递归调用。</span></span></p> <p class="md-end-block md-p"><span class="md-pair-s "><strong>实现代码</strong><span class="md-plain">:</span></span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">DiGuiDemo {<br><span><span class="cm-tab"> <span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) {<br><span><span class="cm-tab"> <span class="cm-tab"> <span class="cm-comment">//计算1~num的和,使用递归完成<br><span><span class="cm-tab"> <span class="cm-tab"> <span class="cm-variable-3">int <span class="cm-variable">num <span class="cm-operator">= <span class="cm-number">5;<br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">// 调用求和的方法<br><span><span class="cm-tab"> <span class="cm-tab"> <span class="cm-variable-3">int <span class="cm-variable">sum <span class="cm-operator">= <span class="cm-variable">getSum(<span class="cm-variable">num);<br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">// 输出结果<br><span><span class="cm-tab"> <span class="cm-tab"> <span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">sum);<br><span class="cm-tab-wrap-hack"><span class="cm-tab"> <span class="cm-tab"> <br><span><span class="cm-tab"> }<br><span> <span class="cm-tab"> <span class="cm-comment">/*<br><span> <span class="cm-tab"> &nbsp;<span class="cm-comment">通过递归算法实现.<br><span> <span class="cm-tab"> &nbsp;<span class="cm-comment">参数列表:int <br><span> <span class="cm-tab"> &nbsp;<span class="cm-comment">返回值类型: int <br><span> <span class="cm-tab"> <span class="cm-comment">*/<br><span><span class="cm-tab"> <span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">int <span class="cm-variable">getSum(<span class="cm-variable-3">int <span class="cm-variable">num) {<br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">/* <br><span> &nbsp; &nbsp; <span class="cm-tab"> &nbsp; <span class="cm-comment">num为1时,方法返回1,<br><span> &nbsp; &nbsp; <span class="cm-tab"> &nbsp; <span class="cm-comment">相当于是方法的出口,num总有是1的情况<br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">*/<br><span><span class="cm-tab"> <span class="cm-tab"> <span class="cm-keyword">if(<span class="cm-variable">num <span class="cm-operator">== <span class="cm-number">1){<br><span><span class="cm-tab"> <span class="cm-tab"> <span class="cm-tab"> <span class="cm-keyword">return <span class="cm-number">1;<br><span><span class="cm-tab"> <span class="cm-tab"> }<br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">/*<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">num不为1时,方法返回 num +(num-1)的累和<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">递归调用getSum方法<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">*/<br><span><span class="cm-tab"> <span class="cm-tab"> <span class="cm-keyword">return <span class="cm-variable">num <span class="cm-operator">+ <span class="cm-variable">getSum(<span class="cm-variable">num<span class="cm-operator">-<span class="cm-number">1);<br><span><span class="cm-tab"> }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> <h4 class="md-end-block md-heading"><span class="md-plain">代码执行图解</span></h4> <p><span class="md-plain"><img src="https://img2020.cnblogs.com/blog/1802031/202103/1802031-20210307165128815-300220497.png" alt="" loading="lazy"></span></p> <blockquote> <p class="md-end-block md-p"><span class="md-plain">小贴士:递归一定要有条件限定,保证递归能够停止下来,次数不要太多,否则会发生栈内存溢出。</span></p> </blockquote> <h3 class="md-end-block md-heading"><span class="md-plain">2.3 递归求阶乘</span></h3> <ul class="ul-list" data-mark="*"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s "><strong>阶乘</strong><span class="md-plain">:所有小于及等于该数的正整数的积。</span></span></p> </li> </ul> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-variable">n的阶乘:n<span class="cm-operator">! <span class="cm-operator">= <span class="cm-variable">n <span class="cm-operator">* (<span class="cm-variable">n<span class="cm-operator">-<span class="cm-number">1) <span class="cm-operator">*...<span class="cm-operator">* <span class="cm-number">3 <span class="cm-operator">* <span class="cm-number">2 <span class="cm-operator">* <span class="cm-number">1 </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> <p class="md-end-block md-p"><span class="md-pair-s "><strong>分析</strong><span class="md-plain">:这与累和类似,只不过换成了乘法运算,学员可以自己练习,需要注意阶乘值符合int类型的范围。</span></span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span>推理得出:n! = n * (n-1)!</span></pre> <p class="md-end-block md-p"><span class="md-pair-s "><strong>代码实现</strong><span class="md-plain">:</span></span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">DiGuiDemo {<br><span> <span class="cm-tab"> <span class="cm-comment">//计算n的阶乘,使用递归完成<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">int <span class="cm-variable">n <span class="cm-operator">= <span class="cm-number">3;<br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">// 调用求阶乘的方法<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">int <span class="cm-variable">value <span class="cm-operator">= <span class="cm-variable">getValue(<span class="cm-variable">n);<br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">// 输出结果<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"阶乘为:"<span class="cm-operator">+ <span class="cm-variable">value);<br><span> &nbsp; }<br><span><span class="cm-tab"> <span class="cm-comment">/*<br><span> <span class="cm-tab"> &nbsp;<span class="cm-comment">通过递归算法实现.<br><span> <span class="cm-tab"> &nbsp;<span class="cm-comment">参数列表:int <br><span> <span class="cm-tab"> &nbsp;<span class="cm-comment">返回值类型: int <br><span> <span class="cm-tab"> <span class="cm-comment">*/<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">int <span class="cm-variable">getValue(<span class="cm-variable-3">int <span class="cm-variable">n) {<br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">// 1的阶乘为1<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if (<span class="cm-variable">n <span class="cm-operator">== <span class="cm-number">1) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return <span class="cm-number">1;<br><span> &nbsp; &nbsp; &nbsp; }<br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">/*<br><span> &nbsp; &nbsp; <span class="cm-tab"> &nbsp;<span class="cm-comment">n不为1时,方法返回 n! = n*(n-1)!<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">递归调用getValue方法<br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">*/<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return <span class="cm-variable">n <span class="cm-operator">* <span class="cm-variable">getValue(<span class="cm-variable">n <span class="cm-operator">- <span class="cm-number">1);<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> <h3 class="md-end-block md-heading"><span class="md-plain">2.4 递归打印多级目录</span></h3> <p class="md-end-block md-p"><span class="md-pair-s "><strong>分析</strong><span class="md-plain">:多级目录的打印,就是当目录的嵌套。遍历之前,无从知道到底有多少级目录,所以我们还是要使用递归实现。</span></span></p> <p class="md-end-block md-p"><span class="md-pair-s "><strong>代码实现</strong><span class="md-plain">:</span></span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">DiGuiDemo2 {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) {<br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">// 创建File对象<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">File <span class="cm-variable">dir &nbsp;<span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">File(<span class="cm-string">"D:\\aaa");<br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">// 调用打印目录方法<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">printDir(<span class="cm-variable">dir);<br><span> &nbsp; }<br><span><span>​<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void &nbsp;<span class="cm-variable">printDir(<span class="cm-variable">File <span class="cm-variable">dir) {<br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">// 获取子文件和目录<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">File[] <span class="cm-variable">files <span class="cm-operator">= <span class="cm-variable">dir.<span class="cm-variable">listFiles();<br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">// 循环打印<br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">/*<br><span> &nbsp; &nbsp; <span class="cm-tab"> &nbsp;<span class="cm-comment">判断:<br><span> &nbsp; &nbsp; <span class="cm-tab"> &nbsp;<span class="cm-comment">当是文件时,打印绝对路径.<br><span> &nbsp; &nbsp; <span class="cm-tab"> &nbsp;<span class="cm-comment">当是目录时,继续调用打印目录的方法,形成递归调用.<br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">*/<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">for (<span class="cm-variable">File <span class="cm-variable">file : <span class="cm-variable">files) {<br><span> &nbsp; <span class="cm-tab"> <span class="cm-tab"> <span class="cm-comment">// 判断<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if (<span class="cm-variable">file.<span class="cm-variable">isFile()) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">// 是文件,输出文件绝对路径<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"文件名:"<span class="cm-operator">+ <span class="cm-variable">file.<span class="cm-variable">getAbsolutePath());<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <span class="cm-keyword">else {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">// 是目录,输出目录绝对路径<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"目录:"<span class="cm-operator">+<span class="cm-variable">file.<span class="cm-variable">getAbsolutePath());<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">// 继续遍历,调用printDir,形成递归<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">printDir(<span class="cm-variable">file);<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br><span> &nbsp; &nbsp; &nbsp; }<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> <h2 class="md-end-block md-heading"><span class="md-plain">三,IO流</span></h2> <h3 class="md-end-block md-heading"><span class="md-plain">3.1 IO流概述和分类</span></h3> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <h4 class="md-end-block md-p"><span class="md-plain">IO流介绍</span></h4> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">IO:输入/输出(Input/Output)</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">流:是一种抽象概念,是对<strong>数据传输</strong>的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">IO流就是用来处理设备间数据传输问题的。常见的应用:文件复制;文件上传;文件下载</span></p> </li> </ul> </li> <li class="md-list-item"> <h4 class="md-end-block md-p"><span class="md-plain">IO流的分类</span></h4> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">按照数据的流向</span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">输入流:读数据</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">输出流:写数据</span></p> </li> </ul> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">按照数据类型来分</span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">字节流</span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">字节输入流</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">字节输出流</span></p> </li> </ul> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">字符流</span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">字符输入流</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">字符输出流</span></p> </li> </ul> </li> </ul> </li> </ul> </li> <li class="md-list-item"> <h4 class="md-end-block md-p"><span class="md-plain">IO流的使用场景</span></h4> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">如果操作的是纯文本文件,优先使用字符流</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">如果操作的是图片、视频、音频等二进制文件。优先使用字节流</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">如果不确定文件类型,优先使用字节流。字节流是万能的流</span></p> </li> </ul> </li> </ul> <h3 class="md-end-block md-heading"><span class="md-plain">3.2 字节流写数据</span></h3> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <h4 class="md-end-block md-p"><span class="md-plain">字节流抽象基类</span></h4> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">InputStream:这个抽象类是表示字节输入流的所有类的超类</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">OutputStream:这个抽象类是表示字节输出流的所有类的超类</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">子类名特点:子类名称都是以其父类名作为子类名的后缀</span></p> </li> </ul> </li> <li class="md-list-item"> <h4 class="md-end-block md-p"><span class="md-plain">字节输出流</span></h4> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">FileOutputStream(String name):创建文件输出流以指定的名称写入文件</span></p> </li> </ul> </li> <li class="md-list-item"> <h4 class="md-end-block md-p"><span class="md-plain">使用字节输出流写数据的步骤</span></h4> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">调用字节输出流对象的写数据方法</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源)</span></p> </li> </ul> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">示例代码</span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">FileOutputStreamDemo01 {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) <span class="cm-keyword">throws <span class="cm-variable">IOException {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//创建字节输出流对象<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//FileOutputStream(String name):创建文件输出流以指定的名称写入文件<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">FileOutputStream <span class="cm-variable">fos <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">FileOutputStream(<span class="cm-string">"myByteStream\\fos.txt");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">/*<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">做了三件事情:<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">A:调用系统功能创建了文件<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">B:创建了字节输出流对象<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">C:让字节输出流对象指向创建好的文件<br><span> &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-comment">*/<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//void write(int b):将指定的字节写入此文件输出流<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">fos.<span class="cm-variable">write(<span class="cm-number">97);<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; fos.write(57);<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; fos.write(55);<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//最后都要释放资源<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//void close():关闭此文件输出流并释放与此流相关联的任何系统资源。<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">fos.<span class="cm-variable">close();<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> </li> </ul> <h3 class="md-end-block md-heading"><span class="md-plain">3.3 字节流写数据的三种方式</span></h3> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">写数据的方法分类</span></p> <table class="md-table"> <thead> <tr class="md-end-block"> <th><span class="td-span"><span class="md-plain">方法名</span></span></th> <th><span class="td-span"><span class="md-plain">说明</span></span></th> </tr> </thead> <tbody> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">void write(int b)</span></span></td> <td><span class="td-span"><span class="md-plain">将指定的字节写入此文件输出流 一次写一个字节数据</span></span></td> </tr> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">void write(byte[] b)</span></span></td> <td><span class="td-span"><span class="md-plain">将 b.length字节从指定的字节数组写入此文件输出流 一次写一个字节数组数据</span></span></td> </tr> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">void write(byte[] b, int off, int len)</span></span></td> <td><span class="td-span"><span class="md-plain">将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流 一次写一个字节数组的部分数据</span></span></td> </tr> </tbody> </table> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">示例代码</span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">FileOutputStreamDemo02 {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) <span class="cm-keyword">throws <span class="cm-variable">IOException {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//FileOutputStream(String name):创建文件输出流以指定的名称写入文件<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">FileOutputStream <span class="cm-variable">fos <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">FileOutputStream(<span class="cm-string">"myByteStream\\fos.txt");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//new File(name)<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; FileOutputStream fos = new FileOutputStream(new File("myByteStream\\fos.txt"));<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//FileOutputStream(File file):创建文件输出流以写入由指定的 File对象表示的文件<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; File file = new File("myByteStream\\fos.txt");<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; FileOutputStream fos2 = new FileOutputStream(file);<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; FileOutputStream fos2 = new FileOutputStream(new File("myByteStream\\fos.txt"));<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//void write(int b):将指定的字节写入此文件输出流<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; fos.write(97);<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; fos.write(98);<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; fos.write(99);<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; fos.write(100);<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; fos.write(101);<br><span><span>​<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; void write(byte[] b):将 b.length字节从指定的字节数组写入此文件输出流<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; byte[] bys = {97, 98, 99, 100, 101};<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//byte[] getBytes():返回字符串对应的字节数组<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">byte[] <span class="cm-variable">bys <span class="cm-operator">= <span class="cm-string">"abcde".<span class="cm-variable">getBytes();<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; fos.write(bys);<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//void write(byte[] b, int off, int len):将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; fos.write(bys,0,bys.length);<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">fos.<span class="cm-variable">write(<span class="cm-variable">bys,<span class="cm-number">1,<span class="cm-number">3);<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//释放资源<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">fos.<span class="cm-variable">close();<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> </li> </ul> <h3 class="md-end-block md-heading"><span class="md-plain">3.4 字节流写数据的两个小问题</span></h3> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">字节流写数据如何实现换行</span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">windows:\r\n</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">linux:\n</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">mac:\r</span></p> </li> </ul> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">字节流写数据如何实现追加写入</span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">public FileOutputStream(String name,boolean append)</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">创建文件输出流以指定的名称写入文件。如果第二个参数为true ,则字节将写入文件的末尾而不是开头</span></p> </li> </ul> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">示例代码</span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">FileOutputStreamDemo03 {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) <span class="cm-keyword">throws <span class="cm-variable">IOException {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//创建字节输出流对象<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; FileOutputStream fos = new FileOutputStream("myByteStream\\fos.txt");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">FileOutputStream <span class="cm-variable">fos <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">FileOutputStream(<span class="cm-string">"myByteStream\\fos.txt",<span class="cm-atom">true);<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//写数据<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">for (<span class="cm-variable-3">int <span class="cm-variable">i <span class="cm-operator">= <span class="cm-number">0; <span class="cm-variable">i <span class="cm-operator">&lt; <span class="cm-number">10; <span class="cm-variable">i<span class="cm-operator">++) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">fos.<span class="cm-variable">write(<span class="cm-string">"hello".<span class="cm-variable">getBytes());<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">fos.<span class="cm-variable">write(<span class="cm-string">"\r\n".<span class="cm-variable">getBytes());<br><span> &nbsp; &nbsp; &nbsp; }<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//释放资源<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">fos.<span class="cm-variable">close();<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> </li> </ul> <h3 class="md-end-block md-heading"><span class="md-plain">3.5 字节流写数据加异常处理</span></h3> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">异常处理格式</span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">try-catch-finally</span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">try{<br><span><span class="cm-tab"> <span class="cm-variable">可能出现异常的代码;<br><span>}<span class="cm-keyword">catch(<span class="cm-variable">异常类名 <span class="cm-variable">变量名){<br><span><span class="cm-tab"> <span class="cm-variable">异常的处理代码;<br><span>}<span class="cm-keyword">finally{<br><span><span class="cm-tab"> <span class="cm-variable">执行所有清除操作;<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">finally特点</span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">被finally控制的语句一定会执行,除非JVM退出</span></p> </li> </ul> </li> </ul> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">示例代码</span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">FileOutputStreamDemo04 {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//加入finally来实现释放资源<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">FileOutputStream <span class="cm-variable">fos <span class="cm-operator">= <span class="cm-atom">null;<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">try {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">fos <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">FileOutputStream(<span class="cm-string">"myByteStream\\fos.txt");<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">fos.<span class="cm-variable">write(<span class="cm-string">"hello".<span class="cm-variable">getBytes());<br><span> &nbsp; &nbsp; &nbsp; } <span class="cm-keyword">catch (<span class="cm-variable">IOException <span class="cm-variable">e) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">e.<span class="cm-variable">printStackTrace();<br><span> &nbsp; &nbsp; &nbsp; } <span class="cm-keyword">finally {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if(<span class="cm-variable">fos <span class="cm-operator">!= <span class="cm-atom">null) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">try {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">fos.<span class="cm-variable">close();<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <span class="cm-keyword">catch (<span class="cm-variable">IOException <span class="cm-variable">e) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">e.<span class="cm-variable">printStackTrace();<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br><span> &nbsp; &nbsp; &nbsp; }<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> </li> </ul> <h3 class="md-end-block md-heading"><span class="md-plain">3.6 字节流读数据(一次读一个字节数据)</span></h3> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <h4 class="md-end-block md-p"><span class="md-plain">字节输入流</span></h4> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream ,该文件由文件系统中的路径名name命名</span></p> </li> </ul> </li> <li class="md-list-item"> <h4 class="md-end-block md-p"><span class="md-plain">字节输入流读取数据的步骤</span></h4> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">创建字节输入流对象</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">调用字节输入流对象的读数据方法</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">释放资源</span></p> </li> </ul> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">示例代码</span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">FileInputStreamDemo01 {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) <span class="cm-keyword">throws <span class="cm-variable">IOException {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//创建字节输入流对象<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//FileInputStream(String name)<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">FileInputStream <span class="cm-variable">fis <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">FileInputStream(<span class="cm-string">"myByteStream\\fos.txt");<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">int <span class="cm-variable">by;<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">/*<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">fis.read():读数据<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">by=fis.read():把读取到的数据赋值给by<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">by != -1:判断读取到的数据是否是-1<br><span> &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-comment">*/<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">while ((<span class="cm-variable">by<span class="cm-operator">=<span class="cm-variable">fis.<span class="cm-variable">read())<span class="cm-operator">!=-<span class="cm-number">1) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">print((<span class="cm-variable-3">char)<span class="cm-variable">by);<br><span> &nbsp; &nbsp; &nbsp; }<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//释放资源<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">fis.<span class="cm-variable">close();<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> </li> </ul> <h3 class="md-end-block md-heading"><span class="md-plain">3.7 字节流复制文本文件</span></h3> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">案例需求</span></p> <p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">把“E:<span>\<span class="md-plain">itcast<span>\<span class="md-plain">窗里窗外.txt”复制到模块目录下的“窗里窗外.txt”</span></span></span></span></span></span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">实现步骤</span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">复制文本文件,其实就把文本文件的内容从一个文件中读取出来(数据源),然后写入到另一个文件中(目的地)</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">数据源:</span></p> <p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">E:<span>\<span class="md-plain">itcast<span>\<span class="md-plain">窗里窗外.txt --- 读数据 --- InputStream --- FileInputStream </span></span></span></span></span></span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">目的地:</span></p> <p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">myByteStream<span>\<span class="md-plain">窗里窗外.txt --- 写数据 --- OutputStream --- FileOutputStream</span></span></span></span></p> </li> </ul> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">代码实现</span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">CopyTxtDemo {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) <span class="cm-keyword">throws <span class="cm-variable">IOException {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//根据数据源创建字节输入流对象<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">FileInputStream <span class="cm-variable">fis <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">FileInputStream(<span class="cm-string">"E:\\itcast\\窗里窗外.txt");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//根据目的地创建字节输出流对象<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">FileOutputStream <span class="cm-variable">fos <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">FileOutputStream(<span class="cm-string">"myByteStream\\窗里窗外.txt");<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//读写数据,复制文本文件(一次读取一个字节,一次写入一个字节)<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">int <span class="cm-variable">by;<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">while ((<span class="cm-variable">by<span class="cm-operator">=<span class="cm-variable">fis.<span class="cm-variable">read())<span class="cm-operator">!=-<span class="cm-number">1) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">fos.<span class="cm-variable">write(<span class="cm-variable">by);<br><span> &nbsp; &nbsp; &nbsp; }<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//释放资源<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">fos.<span class="cm-variable">close();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">fis.<span class="cm-variable">close();<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> </li> </ul> <h3 class="md-end-block md-heading"><span class="md-plain">3.8 字节流读数据(一次读一个字节数组数据)</span></h3> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">一次读一个字节数组的方法</span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">public int read(byte[] b):从输入流读取最多b.length个字节的数据</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">返回的是读入缓冲区的总字节数,也就是实际的读取字节个数</span></p> </li> </ul> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">示例代码</span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">FileInputStreamDemo02 {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) <span class="cm-keyword">throws <span class="cm-variable">IOException {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//创建字节输入流对象<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">FileInputStream <span class="cm-variable">fis <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">FileInputStream(<span class="cm-string">"myByteStream\\fos.txt");<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">/*<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">hello\r\n<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">world\r\n<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">第一次:hello<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">第二次:\r\nwor<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">第三次:ld\r\nr<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-comment">*/<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">byte[] <span class="cm-variable">bys <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable-3">byte[<span class="cm-number">1024]; <span class="cm-comment">//1024及其整数倍<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">int <span class="cm-variable">len;<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">while ((<span class="cm-variable">len<span class="cm-operator">=<span class="cm-variable">fis.<span class="cm-variable">read(<span class="cm-variable">bys))<span class="cm-operator">!=-<span class="cm-number">1) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">print(<span class="cm-keyword">new <span class="cm-variable-3">String(<span class="cm-variable">bys,<span class="cm-number">0,<span class="cm-variable">len));<br><span> &nbsp; &nbsp; &nbsp; }<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//释放资源<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">fis.<span class="cm-variable">close();<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> </li> </ul> <h2 class="md-end-block md-heading"><span class="md-plain">四,IO流扩展</span></h2> <h3 class="md-end-block md-heading md-focus"><span class="md-plain md-expand">字节缓冲流构造方法</span></h3> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <h4 class="md-end-block md-p"><span class="md-plain">字节缓冲流介绍</span></h4> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">lBufferOutputStream:该类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">lBufferedInputStream:创建BufferedInputStream将创建一个内部缓冲区数组。 当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节</span></p> </li> </ul> </li> <li class="md-list-item"> <h4 class="md-end-block md-p"><span class="md-plain">构造方法:</span></h4> <table class="md-table"> <thead> <tr class="md-end-block"> <th><span class="td-span"><span class="md-plain">方法名</span></span></th> <th><span class="td-span"><span class="md-plain">说明</span></span></th> </tr> </thead> <tbody> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">BufferedOutputStream(OutputStream out)</span></span></td> <td><span class="td-span"><span class="md-plain">创建字节缓冲输出流对象</span></span></td> </tr> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">BufferedInputStream(InputStream in)</span></span></td> <td><span class="td-span"><span class="md-plain">创建字节缓冲输入流对象</span></span></td> </tr> </tbody> </table> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">示例代码</span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">BufferStreamDemo {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) <span class="cm-keyword">throws <span class="cm-variable">IOException {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//字节缓冲输出流:BufferedOutputStream(OutputStream out)<br><span> <br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">BufferedOutputStream <span class="cm-variable">bos <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">BufferedOutputStream(<span class="cm-keyword">new <span class="cm-tab"> <span class="cm-tab"> <span class="cm-tab"> <span class="cm-tab"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">FileOutputStream(<span class="cm-string">"myByteStream\\bos.txt"));<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//写数据<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">bos.<span class="cm-variable">write(<span class="cm-string">"hello\r\n".<span class="cm-variable">getBytes());<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">bos.<span class="cm-variable">write(<span class="cm-string">"world\r\n".<span class="cm-variable">getBytes());<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//释放资源<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">bos.<span class="cm-variable">close();<br><span> &nbsp; &nbsp;<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//字节缓冲输入流:BufferedInputStream(InputStream in)<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">BufferedInputStream <span class="cm-variable">bis <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">BufferedInputStream(<span class="cm-keyword">new &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">FileInputStream(<span class="cm-string">"myByteStream\\bos.txt"));<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//一次读取一个字节数据<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; int by;<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; while ((by=bis.read())!=-1) {<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.print((char)by);<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; }<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//一次读取一个字节数组数据<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">byte[] <span class="cm-variable">bys <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable-3">byte[<span class="cm-number">1024];<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">int <span class="cm-variable">len;<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">while ((<span class="cm-variable">len<span class="cm-operator">=<span class="cm-variable">bis.<span class="cm-variable">read(<span class="cm-variable">bys))<span class="cm-operator">!=-<span class="cm-number">1) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">print(<span class="cm-keyword">new <span class="cm-variable-3">String(<span class="cm-variable">bys,<span class="cm-number">0,<span class="cm-variable">len));<br><span> &nbsp; &nbsp; &nbsp; }<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//释放资源<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">bis.<span class="cm-variable">close();<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> </li> </ul> <h3 class="md-end-block md-heading"><span class="md-plain">字节流复制视频</span></h3> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">案例需求</span></p> <p class="md-end-block md-p"><span class="md-plain">把“E:<span>\<span class="md-plain">itcast<span>\<span class="md-plain">字节流复制图片.avi”复制到模块目录下的“字节流复制图片.avi”</span></span></span></span></span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">实现步骤</span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">根据数据源创建字节输入流对象</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">根据目的地创建字节输出流对象</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">读写数据,复制视频</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">释放资源</span></p> </li> </ul> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">代码实现</span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">CopyAviDemo {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) <span class="cm-keyword">throws <span class="cm-variable">IOException {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//记录开始时间<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">long <span class="cm-variable">startTime <span class="cm-operator">= <span class="cm-variable">System.<span class="cm-variable">currentTimeMillis();<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//复制视频<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; method1();<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; method2();<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; method3();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">method4();<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//记录结束时间<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">long <span class="cm-variable">endTime <span class="cm-operator">= <span class="cm-variable">System.<span class="cm-variable">currentTimeMillis();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"共耗时:" <span class="cm-operator">+ (<span class="cm-variable">endTime <span class="cm-operator">- <span class="cm-variable">startTime) <span class="cm-operator">+ <span class="cm-string">"毫秒");<br><span> &nbsp; }<br><span><span>​<br><span> &nbsp; &nbsp;<span class="cm-comment">//字节缓冲流一次读写一个字节数组<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">method4() <span class="cm-keyword">throws <span class="cm-variable">IOException {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">BufferedInputStream <span class="cm-variable">bis <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">BufferedInputStream(<span class="cm-keyword">new <span class="cm-variable">FileInputStream(<span class="cm-string">"E:\\itcast\\字节流复制图片.avi"));<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">BufferedOutputStream <span class="cm-variable">bos <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">BufferedOutputStream(<span class="cm-keyword">new <span class="cm-variable">FileOutputStream(<span class="cm-string">"myByteStream\\字节流复制图片.avi"));<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">byte[] <span class="cm-variable">bys <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable-3">byte[<span class="cm-number">1024];<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">int <span class="cm-variable">len;<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">while ((<span class="cm-variable">len<span class="cm-operator">=<span class="cm-variable">bis.<span class="cm-variable">read(<span class="cm-variable">bys))<span class="cm-operator">!=-<span class="cm-number">1) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">bos.<span class="cm-variable">write(<span class="cm-variable">bys,<span class="cm-number">0,<span class="cm-variable">len);<br><span> &nbsp; &nbsp; &nbsp; }<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">bos.<span class="cm-variable">close();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">bis.<span class="cm-variable">close();<br><span> &nbsp; }<br><span><span>​<br><span> &nbsp; &nbsp;<span class="cm-comment">//字节缓冲流一次读写一个字节<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">method3() <span class="cm-keyword">throws <span class="cm-variable">IOException {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">BufferedInputStream <span class="cm-variable">bis <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">BufferedInputStream(<span class="cm-keyword">new <span class="cm-variable">FileInputStream(<span class="cm-string">"E:\\itcast\\字节流复制图片.avi"));<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">BufferedOutputStream <span class="cm-variable">bos <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">BufferedOutputStream(<span class="cm-keyword">new <span class="cm-variable">FileOutputStream(<span class="cm-string">"myByteStream\\字节流复制图片.avi"));<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">int <span class="cm-variable">by;<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">while ((<span class="cm-variable">by<span class="cm-operator">=<span class="cm-variable">bis.<span class="cm-variable">read())<span class="cm-operator">!=-<span class="cm-number">1) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">bos.<span class="cm-variable">write(<span class="cm-variable">by);<br><span> &nbsp; &nbsp; &nbsp; }<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">bos.<span class="cm-variable">close();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">bis.<span class="cm-variable">close();<br><span> &nbsp; }<br><span><span>​<br><span><span>​<br><span> &nbsp; &nbsp;<span class="cm-comment">//基本字节流一次读写一个字节数组<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">method2() <span class="cm-keyword">throws <span class="cm-variable">IOException {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//E:\\itcast\\字节流复制图片.avi<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//模块目录下的 字节流复制图片.avi<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">FileInputStream <span class="cm-variable">fis <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">FileInputStream(<span class="cm-string">"E:\\itcast\\字节流复制图片.avi");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">FileOutputStream <span class="cm-variable">fos <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">FileOutputStream(<span class="cm-string">"myByteStream\\字节流复制图片.avi");<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">byte[] <span class="cm-variable">bys <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable-3">byte[<span class="cm-number">1024];<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">int <span class="cm-variable">len;<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">while ((<span class="cm-variable">len<span class="cm-operator">=<span class="cm-variable">fis.<span class="cm-variable">read(<span class="cm-variable">bys))<span class="cm-operator">!=-<span class="cm-number">1) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">fos.<span class="cm-variable">write(<span class="cm-variable">bys,<span class="cm-number">0,<span class="cm-variable">len);<br><span> &nbsp; &nbsp; &nbsp; }<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">fos.<span class="cm-variable">close();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">fis.<span class="cm-variable">close();<br><span> &nbsp; }<br><span><span>​<br><span> &nbsp; &nbsp;<span class="cm-comment">//基本字节流一次读写一个字节<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">method1() <span class="cm-keyword">throws <span class="cm-variable">IOException {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//E:\\itcast\\字节流复制图片.avi<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//模块目录下的 字节流复制图片.avi<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">FileInputStream <span class="cm-variable">fis <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">FileInputStream(<span class="cm-string">"E:\\itcast\\字节流复制图片.avi");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">FileOutputStream <span class="cm-variable">fos <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">FileOutputStream(<span class="cm-string">"myByteStream\\字节流复制图片.avi");<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">int <span class="cm-variable">by;<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">while ((<span class="cm-variable">by<span class="cm-operator">=<span class="cm-variable">fis.<span class="cm-variable">read())<span class="cm-operator">!=-<span class="cm-number">1) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">fos.<span class="cm-variable">write(<span class="cm-variable">by);<br><span> &nbsp; &nbsp; &nbsp; }<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">fos.<span class="cm-variable">close();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">fis.<span class="cm-variable">close();<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> </li> </ul> <h3 class="md-end-block md-heading"><span class="md-plain">字符流</span></h3> <h3 class="md-end-block md-heading"><span class="md-plain">4.1 为什么会出现字符流</span></h3> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">字符流的介绍</span></p> <p class="md-end-block md-p"><span class="md-plain">由于字节流操作中文不是特别的方便,所以Java就提供字符流</span></p> <p class="md-end-block md-p"><span class="md-plain">字符流 = 字节流 + 编码表</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">中文的字节存储方式</span></p> <p class="md-end-block md-p"><span class="md-plain">用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接成中文,如何识别是中文的呢?</span></p> <p class="md-end-block md-p"><span class="md-plain">汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数</span></p> </li> </ul> <h3 class="md-end-block md-heading"><span class="md-plain">4.2 编码表</span></h3> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">什么是字符集</span></p> <p class="md-end-block md-p"><span class="md-plain">是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等</span></p> <p class="md-end-block md-p"><span class="md-plain">l计算机要准确的存储和识别各种字符集符号,就需要进行字符编码,一套字符集必然至少有一套字符编码。常见字符集有ASCII字符集、GBXXX字符集、Unicode字符集等</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">常见的字符集</span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">ASCII字符集:</span></p> <p class="md-end-block md-p"><span class="md-plain">lASCII:是基于拉丁字母的一套电脑编码系统,用于显示现代英语,主要包括控制字符(回车键、退格、换行键等)和可显示字符(英文大小写字符、阿拉伯数字和西文符号) </span></p> <p class="md-end-block md-p"><span class="md-plain">基本的ASCII字符集,使用7位表示一个字符,共128字符。ASCII的扩展字符集使用8位表示一个字符,共256字符,方便支持欧洲常用字符。是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">GBXXX字符集:</span></p> <p class="md-end-block md-p"><span class="md-plain">GBK:最常用的中文码表。是在GB2312标准基础上的扩展规范,使用了双字节编码方案,共收录了21003个汉字,完全兼容GB2312标准,同时支持繁体汉字以及日韩汉字等</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">Unicode字符集:</span></p> <p class="md-end-block md-p"><span class="md-plain">UTF-8编码:可以用来表示Unicode标准中任意字符,它是电子邮件、网页及其他存储或传送文字的应用 中,优先采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。它使用一至四个字节为每个字符编码</span></p> <p class="md-end-block md-p"><span class="md-plain">编码规则: </span></p> <p class="md-end-block md-p"><span class="md-plain"> 128个US-ASCII字符,只需一个字节编码</span></p> <p class="md-end-block md-p"><span class="md-plain"> 拉丁文等字符,需要二个字节编码</span></p> <p class="md-end-block md-p"><span class="md-plain"> 大部分常用字(含中文),使用三个字节编码</span></p> <p class="md-end-block md-p"><span class="md-plain"> 其他极少使用的Unicode辅助字符,使用四字节编码</span></p> </li> </ul> </li> </ul> <h3 class="md-end-block md-heading"><span class="md-plain">4.3 字符串中的编码解码问题</span></h3> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <h4 class="md-end-block md-p"><span class="md-plain">相关方法</span></h4> <table class="md-table"> <thead> <tr class="md-end-block"> <th><span class="td-span"><span class="md-plain">方法名</span></span></th> <th><span class="td-span"><span class="md-plain">说明</span></span></th> </tr> </thead> <tbody> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">byte[] getBytes()</span></span></td> <td><span class="td-span"><span class="md-plain">使用平台的默认字符集将该 String编码为一系列字节</span></span></td> </tr> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">byte[] getBytes(String charsetName)</span></span></td> <td><span class="td-span"><span class="md-plain">使用指定的字符集将该 String编码为一系列字节</span></span></td> </tr> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">String(byte[] bytes)</span></span></td> <td><span class="td-span"><span class="md-plain">使用平台的默认字符集解码指定的字节数组来创建字符串</span></span></td> </tr> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">String(byte[] bytes, String charsetName)</span></span></td> <td><span class="td-span"><span class="md-plain">通过指定的字符集解码指定的字节数组来创建字符串</span></span></td> </tr> </tbody> </table> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">代码演示</span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">StringDemo {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) <span class="cm-keyword">throws <span class="cm-variable">UnsupportedEncodingException {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//定义一个字符串<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">String <span class="cm-variable">s <span class="cm-operator">= <span class="cm-string">"中国";<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//byte[] bys = s.getBytes(); //[-28, -72, -83, -27, -101, -67]<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//byte[] bys = s.getBytes("UTF-8"); //[-28, -72, -83, -27, -101, -67]<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">byte[] <span class="cm-variable">bys <span class="cm-operator">= <span class="cm-variable">s.<span class="cm-variable">getBytes(<span class="cm-string">"GBK"); <span class="cm-comment">//[-42, -48, -71, -6]<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">Arrays.<span class="cm-variable">toString(<span class="cm-variable">bys));<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//String ss = new String(bys);<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//String ss = new String(bys,"UTF-8");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">String <span class="cm-variable">ss <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable-3">String(<span class="cm-variable">bys,<span class="cm-string">"GBK");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-variable">ss);<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> </li> </ul> <h3 class="md-end-block md-heading"><span class="md-plain">4.4 字符流中的编码解码问题</span></h3> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <h4 class="md-end-block md-p"><span class="md-plain">字符流中和编码解码问题相关的两个类</span></h4> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">InputStreamReader:是从字节流到字符流的桥梁</span></p> <p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">它读取字节,并使用指定的编码将其解码为字符</span></span></p> <p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集</span></span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">OutputStreamWriter:是从字符流到字节流的桥梁</span></p> <p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">是从字符流到字节流的桥梁,使用指定的编码将写入的字符编码为字节</span></span></p> <p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集</span></span></p> </li> </ul> </li> <li class="md-list-item"> <h4 class="md-end-block md-p"><span class="md-plain">构造方法</span></h4> <table class="md-table"> <thead> <tr class="md-end-block"> <th><span class="td-span"><span class="md-plain">方法名</span></span></th> <th><span class="td-span"><span class="md-plain">说明</span></span></th> </tr> </thead> <tbody> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">InputStreamReader(InputStream in)</span></span></td> <td><span class="td-span"><span class="md-plain">使用默认字符编码创建InputStreamReader对象</span></span></td> </tr> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">InputStreamReader(InputStream in,String chatset)</span></span></td> <td><span class="td-span"><span class="md-plain">使用指定的字符编码创建InputStreamReader对象</span></span></td> </tr> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">OutputStreamWriter(OutputStream out)</span></span></td> <td><span class="td-span"><span class="md-plain">使用默认字符编码创建OutputStreamWriter对象</span></span></td> </tr> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">OutputStreamWriter(OutputStream out,String charset)</span></span></td> <td><span class="td-span"><span class="md-plain">使用指定的字符编码创建OutputStreamWriter对象</span></span></td> </tr> </tbody> </table> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">代码演示</span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">ConversionStreamDemo {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) <span class="cm-keyword">throws <span class="cm-variable">IOException {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//OutputStreamWriter osw = new OutputStreamWriter(new &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FileOutputStream("myCharStream\\osw.txt"));<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">OutputStreamWriter <span class="cm-variable">osw <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">OutputStreamWriter(<span class="cm-keyword">new &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">FileOutputStream(<span class="cm-string">"myCharStream\\osw.txt"),<span class="cm-string">"GBK");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">osw.<span class="cm-variable">write(<span class="cm-string">"中国");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">osw.<span class="cm-variable">close();<br><span><span>​<br><span class="cm-tab-wrap-hack"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//InputStreamReader isr = new InputStreamReader(new <span class="cm-tab"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FileInputStream("myCharStream\\osw.txt"));<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">InputStreamReader <span class="cm-variable">isr <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">InputStreamReader(<span class="cm-keyword">new &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">FileInputStream(<span class="cm-string">"myCharStream\\osw.txt"),<span class="cm-string">"GBK");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//一次读取一个字符数据<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">int <span class="cm-variable">ch;<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">while ((<span class="cm-variable">ch<span class="cm-operator">=<span class="cm-variable">isr.<span class="cm-variable">read())<span class="cm-operator">!=-<span class="cm-number">1) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">print((<span class="cm-variable-3">char)<span class="cm-variable">ch);<br><span> &nbsp; &nbsp; &nbsp; }<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">isr.<span class="cm-variable">close();<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> </li> </ul> <h3 class="md-end-block md-heading"><span class="md-plain">4.5 字符流写数据的5种方式</span></h3> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <h4 class="md-end-block md-p"><span class="md-plain">方法介绍</span></h4> <table class="md-table"> <thead> <tr class="md-end-block"> <th><span class="td-span"><span class="md-plain">方法名</span></span></th> <th><span class="td-span"><span class="md-plain">说明</span></span></th> </tr> </thead> <tbody> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">void write(int c)</span></span></td> <td><span class="td-span"><span class="md-plain">写一个字符</span></span></td> </tr> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">void write(char[] cbuf)</span></span></td> <td><span class="td-span"><span class="md-plain">写入一个字符数组</span></span></td> </tr> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">void write(char[] cbuf, int off, int len)</span></span></td> <td><span class="td-span"><span class="md-plain">写入字符数组的一部分</span></span></td> </tr> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">void write(String str)</span></span></td> <td><span class="td-span"><span class="md-plain">写一个字符串</span></span></td> </tr> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">void write(String str, int off, int len)</span></span></td> <td><span class="td-span"><span class="md-plain">写一个字符串的一部分</span></span></td> </tr> </tbody> </table> </li> <li class="md-list-item"> <h4 class="md-end-block md-p"><span class="md-plain">刷新和关闭的方法</span></h4> <table class="md-table"> <thead> <tr class="md-end-block"> <th><span class="td-span"><span class="md-plain">方法名</span></span></th> <th><span class="td-span"><span class="md-plain">说明</span></span></th> </tr> </thead> <tbody> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">flush()</span></span></td> <td><span class="td-span"><span class="md-plain">刷新流,之后还可以继续写数据</span></span></td> </tr> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">close()</span></span></td> <td><span class="td-span"><span class="md-plain">关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据</span></span></td> </tr> </tbody> </table> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">代码演示</span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">OutputStreamWriterDemo {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) <span class="cm-keyword">throws <span class="cm-variable">IOException {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">OutputStreamWriter <span class="cm-variable">osw <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">OutputStreamWriter(<span class="cm-keyword">new <span class="cm-variable">FileOutputStream(<span class="cm-string">"myCharStream\\osw.txt"));<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//void write(int c):写一个字符<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; osw.write(97);<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; osw.write(98);<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; osw.write(99);<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//void writ(char[] cbuf):写入一个字符数组<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">char[] <span class="cm-variable">chs <span class="cm-operator">= {<span class="cm-string">'a', <span class="cm-string">'b', <span class="cm-string">'c', <span class="cm-string">'d', <span class="cm-string">'e'};<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; osw.write(chs);<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//void write(char[] cbuf, int off, int len):写入字符数组的一部分<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; osw.write(chs, 0, chs.length);<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; osw.write(chs, 1, 3);<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//void write(String str):写一个字符串<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; osw.write("abcde");<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//void write(String str, int off, int len):写一个字符串的一部分<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; osw.write("abcde", 0, "abcde".length());<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">osw.<span class="cm-variable">write(<span class="cm-string">"abcde", <span class="cm-number">1, <span class="cm-number">3);<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//释放资源<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">osw.<span class="cm-variable">close();<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> </li> </ul> <h3 class="md-end-block md-heading"><span class="md-plain">4.6 字符流读数据的2种方式</span></h3> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <h4 class="md-end-block md-p"><span class="md-plain">方法介绍</span></h4> <table class="md-table"> <thead> <tr class="md-end-block"> <th><span class="td-span"><span class="md-plain">方法名</span></span></th> <th><span class="td-span"><span class="md-plain">说明</span></span></th> </tr> </thead> <tbody> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">int read()</span></span></td> <td><span class="td-span"><span class="md-plain">一次读一个字符数据</span></span></td> </tr> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">int read(char[] cbuf)</span></span></td> <td><span class="td-span"><span class="md-plain">一次读一个字符数组数据</span></span></td> </tr> </tbody> </table> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">代码演示</span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">InputStreamReaderDemo {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) <span class="cm-keyword">throws <span class="cm-variable">IOException {<br><span> &nbsp; <br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">InputStreamReader <span class="cm-variable">isr <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">InputStreamReader(<span class="cm-keyword">new <span class="cm-variable">FileInputStream(<span class="cm-string">"myCharStream\\ConversionStreamDemo.java"));<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//int read():一次读一个字符数据<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; int ch;<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; while ((ch=isr.read())!=-1) {<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.print((char)ch);<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; }<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//int read(char[] cbuf):一次读一个字符数组数据<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">char[] <span class="cm-variable">chs <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable-3">char[<span class="cm-number">1024];<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">int <span class="cm-variable">len;<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">while ((<span class="cm-variable">len <span class="cm-operator">= <span class="cm-variable">isr.<span class="cm-variable">read(<span class="cm-variable">chs)) <span class="cm-operator">!= <span class="cm-operator">-<span class="cm-number">1) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">print(<span class="cm-keyword">new <span class="cm-variable-3">String(<span class="cm-variable">chs, <span class="cm-number">0, <span class="cm-variable">len));<br><span> &nbsp; &nbsp; &nbsp; }<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//释放资源<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">isr.<span class="cm-variable">close();<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> </li> </ul> <h3 class="md-end-block md-heading"><span class="md-plain">4.7 字符流复制Java文件</span></h3> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">案例需求</span></p> <p class="md-end-block md-p"><span class="md-plain">把模块目录下的“ConversionStreamDemo.java” 复制到模块目录下的“Copy.java”</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">实现步骤</span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">根据数据源创建字符输入流对象</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">根据目的地创建字符输出流对象</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">读写数据,复制文件</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">释放资源</span></p> </li> </ul> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">代码实现</span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">CopyJavaDemo01 {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) <span class="cm-keyword">throws <span class="cm-variable">IOException {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//根据数据源创建字符输入流对象<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">InputStreamReader <span class="cm-variable">isr <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">InputStreamReader(<span class="cm-keyword">new <span class="cm-variable">FileInputStream(<span class="cm-string">"myCharStream\\ConversionStreamDemo.java"));<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//根据目的地创建字符输出流对象<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">OutputStreamWriter <span class="cm-variable">osw <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">OutputStreamWriter(<span class="cm-keyword">new <span class="cm-variable">FileOutputStream(<span class="cm-string">"myCharStream\\Copy.java"));<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//读写数据,复制文件<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//一次读写一个字符数据<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; int ch;<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; while ((ch=isr.read())!=-1) {<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; osw.write(ch);<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; }<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//一次读写一个字符数组数据<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">char[] <span class="cm-variable">chs <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable-3">char[<span class="cm-number">1024];<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">int <span class="cm-variable">len;<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">while ((<span class="cm-variable">len<span class="cm-operator">=<span class="cm-variable">isr.<span class="cm-variable">read(<span class="cm-variable">chs))<span class="cm-operator">!=-<span class="cm-number">1) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">osw.<span class="cm-variable">write(<span class="cm-variable">chs,<span class="cm-number">0,<span class="cm-variable">len);<br><span> &nbsp; &nbsp; &nbsp; }<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//释放资源<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">osw.<span class="cm-variable">close();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">isr.<span class="cm-variable">close();<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> </li> </ul> <h3 class="md-end-block md-heading"><span class="md-plain">4.8 字符流复制Java文件改进版</span></h3> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">案例需求</span></p> <p class="md-end-block md-p"><span class="md-plain">使用便捷流对象,把模块目录下的“ConversionStreamDemo.java” 复制到模块目录下的“Copy.java”</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">实现步骤</span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">根据数据源创建字符输入流对象</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">根据目的地创建字符输出流对象</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">读写数据,复制文件</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">释放资源</span></p> </li> </ul> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">代码实现</span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">CopyJavaDemo02 {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String[] <span class="cm-variable">args) <span class="cm-keyword">throws <span class="cm-variable">IOException {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//根据数据源创建字符输入流对象<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">FileReader <span class="cm-variable">fr <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">FileReader(<span class="cm-string">"myCharStream\\ConversionStreamDemo.java");<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//根据目的地创建字符输出流对象<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">FileWriter <span class="cm-variable">fw <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">FileWriter(<span class="cm-string">"myCharStream\\Copy.java");<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//读写数据,复制文件<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; int ch;<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; while ((ch=fr.read())!=-1) {<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fw.write(ch);<br><span><span class="cm-comment">// &nbsp; &nbsp; &nbsp; }<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">char[] <span class="cm-variable">chs <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable-3">char[<span class="cm-number">1024];<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">int <span class="cm-variable">len;<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">while ((<span class="cm-variable">len<span class="cm-operator">=<span class="cm-variable">fr.<span class="cm-variable">read(<span class="cm-variable">chs))<span class="cm-operator">!=-<span class="cm-number">1) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">fw.<span class="cm-variable">write(<span class="cm-variable">chs,<span class="cm-number">0,<span class="cm-variable">len);<br><span> &nbsp; &nbsp; &nbsp; }<br><span><span>​<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//释放资源<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">fw.<span class="cm-variable">close();<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">fr.<span class="cm-variable">close();<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> </li> </ul> <h3 class="md-end-block md-heading"><span class="md-plain">4.9 字符缓冲流</span></h3> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <h4 class="md-end-block md-p"><span class="md-plain">字符缓冲流介绍</span></h4> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途</span></p> </li> </ul> </li> <li class="md-list-item"> <h4 class="md-end-block md-p"><span class="md-plain">构造方法</span></h4> <table class="md-table"> <thead> <tr class="md-end-block"> <th><span class="td-span"><span class="md-plain">方法名</span></span></th> <th><span class="td-span"><span class="md-plain">说明</span></span></th> </tr> </thead> <tbody> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">BufferedWriter(Writer out)</span></span></td> <td><span class="td-span"><span class="md-plain">创建字符缓冲输出流对象</span></span></td> </tr> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">BufferedReader(Reader in)</span></span></td> <td><span class="td-span"><span class="md-plain">创建字符缓冲输入流对象</span></span></td> </tr> </tbody> </table> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">代码演示</span></p> <pre class="md-fences mock-cm md-end-block">public class BufferedStreamDemo01 { public static void main(String[] args) throws IOException { //BufferedWriter(Writer out) BufferedWriter bw = new BufferedWriter(new FileWriter("myCharStream\\bw.txt")); bw.write("hello\r\n"); bw.write("world\r\n"); bw.close(); //BufferedReader(Reader in) BufferedReader br = new BufferedReader(new FileReader("myCharStream\\bw.txt")); //一次读取一个字符数据 // int ch; // while ((ch=br.read())!=-1) { // System.out.print((char)ch); // } //一次读取一个字符数组数据 char[] chs = new char[1024]; int len; while ((len=br.read(chs))!=-1) { System.out.print(new String(chs,0,len)); } br.close(); } }</pre> </li> </ul> <h3 class="md-end-block md-heading"><span class="md-plain">4.10 字符缓冲流复制Java文件</span></h3> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">案例需求</span></p> <p class="md-end-block md-p"><span class="md-plain">把模块目录下的ConversionStreamDemo.java 复制到模块目录下的 Copy.java</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">实现步骤</span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">根据数据源创建字符缓冲输入流对象</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">根据目的地创建字符缓冲输出流对象</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">读写数据,复制文件,使用字符缓冲流特有功能实现</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">释放资源</span></p> </li> </ul> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">代码实现</span></p> <pre class="md-fences mock-cm md-end-block">public class CopyJavaDemo01 { public static void main(String[] args) throws IOException { //根据数据源创建字符缓冲输入流对象 BufferedReader br = new BufferedReader(new FileReader("myCharStream\\ConversionStreamDemo.java")); //根据目的地创建字符缓冲输出流对象 BufferedWriter bw = new BufferedWriter(new FileWriter("myCharStream\\Copy.java")); //读写数据,复制文件 //一次读写一个字符数据 // int ch; // while ((ch=br.read())!=-1) { // bw.write(ch); // } //一次读写一个字符数组数据 char[] chs = new char[1024]; int len; while ((len=br.read(chs))!=-1) { bw.write(chs,0,len); } //释放资源 bw.close(); br.close(); } }</pre> </li> </ul> <h3 class="md-end-block md-heading"><span class="md-plain">4.11 字符缓冲流特有功能</span></h3> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <h4 class="md-end-block md-p"><span class="md-plain">方法介绍</span></h4> <h5 class="md-end-block md-p"><span class="md-plain">BufferedWriter:</span></h5> <table class="md-table"> <thead> <tr class="md-end-block"> <th><span class="td-span"><span class="md-plain">方法名</span></span></th> <th><span class="td-span"><span class="md-plain">说明</span></span></th> </tr> </thead> <tbody> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">void newLine()</span></span></td> <td><span class="td-span"><span class="md-plain">写一行行分隔符,行分隔符字符串由系统属性定义</span></span></td> </tr> </tbody> </table> <h5 class="md-end-block md-p"><span class="md-plain">BufferedReader:</span></h5> <table class="md-table"> <thead> <tr class="md-end-block"> <th><span class="td-span"><span class="md-plain">方法名</span></span></th> <th><span class="td-span"><span class="md-plain">说明</span></span></th> </tr> </thead> <tbody> <tr class="md-end-block"> <td><span class="td-span"><span class="md-plain">String readLine()</span></span></td> <td><span class="td-span"><span class="md-plain">读一行文字。 结果包含行的内容的字符串,不包括任何行终止字符如果流的结尾已经到达,则为null</span></span></td> </tr> </tbody> </table> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">代码演示</span></p> <pre class="md-fences mock-cm md-end-block">public class BufferedStreamDemo02 { public static void main(String[] args) throws IOException { //创建字符缓冲输出流 BufferedWriter bw = new BufferedWriter(new FileWriter("myCharStream\\bw.txt")); //写数据 for (int i = 0; i &lt; 10; i++) { bw.write("hello" + i); //bw.write("\r\n"); bw.newLine(); bw.flush(); } //释放资源 bw.close(); //创建字符缓冲输入流 BufferedReader br = new BufferedReader(new FileReader("myCharStream\\bw.txt")); String line; while ((line=br.readLine())!=null) { System.out.println(line); } br.close(); } }</pre> </li> </ul> <h3 class="md-end-block md-heading"><span class="md-plain">4.12 字符缓冲流特有功能复制Java文件</span></h3> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">案例需求</span></p> <p class="md-end-block md-p"><span class="md-plain">使用特有功能把模块目录下的ConversionStreamDemo.java 复制到模块目录下的 Copy.java</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">实现步骤</span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">根据数据源创建字符缓冲输入流对象</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">根据目的地创建字符缓冲输出流对象</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">读写数据,复制文件,使用字符缓冲流特有功能实现</span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">释放资源</span></p> </li> </ul> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">代码实现</span></p> <pre class="md-fences mock-cm md-end-block">public class CopyJavaDemo02 { public static void main(String[] args) throws IOException { //根据数据源创建字符缓冲输入流对象 BufferedReader br = new BufferedReader(new FileReader("myCharStream\\ConversionStreamDemo.java")); //根据目的地创建字符缓冲输出流对象 BufferedWriter bw = new BufferedWriter(new FileWriter("myCharStream\\Copy.java")); //读写数据,复制文件 //使用字符缓冲流特有功能实现 String line; while ((line=br.readLine())!=null) { bw.write(line); bw.newLine(); bw.flush(); } //释放资源 bw.close(); br.close(); } }</pre> </li> </ul> <h2 class="md-end-block md-heading"><span class="md-plain">&nbsp;五,打印流和序列</span></h2> <h2>打印流</h2> <p>  <span class="md-plain md-expand">控制台打印输出,是调用<span class="md-pair-s"><code>print</code><span class="md-plain">方法和<span class="md-pair-s"><code>println</code><span class="md-plain">方法完成的,这两个方法都来自于<span class="md-pair-s"><code>java.io.PrintStream</code><span class="md-plain md-expand">类,该类能够方便地打印各种数据类型的值,是一种便捷的输出方式。</span></span></span></span></span></span></span></p> <h3 class="md-end-block md-heading md-focus"><span class="md-plain md-expand">PrintStream类</span></h3> <h3 class="md-end-block md-heading"><span class="md-plain">构造方法</span></h3> <ul class="ul-list" data-mark="*"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s"><code>public PrintStream(String fileName)</code><span class="md-plain">: 使用指定的文件名创建一个新的打印流。</span></span></p> </li> </ul> <p class="md-end-block md-p"><span class="md-plain">构造举例,代码如下: </span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-variable">PrintStream <span class="cm-variable">ps <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">PrintStream(<span class="cm-string">"ps.txt")<span class="cm-variable">;</span></span></span></span></span></span></span></span></pre> <h3 class="md-end-block md-heading"><span class="md-plain">改变打印流向</span></h3> <p class="md-end-block md-p md-focus"><span class="md-pair-s"><code>System.out</code><span class="md-plain">就是<span class="md-pair-s"><code>PrintStream</code><span class="md-plain">类型的,改变它的流向。</span></span></span></span></p> <div class="cnblogs_code"> <pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> PrintDemo { </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> main(String[] args) <span style="color: rgba(0, 0, 255, 1)">throws</span><span style="color: rgba(0, 0, 0, 1)"> IOException { </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 调用系统的打印流,控制台直接输出97</span> System.out.println(97<span style="color: rgba(0, 0, 0, 1)">); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 创建打印流,指定文件的名称</span> PrintStream ps = <span style="color: rgba(0, 0, 255, 1)">new</span> PrintStream("ps.txt"<span style="color: rgba(0, 0, 0, 1)">); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置系统的打印流流向,输出到ps.txt</span> <span style="color: rgba(0, 0, 0, 1)"> System.setOut(ps); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 调用系统的打印流,ps.txt中输出97</span> System.out.println(97<span style="color: rgba(0, 0, 0, 1)">); } }</span></pre> </div> <h2>序列化</h2> <p class="md-end-block md-p"><span class="md-plain">Java 提供了一种对象<span class="md-pair-s "><strong>序列化</strong><span class="md-plain">的机制。用一个字节序列可以表示一个对象,该字节序列包含该<span class="md-pair-s"><code>对象的数据</code><span class="md-plain">、<span class="md-pair-s"><code>对象的类型</code><span class="md-plain">和<span class="md-pair-s"><code>对象中存储的属性</code><span class="md-plain">等信息。字节序列写出到文件之后,相当于文件中<span class="md-pair-s "><strong>持久保存</strong><span class="md-plain">了一个对象的信息。 </span></span></span></span></span></span></span></span></span></span></span></p> <p class="md-end-block md-p"><span class="md-plain">反之,该字节序列还可以从文件中读取回来,重构对象,对它进行<span class="md-pair-s "><strong>反序列化</strong><span class="md-plain">。<span class="md-pair-s"><code>对象的数据</code><span class="md-plain">、<span class="md-pair-s"><code>对象的类型</code><span class="md-plain">和<span class="md-pair-s"><code>对象中存储的数据</code><span class="md-plain">信息,都可以用来在内存中创建对象。看图理解序列化: <span class="md-image md-img-loaded" data-src="img/3_xuliehua.jpg"><img data-local-refresh="true"></span></span></span></span></span></span></span></span></span></span></p> <h3 class="md-end-block md-heading"><span class="md-plain">ObjectOutputStream类</span></h3> <p class="md-end-block md-p"><span class="md-pair-s"><code>java.io.ObjectOutputStream</code><span class="md-plain"> 类,将Java对象的原始数据类型写出到文件,实现对象的持久存储。</span></span></p> <h3 class="md-end-block md-heading"><span class="md-plain">构造方法</span></h3> <ul class="ul-list" data-mark="*"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s"><code>public ObjectOutputStream(OutputStream out)</code><span class="md-plain">: 创建一个指定OutputStream的ObjectOutputStream。</span></span></p> </li> </ul> <p class="md-end-block md-p"><span class="md-plain">构造举例,代码如下: </span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-variable">FileOutputStream <span class="cm-variable">fileOut <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">FileOutputStream(<span class="cm-string">"employee.txt");<br><span><span class="cm-variable">ObjectOutputStream <span class="cm-variable">out <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">ObjectOutputStream(<span class="cm-variable">fileOut);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> <h3 class="md-end-block md-heading"><span class="md-plain">序列化操作</span></h3> <ol class="ol-list" start=""> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">一个对象要想序列化,必须满足两个条件:</span></p> </li> </ol> <ul class="ul-list" data-mark="*"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">该类必须实现<span class="md-pair-s"><code>java.io.Serializable</code><span class="md-plain"> 接口,<span class="md-pair-s"><code>Serializable</code><span class="md-plain"> 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出<span class="md-pair-s"><code>NotSerializableException</code><span class="md-plain"> 。</span></span></span></span></span></span></span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用<span class="md-pair-s"><code>transient</code><span class="md-plain"> 关键字修饰。</span></span></span></p> </li> </ul> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">Employee <span class="cm-keyword">implements <span class="cm-variable">java.<span class="cm-variable">io.<span class="cm-variable">Serializable {<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-variable-3">String <span class="cm-variable">name;<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-variable-3">String <span class="cm-variable">address;<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-keyword">transient <span class="cm-variable-3">int <span class="cm-variable">age; <span class="cm-comment">// transient瞬态修饰成员,不会被序列化<br><span> &nbsp; &nbsp;<span class="cm-keyword">public <span class="cm-variable-3">void <span class="cm-variable">addressCheck() {<br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"Address check : " <span class="cm-operator">+ <span class="cm-variable">name <span class="cm-operator">+ <span class="cm-string">" -- " <span class="cm-operator">+ <span class="cm-variable">address);<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> <p class="md-end-block md-p"><span class="md-plain">2.写出对象方法</span></p> <ul class="ul-list" data-mark="*"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s"><code>public final void writeObject (Object obj)</code><span class="md-plain"> : 将指定的对象写出。</span></span></p> </li> </ul> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">SerializeDemo{<br><span> &nbsp; <span class="cm-tab"> <span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String [] <span class="cm-variable">args) &nbsp; {<br><span> &nbsp; <span class="cm-tab"> <span class="cm-variable">Employee <span class="cm-variable">e <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">Employee();<br><span> &nbsp; <span class="cm-tab"> <span class="cm-variable">e.<span class="cm-variable">name <span class="cm-operator">= <span class="cm-string">"zhangsan";<br><span> &nbsp; <span class="cm-tab"> <span class="cm-variable">e.<span class="cm-variable">address <span class="cm-operator">= <span class="cm-string">"beiqinglu";<br><span> &nbsp; <span class="cm-tab"> <span class="cm-variable">e.<span class="cm-variable">age <span class="cm-operator">= <span class="cm-number">20; <br><span> &nbsp; <span class="cm-tab"> <span class="cm-keyword">try {<br><span> &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-tab"> <span class="cm-comment">// 创建序列化流对象<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ObjectOutputStream <span class="cm-variable">out <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">ObjectOutputStream(<span class="cm-keyword">new <span class="cm-variable">FileOutputStream(<span class="cm-string">"employee.txt"));<br><span> &nbsp; &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">// 写出对象<br><span> &nbsp; &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-variable">out.<span class="cm-variable">writeObject(<span class="cm-variable">e);<br><span> &nbsp; &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">// 释放资源<br><span> &nbsp; &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-variable">out.<span class="cm-variable">close();<br><span> &nbsp; &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-variable">fileOut.<span class="cm-variable">close();<br><span> &nbsp; &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"Serialized data is saved"); <span class="cm-comment">// 姓名,地址被序列化,年龄没有被序列化。<br><span> &nbsp; &nbsp; &nbsp; } <span class="cm-keyword">catch(<span class="cm-variable">IOException <span class="cm-variable">i) &nbsp; {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">i.<span class="cm-variable">printStackTrace();<br><span> &nbsp; &nbsp; &nbsp; }<br><span> &nbsp; <span class="cm-tab"> }<br><span>}<br><span><span class="cm-variable">输出结果:<br><span><span class="cm-variable">Serialized <span class="cm-variable">data <span class="cm-variable">is <span class="cm-variable">saved</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> <h3 class="md-end-block md-heading"><span class="md-plain">ObjectInputStream类</span></h3> <p class="md-end-block md-p"><span class="md-plain">ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象。 </span></p> <h3 class="md-end-block md-heading"><span class="md-plain">构造方法</span></h3> <ul class="ul-list" data-mark="*"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s"><code>public ObjectInputStream(InputStream in)</code><span class="md-plain">: 创建一个指定InputStream的ObjectInputStream。</span></span></p> </li> </ul> <h3 class="md-end-block md-heading"><span class="md-plain">反序列化操作1</span></h3> <p class="md-end-block md-p"><span class="md-plain">如果能找到一个对象的class文件,我们可以进行反序列化操作,调用<span class="md-pair-s"><code>ObjectInputStream</code><span class="md-plain">读取对象的方法:</span></span></span></p> <ul class="ul-list" data-mark="-"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-pair-s"><code>public final Object readObject ()</code><span class="md-plain"> : 读取一个对象。</span></span></p> </li> </ul> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">DeserializeDemo {<br><span> &nbsp; <span class="cm-keyword">public <span class="cm-keyword">static <span class="cm-variable-3">void <span class="cm-variable">main(<span class="cm-variable-3">String [] <span class="cm-variable">args) &nbsp; {<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">Employee <span class="cm-variable">e <span class="cm-operator">= <span class="cm-atom">null;<br><span class="cm-tab-wrap-hack"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">try {<span class="cm-tab"> <span class="cm-tab"> <br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-comment">// 创建反序列化流<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">FileInputStream <span class="cm-variable">fileIn <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">FileInputStream(<span class="cm-string">"employee.txt");<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">ObjectInputStream <span class="cm-variable">in <span class="cm-operator">= <span class="cm-keyword">new <span class="cm-variable">ObjectInputStream(<span class="cm-variable">fileIn);<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-comment">// 读取一个对象<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">e <span class="cm-operator">= (<span class="cm-variable">Employee) <span class="cm-variable">in.<span class="cm-variable">readObject();<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-comment">// 释放资源<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">in.<span class="cm-variable">close();<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">fileIn.<span class="cm-variable">close();<br><span> &nbsp; &nbsp; &nbsp; }<span class="cm-keyword">catch(<span class="cm-variable">IOException <span class="cm-variable">i) {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-comment">// 捕获其他异常<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">i.<span class="cm-variable">printStackTrace();<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-keyword">return;<br><span> &nbsp; &nbsp; &nbsp; }<span class="cm-keyword">catch(<span class="cm-variable">ClassNotFoundException <span class="cm-variable">c) {<br><span> &nbsp; &nbsp; &nbsp; <span class="cm-tab"> <span class="cm-comment">// 捕获类找不到异常<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"Employee class not found");<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">c.<span class="cm-variable">printStackTrace();<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-keyword">return;<br><span> &nbsp; &nbsp; &nbsp; }<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">// 无异常,直接打印输出<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"Name: " <span class="cm-operator">+ <span class="cm-variable">e.<span class="cm-variable">name);<span class="cm-tab"> <span class="cm-comment">// zhangsan<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"Address: " <span class="cm-operator">+ <span class="cm-variable">e.<span class="cm-variable">address); <span class="cm-comment">// beiqinglu<br><span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"age: " <span class="cm-operator">+ <span class="cm-variable">e.<span class="cm-variable">age); <span class="cm-comment">// 0<br><span> &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre> <p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">对于JVM可以反序列化对象,它必须是能够找到class文件的类。如果找不到该类的class文件,则抛出一个 <span class="md-pair-s"><code>ClassNotFoundException</code><span class="md-plain"> 异常。</span></span></span></strong></span></p> <h3 class="md-end-block md-heading"><span class="md-pair-s ">反序列化操作2</span></h3> <p class="md-end-block md-p"><span class="md-pair-s "><strong><span class="md-plain">另外,当JVM反序列化对象时,能找到class文件,但是class文件在序列化对象之后发生了修改,那么反序列化操作也会失败,抛出一个<span class="md-pair-s"><code>InvalidClassException</code><span class="md-plain">异常。</span></span></span></strong><span class="md-plain">发生这个异常的原因如下:</span></span></p> <ul class="ul-list" data-mark="*"> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">该类的序列版本号与从流中读取的类描述符的版本号不匹配 </span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">该类包含未知数据类型 </span></p> </li> <li class="md-list-item"> <p class="md-end-block md-p"><span class="md-plain">该类没有可访问的无参数构造方法 </span></p> </li> </ul> <p class="md-end-block md-p"><span class="md-pair-s"><code>Serializable</code><span class="md-plain"> 接口给需要序列化的类,提供了一个序列版本号。<span class="md-pair-s"><code>serialVersionUID</code><span class="md-plain"> 该版本号的目的在于验证序列化的对象和对应类是否版本匹配。</span></span></span></span></p> <pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span class="cm-keyword">public <span class="cm-keyword">class <span class="cm-def">Employee <span class="cm-keyword">implements <span class="cm-variable">java.<span class="cm-variable">io.<span class="cm-variable">Serializable {<br><span> &nbsp; &nbsp; <span class="cm-comment">// 加入序列版本号<br><span> &nbsp; &nbsp; <span class="cm-keyword">private <span class="cm-keyword">static <span class="cm-keyword">final <span class="cm-variable-3">long <span class="cm-variable">serialVersionUID <span class="cm-operator">= <span class="cm-number">1L;<br><span> &nbsp; &nbsp; <span class="cm-keyword">public <span class="cm-variable-3">String <span class="cm-variable">name;<br><span> &nbsp; &nbsp; <span class="cm-keyword">public <span class="cm-variable-3">String <span class="cm-variable">address;<br><span> &nbsp; &nbsp; <span class="cm-comment">// 添加新的属性 ,重新编译, 可以反序列化,该属性赋为默认值.<br><span> &nbsp; &nbsp; <span class="cm-keyword">public <span class="cm-variable-3">int <span class="cm-variable">eid; <br><span><span>​<br><span> &nbsp; &nbsp; <span class="cm-keyword">public <span class="cm-variable-3">void <span class="cm-variable">addressCheck() {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">System.<span class="cm-variable">out.<span class="cm-variable">println(<span class="cm-string">"Address check : " <span class="cm-operator">+ <span class="cm-variable">name <span class="cm-operator">+ <span class="cm-string">" -- " <span class="cm-operator">+ <span class="cm-variable">address);<br><span> &nbsp; &nbsp; }<br><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>