当前位置: 首页 > news >正文

佛山市住房和建设局网站首页网站的建设运营收费是哪些

佛山市住房和建设局网站首页,网站的建设运营收费是哪些,二次开发是什么意思,网站域名的安全性day19-IO流#xff08;二#xff09; 一、字符流 同学们#xff0c;前面我们学习了字节流#xff0c;使用字节流可以读取文件中的字节数据。但是如果文件中有中文使用字节流来读取#xff0c;就有可能读到半个汉字的情况#xff0c;这样会导致乱码。虽然使用读取全部字…day19-IO流二 一、字符流 同学们前面我们学习了字节流使用字节流可以读取文件中的字节数据。但是如果文件中有中文使用字节流来读取就有可能读到半个汉字的情况这样会导致乱码。虽然使用读取全部字节的方法不会出现乱码但是如果文件过大又不太合适。 所以Java专门为我们提供了另外一种流叫字符流可以字符流是专门为读取文本数据而生的。 1.1 FileReader类 先类学习字符流中的FileReader类这是字符输入流用来将文件中的字符数据读取到程序中来。 FileReader读取文件的步骤如下 第一步创建FileReader对象与要读取的源文件接通 第二步调用read()方法读取文件中的字符 第三步调用close()方法关闭流需要用到的方法先通过构造器创建对象再通过read方法读取数据注意两个read方法的返回值含义不一样 /*** 目标掌握文件字符输入流。*/ public class FileReaderTest1 {public static void main(String[] args) {try (// 1、创建一个文件字符输入流管道与源文件接通Reader fr new FileReader(io-app2\\src\\zhushanglin01.txt);){// 2、一个字符一个字符的读性能较差 // int c; // 记住每次读取的字符编号。 // while ((c fr.read()) ! -1){ // System.out.print((char) c); // }// 每次读取一个字符的形式性能肯定是比较差的。// 3、每次读取多个字符。性能是比较不错的char[] buffer new char[3];int len; // 记住每次读取了多少个字符。while ((len fr.read(buffer)) ! -1){// 读取多少倒出多少System.out.print(new String(buffer, 0, len));}} catch (Exception e) {e.printStackTrace();}} }1.2 FileWriter类 在上节课我们学习了FileReader它可以将文件中的字符数据读取到程序中来。接下来我们就要学习FileWriter了它可以将程序中的字符数据写入文件。 FileWriter往文件中写字符数据的步骤如下 第一步创建FileWirter对象与要读取的目标文件接通 第二步调用write(字符数据/字符数组/字符串)方法读取文件中的字符 第三步调用close()方法关闭流需要用到的方法如下构造器是用来创建FileWriter对象的有了对象才能调用write方法写数据到文件。 接下来用代码演示一下 /*** 目标掌握文件字符输出流写字符数据出去*/ public class FileWriterTest2 {public static void main(String[] args) {try (// 0、创建一个文件字符输出流管道与目标文件接通。// 覆盖管道// Writer fw new FileWriter(io-app2/src/zhushanglin02out.txt);// 追加数据的管道Writer fw new FileWriter(io-app2/src/zhushanglin02out.txt, true);){// 1、public void write(int c):写一个字符出去fw.write(a);fw.write(97);//fw.write(磊); // 写一个字符出去fw.write(\r\n); // 换行// 2、public void write(String c)写一个字符串出去fw.write(我爱你中国abc);fw.write(\r\n);// 3、public void write(String c ,int pos ,int len):写字符串的一部分出去fw.write(我爱你中国abc, 0, 5);fw.write(\r\n);// 4、public void write(char[] buffer):写一个字符数组出去char[] buffer {哈, 特, a, b, c};fw.write(buffer);fw.write(\r\n);// 5、public void write(char[] buffer ,int pos ,int len):写字符数组的一部分出去fw.write(buffer, 0, 2);fw.write(\r\n);} catch (Exception e) {e.printStackTrace();}} }1.3 FileWriter写的注意事项 各位同学刚才我们已经学习了FileWriter字符输出流的基本使用。但是这里有一个小问题需要和同学们说下一FileWriter写完数据之后必须刷新或者关闭写出去的数据才能生效。 比如下面的代码只调用了写数据的方法没有关流的方法。当你打开目标文件时是看不到任何数据的。 //1.创建FileWriter对象 Writer fw new FileWriter(io-app2/src/zhushanglin03out.txt);//2.写字符数据出去 fw.write(a); fw.write(b); fw.write(c);而下面的代码加上了flush()方法之后数据就会立即到目标文件中去。 //1.创建FileWriter对象 Writer fw new FileWriter(io-app2/src/zhushanglin03out.txt);//2.写字符数据出去 fw.write(a); fw.write(b); fw.write(c);//3.刷新 fw.flush(); 下面的代码调用了close()方法数据也会立即到文件中去。因为close()方法在关闭流之前会将内存中缓存的数据先刷新到文件再关流。 //1.创建FileWriter对象 Writer fw new FileWriter(io-app2/src/zhushanglin03out.txt);//2.写字符数据出去 fw.write(a); fw.write(b); fw.write(c);//3.关闭流 fw.close(); //会先刷新再关流但是需要注意的是关闭流之后就不能在对流进行操作了。否则会出异常 二、缓冲流 学习完字符流之后接下来我们学习一下缓冲流。我们还是先来认识一下缓存流再来说一下它的作用。缓冲流有四种如下图所示 缓冲流的作用可以对原始流进行包装提高原始流读写数据的性能。 2.1 缓冲字节流 我们先来学习字节缓冲流是如何提高读写数据的性能的原理如下图所示。是因为在缓冲流的底层自己封装了一个长度为8KB8129byte的字节数组但是缓冲流不能单独使用它需要依赖于原始流。 **读数据时**它先用原始字节输入流一次性读取8KB的数据存入缓冲流内部的数组中ps: 先一次多囤点货再从8KB的字节数组中读取一个字节或者多个字节把消耗屯的货。 写数据时 它是先把数据写到缓冲流内部的8BK的数组中ps: 先攒一车货等数组存满了再通过原始的字节输出流一次性写到目标文件中去把囤好的货一次性运走。 在创建缓冲字节流对象时需要封装一个原始流对象进来。构造方法如下 如果我们用缓冲流复制文件代码写法如下: public class BufferedInputStreamTest1 {public static void main(String[] args) {try (InputStream is new FileInputStream(io-app2/src/zhushanglin01.txt);// 1、定义一个字节缓冲输入流包装原始的字节输入流InputStream bis new BufferedInputStream(is);OutputStream os new FileOutputStream(io-app2/src/zhushanglin01_bak.txt);// 2、定义一个字节缓冲输出流包装原始的字节输出流OutputStream bos new BufferedOutputStream(os);){byte[] buffer new byte[1024];int len;while ((len bis.read(buffer)) ! -1){bos.write(buffer, 0, len);}System.out.println(复制完成);} catch (Exception e) {e.printStackTrace();}} }2.2 字符缓冲流 接下来我们学习另外两个缓冲流——字符缓冲流。它的原理和字节缓冲流是类似的它底层也会有一个8KB的数组但是这里是字符数组。字符缓冲流也不能单独使用它需要依赖于原始字符流一起使用。 **BufferedReader读数据时**它先原始字符输入流一次性读取8KB的数据存入缓冲流内部的数组中ps: 先一次多囤点货再从8KB的字符数组中读取一个字符或者多个字符把消耗屯的货。 创建BufferedReader对象需要用到BufferedReader的构造方法内部需要封装一个原始的字符输入流我们可以传入FileReader. 而且BufferedReader还要特有的方法一次可以读取文本文件中的一行 使用BufferedReader读取数据的代码如下 public class BufferedReaderTest2 {public static void main(String[] args) {try (Reader fr new FileReader(io-app2\\src\\zhushanglin04.txt);// 创建一个字符缓冲输入流包装原始的字符输入流BufferedReader br new BufferedReader(fr);){ // char[] buffer new char[3]; // int len; // while ((len br.read(buffer)) ! -1){ // System.out.print(new String(buffer, 0, len)); // } // System.out.println(br.readLine()); // System.out.println(br.readLine()); // System.out.println(br.readLine()); // System.out.println(br.readLine());String line; // 记住每次读取的一行数据while ((line br.readLine()) ! null){System.out.println(line);}} catch (Exception e) {e.printStackTrace();}} }BufferedWriter写数据时 它是先把数据写到字符缓冲流内部的8BK的数组中ps: 先攒一车货等数组存满了再通过原始的字符输出流一次性写到目标文件中去把囤好的货一次性运走。如下图所示 创建BufferedWriter对象时需要用到BufferedWriter的构造方法而且内部需要封装一个原始的字符输出流我们这里可以传递FileWriter。 而且BufferedWriter新增了一个功能可以用来写一个换行符 接下来用代码演示一下使用BufferedWriter往文件中写入字符数据。 public class BufferedWriterTest3 {public static void main(String[] args) {try (Writer fw new FileWriter(io-app2/src/zhushanglin05out.txt, true);// 创建一个字符缓冲输出流管道包装原始的字符输出流BufferedWriter bw new BufferedWriter(fw);){bw.write(a);bw.write(97);bw.write(磊);bw.newLine();bw.write(我爱你中国abc);bw.newLine();} catch (Exception e) {e.printStackTrace();}} }2.3 缓冲流性能分析 我们说缓冲流内部多了一个数组可以提高原始流的读写性能。讲到这一定有同学有这么一个疑问它和我们使用原始流自己加一个8BK数组不是一样的吗 缓冲流就一定能提高性能吗先告诉同学们答案缓冲流不一定能提高性能。 下面我们用一个比较大文件889MB复制做性能测试分别使用下面四种方式来完成文件复制并记录文件复制的时间。 ① 使用低级流一个字节一个字节的复制 ② 使用低级流按照字节数组的形式复制 ③ 使用缓冲流一个字节一个字节的复制 ④ 使用缓冲流按照字节数组的形式复制 低级流一个字节复制: 慢得简直让人无法忍受 低级流按照字节数组复制(数组长度1024): 12.117s 缓冲流一个字节复制: 11.058s 缓冲流按照字节数组复制(数组长度1024): 2.163s 【注意这里的测试只能做一个参考和电脑性能也有直接关系】经过上面的测试我们可以得出一个结论默认情况下采用一次复制1024个字节缓冲流完胜。 但是缓冲流就一定性能高吗我们采用一次复制8192个字节试试 低级流按照字节数组复制(数组长度8192): 2.535s 缓冲流按照字节数组复制(数组长度8192): 2.088s经过上面的测试我们可以得出一个结论**一次读取8192个字节时低级流和缓冲流性能相当。**相差的那几毫秒可以忽略不计。 继续把数组变大看一看缓冲流就一定性能高吗现在采用一次读取1024*32个字节数据试试 低级流按照字节数组复制(数组长度8192): 1.128s 缓冲流按照字节数组复制(数组长度8192): 1.133s经过上面的测试我们可以得出一个结论**数组越大性能越高低级流和缓冲流性能相当。**相差的那几秒可以忽略不计。 继续把数组变大看一看缓冲流就一定性能高吗现在采用一次读取1024*6个字节数据试试 低级流按照字节数组复制(数组长度8192): 1.039s 缓冲流按照字节数组复制(数组长度8192): 1.151s此时你会发现当数组大到一定程度性能已经提高了多少了甚至缓冲流的性能还没有低级流高。 最终总结一下**缓冲流的性能不一定比低级流高其实低级流自己加一个数组性能其实是不差。**只不过缓冲流帮你加了一个相对而言大小比较合理的数组 。 三、转换流 前面我们学习过FileReader读取文件中的字符但是同学们注意了FileReader默认只能读取UTF-8编码格式的文件。如果使用FileReader读取GBK格式的文件可能存在乱码因为FileReader它遇到汉字默认是按照3个字节来读取的而GBK格式的文件一个汉字是占2个字节这样就会导致乱码。 Java给我们提供了另外两种流InputStreamReaderOutputStreamWriter这两个流我们把它叫做转换流。它们可以将字节流转换为字符流并且可以指定编码方案。 3.1 InputStreamReader类 接下来我们先学习InputStreamReader类你看这个类名就比较有意思前面是InputStream表示字节输入流后面是Reader表示字符输入流合在一起意思就是表示可以把InputStream转换为Reader最终InputStreamReader其实也是Reader的子类所以也算是字符输入流。 InputStreamReader也是不能单独使用的它内部需要封装一个InputStream的子类对象再指定一个编码表如果不指定编码表默认会按照UTF-8形式进行转换。 需求我们可以先准备一个GBK格式的文件然后使用下面的代码进行读取看是是否有乱码。 public class InputStreamReaderTest2 {public static void main(String[] args) {try (// 1、得到文件的原始字节流GBK的字节流形式InputStream is new FileInputStream(io-app2/src/zhushanglin06.txt);// 2、把原始的字节输入流按照指定的字符集编码转换成字符输入流Reader isr new InputStreamReader(is, GBK);// 3、把字符输入流包装成缓冲字符输入流BufferedReader br new BufferedReader(isr);){String line;while ((line br.readLine()) ! null){System.out.println(line);}} catch (Exception e) {e.printStackTrace();}} }执行完之后你会发现没有乱码。 3.2 OutputStreamWriter类 接下来我们先学习OutputStreamWriter类你看这个类名也比较有意思前面是OutputStream表示字节输出流后面是Writer表示字符输出流合在一起意思就是表示可以把OutputStream转换为Writer最终OutputStreamWriter其实也是Writer的子类所以也算是字符输出流。 OutputStreamReader也是不能单独使用的它内部需要封装一个OutputStream的子类对象再指定一个编码表如果不指定编码表默认会按照UTF-8形式进行转换。 需求我们可以先准备一个GBK格式的文件使用下面代码往文件中写字符数据。 public class OutputStreamWriterTest3 {public static void main(String[] args) {// 指定写出去的字符编码。try (// 1、创建一个文件字节输出流OutputStream os new FileOutputStream(io-app2/src/zhushanglin07out.txt);// 2、把原始的字节输出流按照指定的字符集编码转换成字符输出转换流。Writer osw new OutputStreamWriter(os, GBK);// 3、把字符输出流包装成缓冲字符输出流BufferedWriter bw new BufferedWriter(osw);){bw.write(我是中国人abc);bw.write(我爱你中国123);} catch (Exception e) {e.printStackTrace();}} }四、打印流 接下来我们学习打印流其实打印流我们从开学第一天就一直再使用只是没有学到你感受不到而已。打印流可以实现更加方便更加高效的写数据的方式。 4.1 打印流基本使用 打印流这里所说的打印其实就是写数据的意思它和普通的write方法写数据还不太一样一般会使用打印流特有的方法叫print(数据)或者println(数据)它打印啥就输出啥。 打印流有两个一个是字节打印流PrintStream一个是字符打印流PrintWriter如下图所示 PrintStream和PrintWriter的用法是一样的所以这里就一块演示了。 public class PrintTest1 {public static void main(String[] args) {try (// 1、创建一个打印流管道 // PrintStream ps // new PrintStream(io-app2/src/zhushanglin08.txt, Charset.forName(GBK)); // PrintStream ps // new PrintStream(io-app2/src/zhushanglin08.txt);PrintWriter ps new PrintWriter(new FileOutputStream(io-app2/src/zhushanglin08.txt, true));){ps.print(97); //文件中显示的就是:97ps.print(a); //文件中显示的就是:aps.println(我爱你中国abc); //文件中显示的就是:我爱你中国abcps.println(true);//文件中显示的就是:trueps.println(99.5);//文件中显示的就是99.5ps.write(97); //文件中显示a发现和前面println方法的区别了吗} catch (Exception e) {e.printStackTrace();}} }4.2 重定向输出语句 其实我们开学第一课就给同学们讲过System.out.println()这句话表示打印输出但是至于为什么能够输出其实我们一直不清楚。 以前是因为知识储备还不够无法解释到现在就可以给同学们揭晓谜底了因为System里面有一个静态变量叫outout的数据类型就是PrintStream它就是一个打印流而且这个打印流的默认输出目的地是控制台所以我们调用System.out.pirnln()就可以往控制台打印输出任意类型的数据而且打印啥就输出啥。 而且System还提供了一个方法可以修改底层的打印流这样我们就可以重定向打印语句的输出目的地了。我们玩一下, 直接上代码。 public class PrintTest2 {public static void main(String[] args) {System.out.println(老骥伏枥);System.out.println(志在千里);try ( PrintStream ps new PrintStream(io-app2/src/zhushanglin09.txt); ){// 把系统默认的打印流对象改成自己设置的打印流System.setOut(ps);System.out.println(烈士暮年); System.out.println(壮心不已);} catch (Exception e) {e.printStackTrace();}} }此时打印语句将往文件中打印数据而不在控制台。 五、数据流 同学们接下我们再学习一种流这种流在开发中偶尔也会用到。比如我们想把数据和数据的类型一并写到文件中去读取的时候也将数据和数据类型一并读出来。这就可以用到数据流有两个DataInputStream和DataOutputStream. 5.1 DataOutputStream类 我们先学习DataOutputStream类它也是一种包装流创建DataOutputStream对象时底层需要依赖于一个原始的OutputStream流对象。然后调用它的wirteXxx方法写的是特定类型的数据。 代码如下往文件中写整数、小数、布尔类型数据、字符串数据 public class DataOutputStreamTest1 {public static void main(String[] args) {try (// 1、创建一个数据输出流包装低级的字节输出流DataOutputStream dos new DataOutputStream(new FileOutputStream(io-app2/src/zhushanglin10out.txt));){dos.writeInt(97);dos.writeDouble(99.5);dos.writeBoolean(true);dos.writeUTF(清华程序员666);} catch (Exception e) {e.printStackTrace();}} }5.2 DataInputStream类 学习完DataOutputStream后再学习DataIntputStream类它也是一种包装流创建DataInputStream对象时底层需要依赖于一个原始的InputStream流对象。然后调用它的readXxx()方法就可以读取特定类型的数据。 代码如下读取文件中特定类型的数据整数、小数、字符串等 public class DataInputStreamTest2 {public static void main(String[] args) {try (DataInputStream dis new DataInputStream(new FileInputStream(io-app2/src/zhushanglin10out.txt));){int i dis.readInt();System.out.println(i);double d dis.readDouble();System.out.println(d);boolean b dis.readBoolean();System.out.println(b);String rs dis.readUTF();System.out.println(rs);} catch (Exception e) {e.printStackTrace();}} }六、序列化流 各位同学同学还有最后一个流要学习叫做序列化流。序列化流是干什么用的呢 我们知道字节流是以字节为单位来读写数据、字符流是按照字符为单位来读写数据、而对象流是以对象为单位来读写数据。也就是把对象当做一个整体可以写一个对象到文件也可以从文件中把对象读取出来。 这里有一个新词 序列化第一次听同学们可能还比较陌生我来给同学们解释一下 序列化意思就是把对象写到文件或者网络中去。简单记写对象 反序列化意思就是把对象从文件或者网络中读取出来。简单记读对象6.1 ObjectOutputStraem类 接下来先学习ObjectOutputStream流它也是一个包装流不能单独使用需要结合原始的字节输出流使用。 代码如下将一个User对象写到文件中去 第一步先准备一个User类必须让其实现Serializable接口。 // 注意对象如果需要序列化必须实现序列化接口。 public class User implements Serializable {private String loginName;private String userName;private int age;// transient 这个成员变量将不参与序列化。private transient String passWord;public User() {}public User(String loginName, String userName, int age, String passWord) {this.loginName loginName;this.userName userName;this.age age;this.passWord passWord;}Overridepublic String toString() {return User{ loginName loginName \ , userName userName \ , age age , passWord passWord \ };} }第二步再创建ObjectOutputStream流对象调用writeObject方法对象到文件。 public class Test1ObjectOutputStream {public static void main(String[] args) {try (// 2、创建一个对象字节输出流包装原始的字节 输出流。ObjectOutputStream oos new ObjectOutputStream(new FileOutputStream(io-app2/src/zhushanglin11out.txt));){// 1、创建一个Java对象。User u new User(admin, 张三, 32, 666888xyz);// 3、序列化对象到文件中去oos.writeObject(u);System.out.println(序列化对象成功);} catch (Exception e) {e.printStackTrace();}} }注意写到文件中的对象是不能用记事本打开看的。因为对象本身就不是文本数据打开是乱码 怎样才能读懂文件中的对象是什么呢这里必须用反序列化自己写代码读。 6.2 ObjectInputStream类 接下来学习ObjectInputStream流它也是一个包装流不能单独使用需要结合原始的字节输入流使用。 接着前面的案例文件中已经有一个Student对象现在要使用ObjectInputStream读取出来。称之为反序列化。 public class Test2ObjectInputStream {public static void main(String[] args) {try (// 1、创建一个对象字节输入流管道包装 低级的字节输入流与源文件接通ObjectInputStream ois new ObjectInputStream(new FileInputStream(io-app2/src/zhushanglin11out.txt));){User u (User) ois.readObject();System.out.println(u);} catch (Exception e) {e.printStackTrace();}} }七、补充知识IO框架 最后再给同学们补充讲解一个知识叫做IO框架。它有什么用呢有同学经常问老师我们只学习了IO流对文件复制能不能复制文件夹呀 当然是可以咯但是如果让我们自己写复制文件夹的代码需要用到递归还是比较麻烦的。为了简化对IO操作由apache开源基金组织提供了一组有关IO流小框架可以提高IO流的开发效率。 这个框架的名字叫commons-io其本质是别人写好的一些字节码文件class文件打包成了一个jar包。我们只需要把jar包引入到我们的项目中就可以直接用了。 这里给同学们介绍一个jar包中提供的工具类叫FileUtils它的部分功能如下很方便你一看名字就知道怎么用了。 在写代码之前先需要引入jar包具体步骤如下 1.在模块的目录下新建一个lib文件夹 2.把jar包复制粘贴到lib文件夹下 3.选择lib下的jar包右键点击Add As Library然后就可以用了。代码如下 public class CommonsIOTest1 {public static void main(String[] args) throws Exception {//1.复制文件FileUtils.copyFile(new File(io-app2\\src\\zhushanglin01.txt), new File(io-app2/src/a.txt));//2.复制文件夹FileUtils.copyDirectory(new File(D:\\resource\\私人珍藏), new File(D:\\resource\\私人珍藏3));//3.删除文件夹FileUtils.deleteDirectory(new File(D:\\resource\\私人珍藏3));// Java提供的原生的一行代码搞定很多事情Files.copy(Path.of(io-app2\\src\\zhushanglin01.txt), Path.of(io-app2\\src\\b.txt));System.out.println(Files.readString(Path.of(io-app2\\src\\zhushanglin01.txt)));} }
http://www.zqtcl.cn/news/703682/

