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

画册排版设计网站社交网站开发客户

画册排版设计网站,社交网站开发客户,网站开发过程有几个阶段,计算机软件开发需要学什么Java中IO流分成两大类#xff0c;一种是输入流#xff0c;所有的输入流都直接或间接继承自InputStream抽象类#xff0c;输入流作为数据的来源#xff0c;我们可以通过输入流的read方法读取字节数据#xff1b;另一种是输出流#xff0c;所有的输出流都直接或间接继承自O…Java中IO流分成两大类一种是输入流所有的输入流都直接或间接继承自InputStream抽象类输入流作为数据的来源我们可以通过输入流的read方法读取字节数据另一种是输出流所有的输出流都直接或间接继承自OutputStream抽象类输出流接收数据可以通过write方法写入字节数据。在Java的IO流类中大部分的输入流和输出流都是成对存在的即如果存在XXXInputStream那么就存在XXXOutputStream反之亦然。(SequenceInputStream和StringBufferInputStream是特例没有对应的SequenceOutputStream类和StringBufferOutputStream类稍后会解释)。许多IO操作都可能会抛出IOException异常比如read、write、close操作。以下是Java的IO流中常见的输入流由于每个输入流都有其对应的输出流所以此处就不再列出输出流的继承结构图。下面依次对这些类进行介绍以及如何使用。vcD4NCjxociAvPg0KPGJsb2NrcXVvdGUDQoJPHAQnl0ZUFycmF5SW5wdXRTdHJlYW0gJmFtcDsgQnl0ZUFycmF5T3V0cHV0U3RyZWFtPC9wPg0KPC9ibG9ja3F1b3RlPg0KPHAQnl0ZUFycmF5SW5wdXRTdHJlYW25udTsuq/K/dbQ0OjSqrSryOvSu7j2Ynl0Zcr91nX986qyv23dS0o6y1sda00NByZWFkstnX98qxo6yzbvhtNO4w8r91nW0LbByKHK/b7do6zV/cjnxuTD6OsysfSu9bWu/nT2tfWvdrK/dfpyrXP1rXE0rvW1rzytaXK5MjrwfejrM/UtvjS17z7tcTKx6OsyOe59TaubnU7Lqvyv3W0LSryOvBy251bGzX986q19a92sr9vt2jrMTHw7TU2ta00NByZWFkstnX98qxvs274bP2z9ZOdWxsUG9pbnRlckV4Y2VwdGlvbtLss6OjrLWrysfU2rm51Oy6r8r9s/XKvLuvvde2zrK7uHF17P20uyzo6O70vWrs/gttTTprXEysdCeXRlQXJyYXlPdXRwdXRTdHJlYW2jrMbkxNqyv9Ky09DSu7j219a92sr91nTw9PatOa0ondyaXRlstnX98qx0LTI67XEyv23aOs1Nq5udTsuq/K/dbQv8nS1LSryOvSu7j2c2l6Zda4tqjG5MTasr1xGJ5dGXK/dfptcS089Cho6zI57n7srvWuLaoo6zEx8O0xKzIz8v8uG9q2J5dGXK/dfps/XKvLuvzqozMtfWvdqjrLWxs9bQM2ouf13cml0Zc/yQnl0ZUFycmF5T3V0cHV0U3RyZWFt1tDQtMjryv23cqxo6zI57n7xuTE2rK/tcRieXRlyv3X6bXEyqPT4L/VvOSyu8Tcubu05rSi0OjSqtC0yOu1xMr9vt2jrMTHw7TEx8O0y/y74c2ouf2199PDxNqyv7XEZW5zdXJlQ2FwYWNpdHk8YnIgLz4NCre9t6i21MbkxNqyv86su6S1xGJ5dGXK/dfpvfjQ0MCpyN3S1LTmtKLLdPQ0qrQtMjrtcTK/b7do6zLdLUsrux2LWj0MTG5MTasr1xGJ5dGXK/dfpzKvQobW81sK1xEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb27WrsDgtcTS7LOjoaM8YnIgLz4NCtLUz8LKx0J5dGVBcnJheUlucHV0U3RyZWFtILrNIEJ5dGVBcnJheU91dHB1dFN0cmVhbbXEtPrC68asts7KvsD9o7o8L3ADQo8cHJlIGNsYXNzPQbrush:java;private static void testByteArrayInputOutStream(){ byte bytes I am iSpring.getBytes(); ByteArrayInputStream bais new ByteArrayInputStream(bytes); ByteArrayOutputStream baos new ByteArrayOutputStream(); byte buf new byte; int length 0; try{ while((length bais.read(buf)) 0){ baos.write(buf, 0, length); } System.out.println(baos.toString(UTF-8)); bais.close(); baos.close(); }catch(IOException e){ e.printStackTrace(); } }在上面的例子中我们通过字符串获取字节数组将其作为ByteArrayInputStream的数据流来源然后通过读取ByteArrayInputStream的数据将读到的数据写入到ByteArrayOutputStream中。FileInputStream FileOutputStreamFileInputStream 能够将文件作为数据源读取文件中的流通过File对象或文件路径等初始化在其构造函数中如果传入的File对象(或与其相对应的文件路径所表示的File对象)不存在或是一个目录而不是文件或者由于其他原因无法打开读取数据都会导致在初始化阶段导致抛出FileNotFoundException异常与FileInputStream 相对应的是FileOutputStream可以通过FileOutputStream向文件中写入数据也需要通过File对象或文件路径对其初始化如同FileInputStream 如果传入的File对象(或与其相对应的文件路径所表示的File对象)是一个目录而不是文件或者由于其他原因无法创建该文件写入数据都会导致在初始化阶段抛出FileNotFoundException异常。以下是FileInputStream 和 FileOutputStream的代码示例片段private static void testFileInputOutStream(){ try{ String inputFileName D:\iWork\file1.txt; String utputFileName D:\iWork\file2.txt; FileInputStream fis new FileInputStream(inputFileName); FileOutputStream fos new FileOutputStream(outputFileName); byte buf new byte; int length 0; while ((length fis.read(buf)) 0){ fos.write(buf, 0, length); } fis.close(); fos.close(); }catch (FileNotFoundException e){ e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); } }在上面的例子中我们通过FileInputStream的read方法读取file1.txt中的数据然后将获得的字节数据通过FileOutputStream的write方法将其写入到另一个文件file2.txt中这样就实现了文件的拷贝即将file1.txt拷贝到file2.txt。如果file2.txt已经存在那么在初始FileOutputStream时可以传入一边boolean变量append表示是向已有文件中追加写入数据还是覆盖已有数据。PipedInputStream PipedOutputStreamPipedInputStream和PipedOutputStream一般是结合使用的这两个类用于在两个线程间进行管道通信一般在一个线程中执行PipedOutputStream 的write操作而在另一个线程中执行PipedInputStream的read操作。可以在构造函数中传入相关的流将PipedInputStream 和PipedOutputStream 绑定起来也可以通过二者的connect方法将二者绑定起来一旦二者进进行了绑定那么PipedInputStream的read方法就会自动读取PipedOutputStream写入的数据。PipedInputStream的read操作是阻塞式的当执行PipedOutputStream的write操作时PipedInputStream会在另一个线程中自动读取PipedOutputStream写入的内容如果PipedOutputStream一直没有执行write操作写入数据那么PipedInputStream的read方法会一直阻塞PipedInputStream的read方法所运行的线程直至读到数据。单独使用PipedInputStream或单独使用PipedOutputStream时没有任何意义的必须将二者通过connect方法(或在构造函数中传入对应的流)进行连接绑定如果单独使用其中的某一个类就会触发IOException: Pipe Not Connected.以下是PipedInputStream和PipedOutputStream的代码示例片段WriterThread类import java.io.*;public class WriterThread extends Thread { PipedOutputStream pos null; public WriterThread(PipedOutputStream pos){ this.pos pos; } Override public void run() { String message 这条信息来自于WriterThread.; try{ byte bytes message.getBytes(UTF-8); System.out.println(WriterThread发送信息); this.pos.write(bytes); this.pos.close(); }catch (IOException e){ e.printStackTrace(); } }}ReaderThread类import java.io.*;public class ReaderThread extends Thread { private PipedInputStream pis null; public ReaderThread(PipedInputStream pis){ this.pis pis; } Override public void run() { byte buf new byte; try{ System.out.println(ReaderThread阻塞式的等待接收数据...); int length pis.read(buf); System.out.println(ReaderThread接收到如下信息:); String message new String(buf, 0, length, UTF-8); System.out.println(message); pis.close(); }catch(IOException e){ e.printStackTrace(); } }}测试代码private static void testPipedInputOutputStream(){ try{ PipedInputStream pis new PipedInputStream(); PipedOutputStream pos new PipedOutputStream(); pos.connect(pis); WriterThread writerThread new WriterThread(pos); ReaderThread readerThread new ReaderThread(pis); readerThread.start(); writerThread.start(); }catch (IOException e){ e.printStackTrace(); } }在上面的实例中我们创建了两个线程类WriterThread和ReaderThread在WriterThread的构造函数中我们传入了一个PipedOutputStream并在线程执行run方法时向WriterThread中写入数据在ReaderThread的构造函数中我们传入了一个PipedInputStream在其线程执行run方法时阻塞式的执行read操作等待获取数据。我们通过pos.connect(pis)将这两种流绑定在一起最后分别执行线程ReaderThread和WriterThread。输出结果如下我们可以看到即使我们先执行了ReaderThread线程ReaderThread中的PipedInputStream还是一直在阻塞式的等待数据的到来。ObjectInputStream ObjectOutputStreamObjectOutputStream具有一系列writeXXX方法在其构造函数中可以掺入一个OutputStream可以方便的向指定的输出流中写入基本类型数据以及String比如writeBoolean、writeChar、writeInt、writeLong、writeFloat、writeDouble、writeCharts、writeUTF等除此之外ObjectOutputStream还具有writeObject方法。writeObject方法中传入的类型必须实现了Serializable接口从而在执行writeObject操作时将对象进行序列化成流并将其写入指定的输出流中。与ObjectOutputStream相对应的是ObjectInputStreamObjectInputStream有与OutputStream中的writeXXX系列方法完全对应的readXXX系列方法专门用于读取OutputStream通过writeXXX写入的数据。以下是ObjectInputStream 和 ObjectOutputStream的示例代码Person类import java.io.Serializable;public class Person implements Serializable { private String name ; private int age 0; public Person(String name, int age){ this.name name; this.age age; } public String getName() { return name; } public int getAge() { return age; }}测试代码private static void testObjectInputOutputStream(){ try{ String fileName D:\iWork\file.tmp; //将内存中的对象序列化到物理文件中 FileOutputStream fos new FileOutputStream(fileName); ObjectOutputStream os new ObjectOutputStream(fos); String description 以下是人员数组; Person persons new Person{ new Person(iSpring, 26), new Person(Mr.Sun, 27), new Person(Miss.Zhou, 27) }; oos.writeObject(description); oos.writeInt(persons.length); for(Person person : persons){ oos.writeObject(person); } oos.close(); //从物理文件中反序列化读取对象信息 FileInputStream fis new FileInputStream(fileName); ObjectInputStream is new ObjectInputStream(fis); String str (String)ois.readObject(); System.out.println(str); int personCount ois.readInt(); for(int i 0; i personCount; i){ Person person (Person)ois.readObject(); StringBuilder sb new StringBuilder(); sb.append(姓名: ).append(person.getName()).append(, 年龄: ).append(person.getAge()); System.out.println(sb); } }catch (FileNotFoundException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); }catch (ClassNotFoundException e){ e.printStackTrace(); } }输出结果如下Person实现了Serializable接口需要注意的是Serializable接口是一个标识接口并不需要实现任何方法。我们首先通过ObjectOutputStream将Person等数组信息序列化成流然后通过调用writeObject等方法将其写入到FileOutputStream中从而实现了将内存中的基本类型和对象序列化保存到硬盘的物理文件中。然后通过FileInputStream读取文件将文件的输入流传入到到ObjectInputStream的构造函数中这样ObjectInputStream就可以通过执行对应的readXXX操作读取基本类型或对象。当执行readObject操作时返回的是Object类型需要强制转换为对应的实际类型。需要注意的是ObjectInputStream执行readXXX操作的方法顺序需要与ObjectOutputStream执行writeXXX操作的方法顺序一致否则就会读到错误的数据或抛出异常比如一开始向FileOutputStream中执行writeFloat而在FileInputStream中首先执行了readInt操作不会报错因为writeFloat写入了4个字节的数据readInt读入了4个字节的数据虽然可以将该Float转换为对应的int但是其实已经不是我们想要的数据了所以要注意readXXX操作与writeXXX操作执行顺序的对应。SequenceInputStreamSequenceInputStream 主要是将两个(或多个)InputStream在逻辑上合并为一个InputStream比如在构造函数中传入两个InputStream分别为in1和in2,那么SequenceInputStream在读取操作时会先读取in1如果in1读取完毕就会接着读取in2。在我们理解了SequenceInputStream 的作用是将两个输入流合并为一个输入流之后我们就能理解为什么不存在对应的SequenceOutputStream 类了因为将一个输出流拆分为多个输出流是没有意义的。以下是关于SequenceInputStream的示例代码private static void testSequenceInputOutputStream(){ String inputFileName1 D:\iWork\file1.txt; String inputFileName2 D:\iWork\file2.txt; String utputFileName D:\iWork\file3.txt; try{ FileInputStream fis1 new FileInputStream(inputFileName1); FileInputStream fis2 new FileInputStream(inputFileName2); SequenceInputStream sis new SequenceInputStream(fis1, fis2); FileOutputStream fos new FileOutputStream(outputFileName); byte buf new byte; int length 0; while((length sis.read(buf)) 0){ fos.write(buf, 0, length); } sis.close(); fos.close(); }catch (FileNotFoundException e){ e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); } }我们通过FileInputStream分别获取了file1.txt和file2.txt的输入流然后将这两个输入流作为构造函数的参数创建了SequenceInputStream 的实例所以该SequenceInputStream 中已经在逻辑上将file1.txt和file2.txt的内容合并为了一个输入流然后我们读取该SequenceInputStream 中的数据并将读到的数据写入到一个新的FileOutputStream中这样我们就实现了将file1.txt和file2.txt合并为一个新的文件file3.txt原有的file1.txt和file2.txt文件不受任何影响。StringBufferInputStreamStringBufferInputStream允许通过在构造函数中传入字符串以读取字节在读取时内部主要调用了String的charAt方法。与SequenceInputStream类似StringBufferInputStream也没有对应的OutputStream即不存在StringBufferOutputStream类。Java没有设计StringBufferOutputStream类的理由也很简单我们假设StringBufferOutputStream存在那么StringBufferOutputStream应该是内部通过执行write操作写入数据更新其内部的String对象比如有可能是通过StringBuilder来实现但是这样做毫无意义因为一旦我们String的构造函数中可以直接传入字节数组构建字符串简单明了所以设计StringBufferOutputStream就没有太大的必要了。StringBufferInputStream这个类本身存在一点问题它不能很好地将字符数组转换为字节数组所以该类被Java标记为废弃的(Deprecated)其官方推荐使用StringReader作为代替。以下是关于StringBufferInputStream的示例代码private static void testStringBufferInputStream(){ String message I am iSpirng.; StringBufferInputStream sbis new StringBufferInputStream(message); byte buf new byte; try{ int length sbis.read(buf); if(length 0){ System.out.println(new String(buf, 0, length, UTF-8)); } sbis.close(); }catch (IOException e){ e.printStackTrace(); } }输出结果如下FilterInputStream FilterOutputStreamFilterInputStream包含了其他的输入流说具体点就是在其构造函数中需要传入一个InputStream并将其保存在其名为in的字段中FilterInputStream只是简单的覆盖了所有的方法之所说是简单覆盖是因为在每个覆盖函数中它只是调用内部的保存在in字段中的InputStream所对应的方法比如在其覆盖read方法时内部只是简单调用了in.read()方法。FilterInputStream的子类可以进一步覆盖某些方法以保持接口不变的情况下实现某一特性(比如其子类有的可以通过使用缓存优化读取的效率)或者提供一些其他额外的实用方法。所以在使用时FilterInputStream可以让传入的InputStream具有一些额外的特性即对构造函数传入的InputStream进行了一层包裹使用了典型的装饰着模式如果只看FilterInputStream本身这一个类的话则该类自己本身意义不大因为其只是通过内部的字段in简单覆写某些方法。但是如果将FilterInputStream 和其子类结合起来使用话那么就很有用了。比如FilterInputStream 有两个子类BufferedInputStream和DataInputStream这两个类在下面还会详细介绍。BufferedInputStream对read操作做了优化每次读操作时都读取一大块数据然后将其放入内部维护的一个字节数组缓冲区中。当外面调用BufferedInputStream的read方法时首先去该缓冲区中读取数据这样就避免了频繁的实际的读操作BufferedInputStream对外没有暴露额外的其他方法但是其内部的read方法已经经过优化了所以在执行读操作的时候效率更高。DataInputStream与ObjectInputStream有点类似可以通过一些readXXX方法读取基本类型的数据这是非常有用的一些方法。假设我们即想使用BufferedInputStream读取效率高的特性又想是想DataInputStream中的readXXX方法怎么办呢很简单如下代码所示InputStream is getInputStreamBySomeway();BufferedInputStream bis new BufferedInputStream(is);DataInputStream dis new DataInputStream(bis);然后我们就可以调用dis.readXXX()等方法即快又方便这就是FilterInputStream子类通过构造函数层层传递结合在一起使用多种特性的魅力。与之相对应的是BufferedOutputStream和DataOutputStreamBufferedOutputStream优化了write方法提高了写的效率DataOutputStream具有很多writeXXX方法可以方便的写入基本类型数据。如果想使用writeXXX方法还想提高写入到效率可以如下代码使用与上面的代码差不多OutputStream s getOutputStreamBySomeway();BufferedOutputStream bos new BufferedOutputStream();DataOutputStream dos new DataOutputStream(bos);然后在调用dos.writeXXX方法时效率就已经提高了。BufferedInputStream BufferedOutputStream如上面所介绍的那样在BufferedInputStream的构造函数中需要传入一个InputStream BufferedInputStream内部有一个字节数组缓冲区每次执行read操作的时候就从这buf中读取数据从buf中读取数据没有多大的开销。如果buf中已经没有了要读取的数据那么就去执行其内部绑定的InputStream的read方法而且是一次性读取很大一块数据以便填充满buf缓冲区。缓冲区buf的默认大小是8192字节也就是8K在构造函数中我们也可以自己传入一个size指定缓冲区的大小。由于我们在执行BufferedInputStream的read操作的时候很多时候都是从缓冲区中读取的数据这样就大大减少了实际执行其指定的InputStream的read操作的次数也就提高了读取的效率。与BufferedInputStream 相对的是BufferedOutputStream。在BufferedOutputStream的构造函数中我们需要传入一个OutputStream这样就将BufferedOutputStream与该OutputStream绑定在了一起。BufferedOutputStream内部有一个字节缓冲区buf在执行write操作时将要写入的数据先一起缓存在一起将其存入字节缓冲区buf中buf是有限定大小的默认的大小是8192字节即8KB当然也可以在构造函数中传入size指定buf的大小。该buf只要被指定了大小之后就不会自动扩容所以其是有限定大小的既然有限定大小就会有被填充完的时刻当buf被填充完毕的时候会调用BufferedOutputStream的flushBuffer方法该方法会通过调用其绑定的OutputStream的write方法将buf中的数据进行实际的写入操作并将buf的指向归零(可以看做是将buf中的数据清空)。如果想让缓存区buf中的数据理解真的被写入OutputStream中可以调用flush方法flush方法内部会调用flushBuffer方法。由于buf的存在会大大减少实际执行OutputStream的write操作的次数优化了写的效率。以下是BufferedInputStream 和 BufferedOutputStream的示例代码片段private static void testBufferedInputOutputStream(){ try{ String inputFileName D:\iWork\file1.txt; String utputFileName D:\iWork\file2.txt; FileInputStream fis new FileInputStream(inputFileName); BufferedInputStream bis new BufferedInputStream(fis, 1024 * 10); FileOutputStream fos new FileOutputStream(outputFileName); BufferedOutputStream bos new BufferedOutputStream(fos, 1024 * 10); byte buf new byte; int length 0; while ((length bis.read(buf)) 0){ bos.write(buf, 0, length); } bis.close(); bos.close(); }catch (FileNotFoundException e){ e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); } }上面的代码将从file1.txt读取文件输入流然后将读到的数据写入到file2.txt中即实现了将file1.txt拷贝到file2.txt中。其实不通过BufferedInputStream 和 BufferedOutputStream也可以完成这样的工作使用这个两个类的好处是可以对file1.txt的读取以及file2.txt的写入提高效率从而提升文件拷贝的效率。内容由用户发布不代表本站观点。如发现有害或侵权内容。请点击这里
http://wiki.neutronadmin.com/news/115941/

