JAVA学习笔记之IO详解一
来源:互联网 发布:extjs表单设计器源码 编辑:程序博客网 时间:2024/05/21 22:50
1.相关概念
1.1 IO流的分类
根据处理数据类型的不同分为:字符流和字节流。
根据数据流向不同分为:输入流和输出流。
字节流和字符流的区别:
(1)读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
(2)处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
(3)字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的;而字符流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作文件,我们将在下面验证这一点。
结论:优先选用字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用广泛。
1.2 IO流整体结构图
2.字节流
2.1 FileInputStream, FileOutputStream
例子:读取一个文本数据,并将数据写入另一个文档中。
import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;/* * 基于字节的I/O操作 * FileInputStream,FileOutputStream */public class lesson1 { public static void main(String args[]) throws IOException{ // FileInputStream,FileOutputStream FileInputStream fin = new FileInputStream(new File("text.txt")); FileOutputStream fout = new FileOutputStream(new File("text1.txt")); int bytes = fin.available(); System.out.println("当前可用于读入的字节数量"+bytes); byte[] data = new byte[bytes]; if(bytes > 0){ fin.read(data); } fout.write(data); fin.close(); fout.close(); }}2.2 ByteArrayInputStream,ByteArrayOutputStream
import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;/* * 基于字节的I/O操作:ByteArrayInputStream,ByteArrayOutputStream * ByteArrayInputStream包含一个内部缓冲区,该缓冲区包含从流中读取的字节. * ByteArrayOutputStream输出的数据写入一个 byte数组缓冲区,缓冲区会随着数据的不断写入而自动增长,可使用 toByteArray()获取数据。 * 关闭 ByteArrayInputStream,ByteArrayOutputStream无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException. */public class lesson4 { public static void main(String args[]) throws IOException{ /* * 我们接收数据时,当不清楚数据的具体大小,可以利用ByteArrayOutputStream缓存区自动增长的特性收集所有数据 */ ByteArrayOutputStream bout = new ByteArrayOutputStream(); int c1, c2; while((c1 = System.in.read()) != -1) { bout.write(c1); } byte[] b = bout.toByteArray(); for(int i= 0 ; i < b.length; i++) { // 打印字符 System.out.print((char)b[i] + " "); } System.out.println(" "); ByteArrayInputStream bin = new ByteArrayInputStream(b); while((c2 = bin.read()) != -1){ System.out.println(Character.toUpperCase((char)c2)); } bin.reset(); }}2.3 ObjectInputStream, ObjectOutputStream
import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;/* * 基于字节的I/O操作: ObjectInputStream, ObjectOutputStream * ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream. * ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化. * ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以使对象的持久存储. * 只有支持 java.io.Serializable 或 java.io.Externalizable接口的对象才能从流读取 */public class lesson5 { public static void main(String args[]) throws IOException, ClassNotFoundException{ FileOutputStream fout = new FileOutputStream("test.txt"); ObjectOutputStream objout = new ObjectOutputStream(fout); objout.writeObject(new Student("小明","男",10)); objout.close(); FileInputStream fin = new FileInputStream("test.txt"); ObjectInputStream objin = new ObjectInputStream(fin); Student st = (Student)objin.readObject(); System.out.println(st.toString()); }}class Student implements Serializable{private String name;private String sex;private int age;public Student(){this.name="";this.sex="";this.age=0;}public Student(String name, String sex, int age){this.age = age;this.name = name;this.sex = sex;} @Override public String toString() { // TODO Auto-generated method stub return "学生姓名:"+this.name+" 年龄:"+this.age+" 性别:"+this.sex; }}2.4 DataInputStream,DataOutputStream
import java.io.DataInputStream;import java.io.DataOutputStream ;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;/* * 基于字节的I/O操作: DataInputStream, DataOutputStream */public class lesson6 { public static void main(String args[]) throws IOException{ FileOutputStream fout = new FileOutputStream("test1.txt",true); DataOutputStream dout = new DataOutputStream(fout); dout.writeUTF("中国"); dout.flush(); dout.close(); FileInputStream fin = new FileInputStream("test1.txt"); DataInputStream din = new DataInputStream(fin); String str = din.readUTF(); din.close(); System.out.println(str); }}2.5 BufferedInputStream,BufferedOutputStream
import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;/* * 基于字节的I/O操作: BufferedInputStream, BufferedOutputStream * BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力 */public class lesson7 { public static void main(String args[]) throws IOException { FileOutputStream fout = new FileOutputStream("test.txt",true); BufferedOutputStream bout = new BufferedOutputStream(fout,1024); DataOutputStream dout = new DataOutputStream(bout); dout.writeUTF("你好啊!"); dout.flush(); dout.close(); FileInputStream fin = new FileInputStream("test.txt"); BufferedInputStream bin = new BufferedInputStream(fin); DataInputStream din = new DataInputStream(bin); String str = din.readUTF(); System.out.println(str); din.close(); }}
2.6 PrintStream
import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.PrintStream;/** * 基于字节的I/O操作: PrintStream * PrintStream 方便其他输出流打印各种数据值表示形式, PrintStream 永远不会抛出 IOException. */public class lesson8 { public static void main(String args[]){ try {FileInputStream fin = new FileInputStream(new File("test.txt"));BufferedInputStream bin = new BufferedInputStream(fin, 1024);FileOutputStream fout = new FileOutputStream(new File("test1.txt"), true);BufferedOutputStream bout = new BufferedOutputStream(fout);PrintStream ps = new PrintStream(bout, true);byte[] b = new byte[80]; //如果分配的空间过大,则输出为空格int c;while((c = bin.read(b)) != -1) {ps.write(b, 0 , b.length); }ps.print("***接后面");bin.close();ps.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} }}
3 字符流
3.1 InputStreamReader, OutputStreamWriter
import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;/** * 基于字符的I/O操作: InputStreamReader, OutputStreamWriter * 字节流流向字符流的桥梁 */public class lesson9 { public static void main(String args[]) throws IOException { FileInputStream fin = new FileInputStream(new File("test.txt")); InputStreamReader inr = new InputStreamReader(fin); if(inr.ready()){ int cv = inr.read(); System.out.println((char)cv); } char[] ca = new char[100]; inr.read(ca); System.out.print(ca); inr.close(); FileOutputStream fout = new FileOutputStream("new.txt", true); OutputStreamWriter opt = new OutputStreamWriter(fout); opt.write("你好啊啊啊"); opt.write("####"); opt.flush(); opt.close(); }}3.2 FileReader, FileWriter
import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;/** * 基于字符的I/O操作: FileReader, FileWriter * FileReader用来读取字符文件, FileWriter用来写入字符文件 * 默认字符编码和默认字节缓冲区大小都是适当的.要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader. */public class lesson10 { public static void main(String args[]) throws IOException{ FileReader fread = new FileReader(new File("new.txt")); char[] buf = new char[100]; if(fread.ready()){ fread.read(buf); } System.out.println(buf); fread.close(); FileWriter fout = new FileWriter("new1.txt", true); fout.write("hello world"); fout.flush(); fout.close(); }}
3.3 BufferedReader, BufferedWriter
import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;/** * 基于字符的I/O操作: BufferedReader, BufferedWriter * 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 * 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入 */public class lesson11 { public static void main(String args[]) throws IOException { BufferedReader bin = new BufferedReader(new FileReader("new.txt")); char[] buf = new char[50]; if(bin.ready()){ bin.read(buf); } System.out.print(buf); bin.close(); BufferedWriter bout = new BufferedWriter(new FileWriter("new1.txt")); bout.write("从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取"); bout.flush(); bout.close(); }}
0 0
- JAVA学习笔记之IO详解一
- Java之IO详解(一)
- Java之IO详解(一):
- Java IO学习笔记一
- 学习笔记一:java IO
- Java IO学习笔记一
- 黑马程序员-Java学习笔记之IO流(一)
- java学习笔记之IO流总结(一)
- Java学习笔记之IO(一):File类的用法
- java学习笔记之文件IO流详解
- Java学习笔记之IO
- java之IO流详解(一)
- java io学习笔记(一)
- java IO流学习笔记一
- Java IO 学习笔记(一)
- java--------学习之《IO流》一
- java IO 学习之 File类 (一)
- java IO 详解(一)
- jQuery,DOM相关
- 面试题25:二叉树中和为某一值的路径
- 区间相交问题
- 软件测试计划和测试方案的区别(领域软件测试网)
- 递归为什么那么慢?递归的改进算法
- JAVA学习笔记之IO详解一
- Socket通信
- TCP通信(二)——异步连接
- 字符串——替换字符串中连续出现的指定字符串
- 一个程序员的进化史-第九章
- 1059. Prime Factors (25)
- BZOJ1009 [HNOI2008]GT考试
- HTML iframe 用法小总结
- java设计模式之单例模式