相关文章:

  • 江苏推广网站建设业务个人工作室网站源码带后台
  • 色一把做最好的网站赤峰微信网站建设
  • 指定网站长期建设 运营计划网站淘宝客 没备案怎么做
  • 绵阳网站推广排名知名商业网站有哪些
  • 简要描述创建商务站点的商务天津建设工程合同备案网站
  • 做展示空间设计的网站wordpress调用作品分类
  • 网站怎么做访问量统计百度百科怎么创建自己
  • 泉州开发网站的公司有哪些网站页面相似度查询工具
  • 卖文章的网站源码咸阳做网站的公司电话
  • 网站建设案例百度云怎么在手机上传百度云wordpress
  • 传媒公司取名seo网站推广怎么收费
  • 网站建设具体详细过程WordPress usdt收款
  • 网站标题应怎设置生产备案号怎么查询网站
  • 怎样建立网站目录结构网站 项目方案
  • jsp做网站还响应式科技公司网站模板
  • 杭州网站建设设计公司做阀门网站
  • 用模板建站青岛企业网站制作公司
  • 网站建设经费预算表辽宁工程建设招标网
  • sql数据库查询网站模板谷歌浏览器网页版入口
  • 成都h5建站市场监督管理局举报电话
  • 百度推广弄个网站头像要钱吗?最新新闻热点素材
  • 江苏做网站找谁wordpress主题设置插件
  • 郑州微信网站开发建筑网招工平台
  • 给网站挂黑链普工招聘最新招聘信息
  • 重庆推广网站排名价格上海房产信息网官网
  • 深圳网站公司制作网络公司排名
  • 郑州高端做网站网页制作与网站建设实战大全光盘
  • 科技网站制作公司免费模板建站网站
  • 网页排版精美的中文网站单页设计软件
  • 图书馆网站建设情况会员卡管理系统价格