相关文章:

  • 做家装的网站好seo关键词优化推广价格
  • 北京做网站报价郑州微信网站
  • 茂名做网站dyieeasp.net程序做的网站安全吗
  • wordpress搭建的网站能干什么wordpress模板 游戏
  • 廊坊市固安县建设局网站wordpress memcache
  • 重庆做网站建设公司哪家好制作英文
  • 如何建设盈利网站台州网络推广
  • 公需道德与能力建设培训网站随州百度网站建设
  • 电子商城网站开发文档外贸网站怎么做比较好
  • 贵州省建设厅网站官网鹤壁seo推广
  • 网站 带数据手机浏览器下载网页视频
  • 厦门建网站费用一览表什么是网络营销的重要内容和基本职能
  • 网站建设什么意思wordpress 分类目录 高亮
  • 网络公司如何建网站佛山市平台购物网站制作公司
  • 西安交易网站建设长沙有哪些知名网站
  • 宁波网站设计推荐荣盛网络中国百强城市榜单公布
  • 给传销产品做网站全案网络推广公司
  • 网站开发设计思想报告如何在外国网站卖东西
  • 企业网站建设制作公司哪家好玩车 wordpress
  • seo网站推广方案wordpress清新主题
  • 网站运营方案案例达州网站开发qinsanw
  • html5博客网站源码企业信用网
  • 外贸网站在哪做外链wordpress 页面 插件
  • 瑞安做网站建设哪家好网页设计与网站开发pdf
  • 自学网站有哪些网站建设模型
  • 灵川建设局网站全球建筑设计公司排名
  • 一个ip做几个网站吗重庆seo哪个强
  • 创建网站英文四惠网站建设
  • 网站开发招聘名称长沙网站 建设推广世云网络
  • 网站推广效果的评价指标有高密网站制作