- 浏览: 177335 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (99)
- 备忘录 (48)
- linux (19)
- oracle (10)
- shell (8)
- awk (1)
- java (48)
- just do it (29)
- more and more (46)
- common (29)
- 设计模式 (8)
- Java Web (9)
- Spring (0)
- Structs 2 (2)
- Java 高级 (4)
- 存储 (3)
- Virtual Box (1)
- ant (1)
- maven (0)
- 数据结构 (5)
- 算法 (5)
- javascript (1)
- ajax (1)
- jquery (1)
- xml (1)
- IBM (3)
- 转载 (3)
- English (2)
- html&css (0)
- hibernate (2)
- mysql (1)
- memcached (1)
最新评论
-
飞出四季做的茧:
kris_zhang 写道int temp = 0 ; ...
Java IO流 Zip文件的压缩和解压缩 -
kris_zhang:
int temp = 0 ; while(( ...
Java IO流 Zip文件的压缩和解压缩 -
welcomezhang:
学习了,这块自己还得深挖下
为什么HashMap不是线程安全的 -
fomeiherz:
这个写的最详细了,赞一个
Java的泛型类和泛型方法 -
beijishiqidu:
hanmiao 写道http://yangguangfu.it ...
Java设计模式之策略模式
由于项目的原因,自己好久都没有接触Java了,怕自己会什么都忘记,所以还是时不时写写,废话不多说,现在开始
第一个:InputStream的实现类:FileInputStream
由于它是一个接口,因此不对其进行举例,直接看它的子类吧,直接例子:
代码1:
此代码要运行成功,E:\work\test\t.txt这个文件要存在;运行结果如下:
第二个:OutputStream的实现类:FileOutputStream
既然我们能把文件读出来,那同样的,我们也能利用文件写相关的类把文件给写出来,代码如下:
代码2:
运行之后,E:\work\test\下有一个t1.txt这个文件,和t.txt文件一模一样。
好了,我们现在把读取的文件做一点小小的改变,加入几个汉字,看能不能读取出来,并且正常展示,此时我们还用代码1。
运行结果如下:
发现了什么?乱码,不错,这是因为Java在读取的汉字的时候把汉字给拆开了,所以我们要改变读取的方式,用InputStreamReader进行一个包装。
第三个:Reader的子类:InputStreamReader
代码3:
运行结果如下:
好了,现在是不是正常展示了?同样的,我们仍然可以把这些含有汉字的文本写入到文件中。
第四个:Writer的子类:OutputStreamWriter
代码4:
运行之后,E:\work\test\下有一个t2.txt这个文件,和t.txt文件一模一样。
其实代码2也能实现和代码4一样的功能,但是效率上可能会慢点,但是比较通用,如果要想提高效率的话,那我们在代码2的基础上再加一层封装。
第五个:FilterInputStream的子类:OutputStreamWriter
代码5:
运行结果也是正常的,但是一般情况下,我们用了BufferedInputStream,那么相应的,我们就最好去用,上述例子我执行是正常的,但是不能保证数据量大的时候还是正常的,个人对这块也不是很深入了解,如果有人知道,可以告诉我,大家共同进步。
第六个:FilterOutputStream的子类:OutputStreamWriter
和五个例子是对应的。
代码6:
上述涉及到了用FileInputStream读取原始字节流,但是JDK为我们封装了一个更方便的读取文件的类,FileReader,用于读取字符流。
第七个:InputStreamReader的子类:FileReader
代码7:
运行结果:
有FileReader,那么对应的应该也有FileWriter吧。
第八个:OutputStreamWriter的子类:FileWriter
直接代码:
代码8:
上述的代码在功能上没有问题,但是在性能上却存在缺陷,通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。例如,
BufferedReader in = new BufferedReader(new FileReader("foo.in"));
将缓冲指定文件的输入。如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。
通过用合适的 BufferedReader 替代每个 DataInputStream,可以对将 DataInputStream 用于文字输入的程序进行本地化。
第九个:Reader的子类:BufferedReader
代码9:
运行结果肯定是正确的,还是和之前的一样,既然有BufferedReader,那么肯定有BufferedWriter。
第十个:Writer的子类:BufferedWriter
代码10:
其实JDK中有提到一个示例:
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
那么根据上述示例,我们代码10就可以做如下的改动了:
替换
为
第十一个:OutputStream的子类:DataOutputStream
数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。
代码11:
第十二个:InputStream的子类:DataInputStream
数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。
DataInputStream 对于多线程访问不一定是安全的。 线程安全是可选的,它由此类方法的使用者负责。
代码12:
此时注意:在read的时候如果此输入流在读取这八个字节之前到达末尾。则此时会抛出EOFException异常。
DataInputStream和DataOutputStream的应用举例。
代码:
第十三个:InputStream的子类:DataInputStream
ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。
只能将支持 java.io.Serializable 接口的对象写入流中。每个 serializable 对象的类都被编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包。
代码13:
第十四个:InputStream的子类:DataInputStream
ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。
ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的持久存储。ObjectInputStream 用于恢复那些以前序列化的对象。其他用途包括使用套接字流在主机之间传递对象,或者用于编组和解组远程通信系统中的实参和形参。
ObjectInputStream 确保从流创建的图形中所有对象的类型与 Java 虚拟机中显示的类相匹配。使用标准机制按需加载类。
只有支持 java.io.Serializable 或 java.io.Externalizable 接口的对象才能从流读取。
代码14:
1.OutputStreamWriter和InputStreamReader在读取文件的时候是可以指定编码的,例如:
其实FileInputStream和FileOutputStream在读取的时候“也是可以指定编码的”,当然是变相的哦。
代码:(注意代码有缺陷)
写了这么多,纯粹是为了备忘,现在的编程语言和框架太多了,不去记录一下,时间长不用了,很容易忘记的,此文章仅作备忘,全文以举例为主,写的比较凌乱,欢迎大家指正。关于其他几个流,以及上述涉及到的流的一些其他用法,将在后续的文章中涉及。
第一个:InputStream的实现类:FileInputStream
由于它是一个接口,因此不对其进行举例,直接看它的子类吧,直接例子:
代码1:
package com.fit.test.test04; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; public class FileStreamDemo { public static void main(String[] args) { InputStream fis = null; try { fis = new FileInputStream("E:\\work\\test\\t.txt"); int i = 0; while ((i = fis.read()) != -1) { System.out.print((char)i); } } catch (FileNotFoundException e) { e.printStackTrace(); System.out.println("文件找不到"); } catch (IOException e) { e.printStackTrace(); System.out.println("发生异常了"); } finally { try { if (fis != null) { fis.close(); } } catch (IOException e1) { e1.printStackTrace(); System.out.println("关闭流异常"); } } } }
此代码要运行成功,E:\work\test\t.txt这个文件要存在;运行结果如下:
package com.fit.io; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; out.flush(); out.close();
第二个:OutputStream的实现类:FileOutputStream
既然我们能把文件读出来,那同样的,我们也能利用文件写相关的类把文件给写出来,代码如下:
代码2:
package com.fit.test.test04; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class FileStreamDemo { public static void main(String[] args) { InputStream fis = null; OutputStream fos = null; try { fis = new FileInputStream("E:\\work\\test\\t.txt"); fos = new FileOutputStream("E:\\work\\test\\t1.txt"); int i = 0; while ((i = fis.read()) != -1) { fos.write(i); } fos.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); System.out.println("文件找不到"); } catch (IOException e) { e.printStackTrace(); System.out.println("发生异常了"); } finally { try { if (fis != null) { fis.close(); } } catch (IOException e1) { e1.printStackTrace(); System.out.println("关闭流异常"); } try { if (fos != null) { fos.close(); } } catch (IOException e1) { e1.printStackTrace(); System.out.println("关闭流异常"); } } } }
运行之后,E:\work\test\下有一个t1.txt这个文件,和t.txt文件一模一样。
好了,我们现在把读取的文件做一点小小的改变,加入几个汉字,看能不能读取出来,并且正常展示,此时我们还用代码1。
运行结果如下:
package com.fit.io; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; out.println("?ó????2"); out.println("??????????????2"); out.flush(); out.close();
发现了什么?乱码,不错,这是因为Java在读取的汉字的时候把汉字给拆开了,所以我们要改变读取的方式,用InputStreamReader进行一个包装。
第三个:Reader的子类:InputStreamReader
代码3:
package com.fit.test.test04; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; public class FileStreamReaderDemo { public static void main(String[] args) { InputStreamReader fis = null; try { fis = new InputStreamReader(new FileInputStream("E:\\work\\test\\t.txt")); int i = 0; while ((i = fis.read()) != -1) { System.out.print((char)i); } } catch (FileNotFoundException e) { e.printStackTrace(); System.out.println("文件找不到"); } catch (IOException e) { e.printStackTrace(); System.out.println("发生异常了"); } finally { try { if (fis != null) { fis.close(); } } catch (IOException e1) { e1.printStackTrace(); System.out.println("关闭流异常"); } } } }
运行结果如下:
package com.fit.io; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; out.println("大家好2"); out.println("这是一个测试!2"); out.flush(); out.close();
好了,现在是不是正常展示了?同样的,我们仍然可以把这些含有汉字的文本写入到文件中。
第四个:Writer的子类:OutputStreamWriter
代码4:
package com.fit.test.test04; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class FileStreamDemo { public static void main(String[] args) { InputStream fis = null; OutputStream fos = null; try { fis = new FileInputStream("E:\\work\\test\\t.txt"); fos = new FileOutputStream("E:\\work\\test\\t1.txt"); int i = 0; while ((i = fis.read()) != -1) { fos.write(i); } fos.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); System.out.println("文件找不到"); } catch (IOException e) { e.printStackTrace(); System.out.println("发生异常了"); } finally { try { if (fis != null) { fis.close(); } } catch (IOException e1) { e1.printStackTrace(); System.out.println("关闭流异常"); } try { if (fos != null) { fos.close(); } } catch (IOException e1) { e1.printStackTrace(); System.out.println("关闭流异常"); } } } }
运行之后,E:\work\test\下有一个t2.txt这个文件,和t.txt文件一模一样。
其实代码2也能实现和代码4一样的功能,但是效率上可能会慢点,但是比较通用,如果要想提高效率的话,那我们在代码2的基础上再加一层封装。
第五个:FilterInputStream的子类:OutputStreamWriter
代码5:
package com.fit.test.test04; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class BufferInputStreamDemo { public static void main(String[] args) { InputStream fis = null; OutputStream fos = null; BufferedInputStream bis = null; try { fis = new FileInputStream("E:\\work\\test\\t.txt"); fos = new FileOutputStream("E:\\work\\test\\t1.txt"); bis = new BufferedInputStream(fis); int i = 0; while ((i = bis.read()) != -1) { fos.write(i); } fos.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); System.out.println("文件找不到"); } catch (IOException e) { e.printStackTrace(); System.out.println("发生异常了"); } finally { try { if (bis != null) { bis.close(); } } catch (IOException e1) { e1.printStackTrace(); System.out.println("关闭流异常"); } try { if (fos != null) { fos.close(); } } catch (IOException e1) { e1.printStackTrace(); System.out.println("关闭流异常"); } } } }
运行结果也是正常的,但是一般情况下,我们用了BufferedInputStream,那么相应的,我们就最好去用,上述例子我执行是正常的,但是不能保证数据量大的时候还是正常的,个人对这块也不是很深入了解,如果有人知道,可以告诉我,大家共同进步。
第六个:FilterOutputStream的子类:OutputStreamWriter
和五个例子是对应的。
代码6:
package com.fit.test.test04; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class BufferOutputStreamDemo { public static void main(String[] args) { InputStream fis = null; OutputStream fos = null; BufferedInputStream bis = null; BufferedOutputStream bos = null; try { fis = new FileInputStream("E:\\work\\test\\t.txt"); fos = new FileOutputStream("E:\\work\\test\\t1.txt"); bis = new BufferedInputStream(fis); bos = new BufferedOutputStream(fos); int i = 0; while ((i = bis.read()) != -1) { bos.write(i); } bos.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); System.out.println("文件找不到"); } catch (IOException e) { e.printStackTrace(); System.out.println("发生异常了"); } finally { try { if (bis != null) { bis.close(); } } catch (IOException e1) { e1.printStackTrace(); System.out.println("关闭流异常"); } try { if (bos != null) { bos.close(); } } catch (IOException e1) { e1.printStackTrace(); System.out.println("关闭流异常"); } } } }
上述涉及到了用FileInputStream读取原始字节流,但是JDK为我们封装了一个更方便的读取文件的类,FileReader,用于读取字符流。
第七个:InputStreamReader的子类:FileReader
代码7:
package com.fit.test.test04; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.Reader; public class FileReaderDemo { public static void main(String[] args) { Reader reader = null; try { reader = new FileReader("E:\\work\\test\\t.txt"); int i = 0; while ((i = reader.read()) != -1) { System.out.print((char)i); } } catch (FileNotFoundException e) { e.printStackTrace(); System.out.println("文件找不到"); } catch (IOException e) { e.printStackTrace(); System.out.println("发生异常了"); } finally { try { if (reader != null) { reader.close(); } } catch (IOException e1) { e1.printStackTrace(); System.out.println("关闭流异常"); } } } }
运行结果:
package com.fit.io; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; out.println("大家好2"); out.println("这是一个测试!2"); out.flush(); out.close();
有FileReader,那么对应的应该也有FileWriter吧。
第八个:OutputStreamWriter的子类:FileWriter
直接代码:
代码8:
package com.fit.test.test04; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Reader; import java.io.Writer; public class FileWriterDemo { public static void main(String[] args) { Reader reader = null; Writer writer = null; try { reader = new FileReader("E:\\work\\test\\t.txt"); writer = new FileWriter("E:\\work\\test\\t3.txt"); int i = 0; while ((i = reader.read()) != -1) { writer.write(i); } writer.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); System.out.println("文件找不到"); } catch (IOException e) { e.printStackTrace(); System.out.println("发生异常了"); } finally { try { if (reader != null) { reader.close(); } } catch (IOException e1) { e1.printStackTrace(); System.out.println("关闭流异常"); } try { if (writer != null) { writer.close(); } } catch (IOException e1) { e1.printStackTrace(); System.out.println("关闭流异常"); } } } }
上述的代码在功能上没有问题,但是在性能上却存在缺陷,通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。例如,
BufferedReader in = new BufferedReader(new FileReader("foo.in"));
将缓冲指定文件的输入。如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。
通过用合适的 BufferedReader 替代每个 DataInputStream,可以对将 DataInputStream 用于文字输入的程序进行本地化。
第九个:Reader的子类:BufferedReader
代码9:
package com.fit.test.test04; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.Reader; public class BufferReaderDemo { public static void main(String[] args) { Reader reader = null; try { reader = new BufferedReader(new FileReader("E:\\work\\test\\t.txt")); int i = 0; while ((i = reader.read()) != -1) { System.out.print((char)i); } } catch (FileNotFoundException e) { e.printStackTrace(); System.out.println("文件找不到"); } catch (IOException e) { e.printStackTrace(); System.out.println("发生异常了"); } finally { try { if (reader != null) { reader.close(); } } catch (IOException e1) { e1.printStackTrace(); System.out.println("关闭流异常"); } } } }
运行结果肯定是正确的,还是和之前的一样,既然有BufferedReader,那么肯定有BufferedWriter。
第十个:Writer的子类:BufferedWriter
代码10:
package com.fit.test.test04; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Reader; import java.io.Writer; public class BufferWriterDemo { public static void main(String[] args) { Reader reader = null; Writer writer = null; try { reader = new BufferedReader(new FileReader("E:\\work\\test\\t.txt")); writer = new BufferedWriter(new FileWriter("E:\\work\\test\\t5.txt")); int i = 0; while ((i = reader.read()) != -1) { writer.write(i); } writer.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); System.out.println("文件找不到"); } catch (IOException e) { e.printStackTrace(); System.out.println("发生异常了"); } finally { try { if (reader != null) { reader.close(); } } catch (IOException e1) { e1.printStackTrace(); System.out.println("关闭流异常"); } try { if (writer != null) { writer.close(); } } catch (IOException e1) { e1.printStackTrace(); System.out.println("关闭流异常"); } } } }
其实JDK中有提到一个示例:
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
那么根据上述示例,我们代码10就可以做如下的改动了:
替换
writer = new BufferedWriter(new FileWriter("E:\\work\\test\\t5.txt"));
为
writer = new PrintWriter(new BufferedWriter(new FileWriter("E:\\work\\test\\t6.txt")));
第十一个:OutputStream的子类:DataOutputStream
数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。
代码11:
package com.fit.test.test04; import java.io.DataOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class DataOutputStreamDemo { public static void main(String[] args) { DataOutputStream out = null; try { out = new DataOutputStream(new FileOutputStream("E:\\work\\test\\myfloat.txt")); for (int i = 0; i < 10; i++) { out.writeDouble(Math.random() * 100); } out.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); System.out.println("文件找不到"); } catch (IOException e) { e.printStackTrace(); System.out.println("发生异常了"); } finally { try { if (out != null) { out.close(); } } catch (IOException e1) { e1.printStackTrace(); System.out.println("关闭流异常"); } } } }
第十二个:InputStream的子类:DataInputStream
数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。
DataInputStream 对于多线程访问不一定是安全的。 线程安全是可选的,它由此类方法的使用者负责。
代码12:
package com.fit.test.test04; import java.io.DataInputStream; import java.io.EOFException; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class DataInputStreamDemo { public static void main(String[] args) { DataInputStream in = null; try { in = new DataInputStream(new FileInputStream( "E:\\work\\test\\myfloat.txt")); while (true) { double d = in.readDouble(); System.out.println(d); } } catch (FileNotFoundException e) { e.printStackTrace(); System.out.println("文件找不到"); } catch (EOFException e) { System.out.println("读取结束了"); } catch (IOException e) { e.printStackTrace(); System.out.println("发生异常了"); } finally { try { if (in != null) { in.close(); } } catch (IOException e1) { e1.printStackTrace(); System.out.println("关闭流异常"); } } } }
此时注意:在read的时候如果此输入流在读取这八个字节之前到达末尾。则此时会抛出EOFException异常。
DataInputStream和DataOutputStream的应用举例。
代码:
package com.fit.test.test04; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; public class DataStreamDemo { public static void main(String[] args) throws Exception { File file = new File("E:\\work\\test\\cnt"); if (!file.exists()) { DataOutputStream out = new DataOutputStream(new FileOutputStream( file)); out.writeInt(1); out.flush(); out.close(); System.out.println("本程序第1次运行!"); return; } DataInputStream in = new DataInputStream(new FileInputStream(file)); int cnt = in.readInt(); in.close(); cnt++; DataOutputStream out = new DataOutputStream(new FileOutputStream(file)); out.writeInt(cnt); out.flush(); out.close(); System.out.println("本程序第" + cnt + "次运行!"); } }
第十三个:InputStream的子类:DataInputStream
ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。
只能将支持 java.io.Serializable 接口的对象写入流中。每个 serializable 对象的类都被编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包。
代码13:
package com.fit.test.test04; import java.io.Serializable; public class Tiger implements Serializable { /** * 注意此类必须实现可序列化接口,否则在流化的时候会报错 */ private static final long serialVersionUID = 1L; private int bh; private String name; private String sex; public Tiger(int bh, String name, String sex) { super(); this.bh = bh; this.name = name; this.sex = sex; } public Tiger() { super(); } public int getBh() { return bh; } public void setBh(int bh) { this.bh = bh; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
package com.fit.test.test04; import java.io.FileOutputStream; import java.io.ObjectOutputStream; public class ObjectOutputStreamDemo { /** * @param args * @throws Exception * @throws Exception */ public static void main(String[] args) throws Exception { ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream("E:\\work\\test\\tigers") ); for (int i = 1; i <= 100; i++) { Tiger tiger = new Tiger(i, "老虎" + i, i % 2 == 0 ? "雌" : "雄"); out.writeObject(tiger); } out.flush(); out.close(); } }
第十四个:InputStream的子类:DataInputStream
ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。
ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的持久存储。ObjectInputStream 用于恢复那些以前序列化的对象。其他用途包括使用套接字流在主机之间传递对象,或者用于编组和解组远程通信系统中的实参和形参。
ObjectInputStream 确保从流创建的图形中所有对象的类型与 Java 虚拟机中显示的类相匹配。使用标准机制按需加载类。
只有支持 java.io.Serializable 或 java.io.Externalizable 接口的对象才能从流读取。
代码14:
package com.fit.test.test04; import java.io.EOFException; import java.io.FileInputStream; import java.io.ObjectInputStream; public class ObjectInputStreamDemo { /** * @param args * @throws Exception * @throws Exception */ public static void main(String[] args) throws Exception { ObjectInputStream in = new ObjectInputStream( new FileInputStream("E:\\work\\test\\tigers") ); try { while (true) { Tiger tiger = (Tiger) in.readObject(); System.out.println(tiger.getBh() + "," + tiger.getName() + "," + tiger.getSex()); } } catch (EOFException e) { in.close(); } System.out.println("-----"); } }
1,老虎1,雄 2,老虎2,雌 3,老虎3,雄 4,老虎4,雌 ..........
1.OutputStreamWriter和InputStreamReader在读取文件的时候是可以指定编码的,例如:
public static void main(String[] args) throws Exception { Reader reader=new InputStreamReader( new FileInputStream("f:/my2.txt"), "UTF-8" ); int k=0; while((k=reader.read())!=-1){ System.out.print((char)k); } reader.close(); }
public static void main(String[] args) throws Exception { BufferedReader reader=new BufferedReader( new InputStreamReader( new FileInputStream("f:/my2.txt"), "UTF-8" ) ); PrintWriter out=new PrintWriter( new OutputStreamWriter( new FileOutputStream("f:/my9.txt"), "GBK" ) ); /*int k=0; while((k=reader.read())!=-1){ out.write(k); }*/ String line=null; while((line=reader.readLine())!=null){ out.println(line); } reader.close(); out.flush(); out.close(); }
其实FileInputStream和FileOutputStream在读取的时候“也是可以指定编码的”,当然是变相的哦。
代码:(注意代码有缺陷)
InputStream in = new FileInputStream("E:\\work\\test\\t6.txt"); byte[] b = new byte[in.available()]; in.read(b); in.close(); String str = new String(b, "UTF-8"); System.out.println(str); byte[] b2 = str.getBytes();// unicode--->GBk(平台默认) // byte[] b2=str.getBytes("UTF-8"); OutputStream out = new FileOutputStream("E:\\work\\test\\t7.txt"); out.write(b2); out.flush(); out.close();
写了这么多,纯粹是为了备忘,现在的编程语言和框架太多了,不去记录一下,时间长不用了,很容易忘记的,此文章仅作备忘,全文以举例为主,写的比较凌乱,欢迎大家指正。关于其他几个流,以及上述涉及到的流的一些其他用法,将在后续的文章中涉及。
发表评论
-
cgroups控制cpu,memory,io使用率
2016-08-09 22:55 2559Cgroups是control groups的缩写,最初由Go ... -
为什么HashMap不是线程安全的
2016-06-15 22:27 2207序 最近因为项目的需求,经常会面试一些新人,也就会问他们 ... -
JAVA读取文件夹大小的几种方法实例
2016-04-24 15:39 710总是发现自己的C盘快满了,清理程序也不会帮我自己清理,然后 ... -
Java Regex - Matcher (java.util.regex.Matcher)
2015-03-01 13:59 851The Java Matcher class (java. ... -
Java Regex - Pattern (java.util.regex.Pattern)
2015-03-01 11:22 1526Java中的Pattern类是Java正则表达式API ... -
eclipse中查看jdk的源码
2014-11-23 11:43 1011最近一段时间跟jdk源码打交道的比较多,但是有的时候却是看 ... -
Oracle常见死锁发生的原因以及解决办法
2014-08-31 13:25 7519一,删除和更新之间引起的死锁 造成死锁的原因就是多个线程 ... -
Struts2学习初设系列(一)之环境搭建
2014-07-20 22:47 1070已经毕业很长时间了,回过头来想想都不知道自己做了什么,由于 ... -
算法的时间复杂度分析
2014-07-20 11:14 16432.9.1 算法时间复杂度定义 在进 ... -
解析 Java 类和对象的初始化过程
2014-07-06 18:14 645问题引入 近日我在调试一个枚举类型的解析器程序,该 ... -
Java 中正确使用 hashCode 和 equals 方法
2014-07-05 18:17 641在这篇文章中,我将告诉大家我对hashCode和equals ... -
通过分析 JDK 源代码研究 Hash 存储机制
2014-07-05 17:22 604集合和引用 就像引 ... -
NIO 入门
2014-07-05 17:15 635在开始之前 关于本教程 新的输入/输出 (NIO) 库 ... -
利用AJax方式提交和Webservice完成页面输入汉字简体字回显繁体字
2014-06-29 18:05 1135最近一直在学习新的 ... -
How To Parse XML File Using XPath In Java
2014-06-29 11:59 1296最近一直在学习XML的Xpath解析方式,据说是一个很简单 ... -
Java排序算法之快速排序
2014-06-22 11:27 800快速排序使用分治法(Divide and conquer)策略 ... -
Java排序算法之简单选择排序
2014-06-21 22:31 755在网上搜索了很多的算法,貌似大家说的简单选择排序算法和直接选择 ... -
Java排序算法之冒泡排序
2014-06-21 20:22 984冒泡排序算法的基本思想是:首先将第n-1个记录的关键字和第n个 ... -
Java排序算法之直接插入排序
2014-06-21 19:33 1173直接插入排序算法的基本思想是:把n个待排序的元素看成为 ... -
JAVA之桥接模式
2014-05-26 20:11 0桥模式:将某个问题抽象的不同形式分别与该问题的具体实现 ...
相关推荐
简介输入输出流意义及分类,举例常用文件读取与写入方式
第3章 Java常用算法 3.1递归算法 3.2冒泡排序算法 3.3 快速排序算法 3.4选择排序算法 3.5直接插入算法 3.6希尔排序算法 3.7 二分查找算法 3.8 二叉树 3.9 图的实现 3.10 生产者消费者的实现 3.11 银行家算法 3.12 ...
1.5 第一个Java程序 12 1.5.1 编辑Java源代码 12 1.5.2 编译Java程序 13 学生提问:当我们使用编译C程序时,不仅需要指定存放目标文件的位置,也需要指定目标文件的文件名,这里使用javac编译Java程序时怎么不...
12. 解释 Java 中的集合框架,并举例常用的集合类。 13. 什么是泛型?如何使用泛型? 14. 解释 Java 中的反射机制。 15. 如何连接和操作数据库(如 MySQL)? 16. 什么是 JVM(Java 虚拟机)?它的作用是什么? 17. ...
assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为...
assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为...
Java基础 JVM原理 集合 多线程 IO 问题排查 Web框架、数据库 Spring MySQL Redis 通用基础 操作系统 网络通信协议 排序算法 常用设计模式 从URL到看到网页的过程 分布式 CAP理论 锁 事务 消息队列 协调器 ID生成方式...
支持Struts2 搭框架中基本上最常用的所有的jar包。 我用的是struts2.2.3.16(不管用struts2的哪个版本,道理都一样,找对应的包就行了) 例如你建一Web Project,名为Struts2 导入项目所需要的jar包,放入/Struts2/...
JAVA模版引擎Freemarker常用标签(一) 1. if指令 这是一个典型的分支控制指令,该指令的作用完全类似于Java语言中的if,if指令的语法格式如下: <#if condition>... <#elseif condition>... <#elseif condition>......
要请求垃圾收集,可以调用下面的方法之一: System.gc() Runtime.getRuntime().gc() 37.String s = new String(\"xyz\");创建了几个String Object? 答:两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。...
JAR:Java档案文件(一种用于applet和相关文件的压缩文件) JAVA:Java源文件 JFF,JFIF,JIF:JPEG文件 JPE,JPEG,JPG:JPEG图形文件 JS:javascript源文件 JSP:HTML网页,其中包含有对一个Java servlet...
把鼠标定位到表/视图/存储过程名称之上,按F4,可以打开对象描述窗口,方便的查看表和视图的定义,存储过程的源代码, 非常容易对SQL语句的分析其执行计划:单击工具栏上的 按钮就可以看到Explain Plan的...