`

Java IO流 续

阅读更多

1.基于字节文件读写

  • FileInputStream和FileOutputStream分别继承自InputStream和OutputStream用于向文件中输入和输出字节。
  • FileInputStream和FileOutputStream的常用构造方法:
    FileInputStream(String name) throws FileNotFoundException
    FileInputStream(File file)   throws FileNotFoundException
    FileOutputStream(String name)throws FileNotFoundException
    FileOutputStream(File file)  throws FileNotFoundException
    FileOutputStream(File file, boolean append)throws FileNotFoundException
  • 注意:
    在实例化FileInputStream和FileOutputSteam流时要用try-catch语句以处理其可能抛出的FileNotFoundException。
    在读写数据时也要用try-catch语句以处理可能抛出的 IOException。
    FileNotFoundException是IOException的子类
package javaio.inputstream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
 * 将TestFileInputStream.java中的内容读出来
 * @author Administrator
 *
 */
public class TestFileInputStream {
	public static void main(String[] args) {
		FileInputStream in = null;
		try {
			in = new FileInputStream("D:\\TestFileInputStream.java");
		} catch (FileNotFoundException e) {
			System.out.println("没有找到TestFileInputStream.java文件");
			e.printStackTrace();
			return;
		}
		//如果流不为空循环流
		if(in!=null){
			StringBuffer buffer = new StringBuffer();
			byte b[] = new byte[1024];
			try {
				while (in.read(b)!=-1) {
					buffer.append(new String(b));
					b = new byte[1024];
				}
				System.out.println(buffer.toString());
			} catch (IOException e) {
				System.out.println("读取错误");
				e.printStackTrace();
				return;
				//关闭流
			}finally{
				if(in!=null){
					try {
						in.close();
						in = null;
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
		}
	}
}
  •  写
package javaio.outputstream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 将TestFileInputStream.java中的内容读出来然后写入到TestFileInputStream2.java
 * 
 * @author Administrator
 * 
 */
public class TestFileOutputStream {
	public static void main(String[] args) {
		FileInputStream in = null;
		FileOutputStream out = null;
		try {
			in = new FileInputStream("D:\\TestFileInputStream.java");
			out = new FileOutputStream("D:\\TestFileInputStream2.java");
			if(in!=null){
				StringBuffer buffer = new StringBuffer();
				byte b[] = new byte[1];
				while (in.read(b)!=-1) {
					buffer.append(new String(b));
					out.write(b);
					b = new byte[1];
				}
			}
		} catch (FileNotFoundException e) {
			System.out.println("没有找到TestFileInputStream.java文件");
			e.printStackTrace();
			return;
		} catch (IOException e) {
			System.out.println("读取或写入发生错误");
			e.printStackTrace();
		}finally {
		  	try {
		  		if(in != null) {
		  			in.close(); 
		  			in = null;
		  		}
		    } catch(IOException e) {
		    	e.printStackTrace();
		    }
		  	try {
		  		if(out != null) {
		  			out.flush();
		    		out.close();
		    		out = null;
		    	} 
		    } catch(IOException e) {
		    	e.printStackTrace();
		    }
		  }
	}
}

 2.基于字符文件读写

  • FileReader 和 FileWriter 分别继承自Reader和Writer,FileInputSteam与FileOutputStream类似,所不同的是FileReader和FileWriter向文件输入和输出的数据单位为字符。
  • FileReader和FileWriter的常用构造方法:
    public FileWriter(File file) throws IOException
    public FileWriter(File file, boolean append)throws IOException
    public FileWriter(String fileName)throws IOException
    public FileWriter(String fileName,boolean append)throws IOException
    public FileReader(String fileName)throws FileNotFoundException
    public FileReader(File file) throws FileNotFoundException
package javaio.reader;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/**
 * 读取指定文件内容
 * 
 * @author Administrator
 * 
 */
public class TestFileReader {
	public static void main(String[] args) {
		FileReader reader = null;
		try {
			reader = new FileReader("D:\\TestFileReader.java");
			if(reader!=null){
				StringBuffer buffer = new StringBuffer();
				char b[] = new char[1024];
				while (reader.read(b)!=-1) {
					buffer.append(new String(b));
					b = new char[1024];
				}
				System.out.println(buffer.toString());
			}
		} catch (FileNotFoundException e) {
			System.out.println("没有找到TestFileReader.java文件");
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			if(reader != null) {
				try{
					reader.close();
				}
				catch (IOException e){
					e.printStackTrace();
				}
				reader = null;
			}
		}
	}
}

 

package javaio.writer;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
 * 将TestFileReader.java内容写入到TestFileReader2.java中
 * @author Administrator
 *
 */
public class TestFileWriter {
	public static void main(String[] args) {
		FileReader reader = null;
		FileWriter writer = null;
		try {
			reader = new FileReader("D:\\TestFileReader.java");
			writer = new FileWriter("D:\\TestFileReader2.java");
			if(reader!=null){
				char b[] = new char[1];
				while (reader.read(b)!=-1) {
					writer.write(b);
				}
			}
		} catch (FileNotFoundException e) {
			System.out.println("没有找到TestFileReader.java文件");
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			if(reader != null) {
				try{
					reader.close();
				}
				catch (IOException e){
					e.printStackTrace();
				}
				reader = null;
			}
			if(writer != null) {
				try{
					writer.flush();
					writer.close();
				}
				catch (IOException e){
					e.printStackTrace();
				}
				writer = null;
			}
		}
	}
}

 

3.什么时候使用字节流?什么时候使用字符流?

  • 任何数据存在硬盘上时,都是以二进制的形式存储的。
  • 通过使用字节流,可以读取任意文件。字节流一次读取一个字节,而字符流使用了字节流读到一个或者多个字节时,去查找指定的编码表,返回对应的编码。所以字符流只能处理纯文本字符数据,而字节流可以处理更多类型的数据,比如图片,视频,音频文件等。
  • 只要是纯文本数据处理,优先考虑使用字符流。其他情况就使用字节流。

4.缓冲流

  • 缓冲流-Buffered:缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率
  • 读写
    BufferedReader提供了readLine方法用于读取一行字符串(以\r或\n分隔)。
    BufferedWriter提供了newLine用于写入一个行分隔符。
    对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush方法将会使内存中的数据立刻写出。
  • 常用的构造方法
    BufferedReader(Reader in)
    BufferedReader(Reader in,int size) //size 为自定义缓存区的大小
    BufferedWriter(Writer out)
    BufferedWriter(Writer out,int sz)
    BufferedInputStream(InputStream in)
    BufferedInputStream(InputStream in,int size)
    BufferedOutputStream(OutputStream out)
    BufferedOutputStream(OutputStream out,int size)
  • 基于字节读
package javaio.buffered;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
 * 使用缓冲流读取指定文件内容
 * @author Administrator
 *
 */
public class TestBufferedInputStream {
	  public static void main(String[] args) {
		  	BufferedInputStream bis = null;
		    try {
		      InputStream fis =  new FileInputStream("D:\\TestFileInputStream.java");
		      bis = new BufferedInputStream(fis);
		      if(bis!=null){
					StringBuffer buffer = new StringBuffer();
					byte b[] = new byte[1024];
					while (bis.read(b)!=-1) {
						buffer.append(new String(b));
						b = new byte[1024];
					}
					System.out.println(buffer.toString());
		      }
		      System.out.println(); 
		     
		    } catch (IOException e) {
		    	e.printStackTrace();
		    } finally {
		    	 try {
		    	 	if(bis != null) {
		    	 		bis.close();
		    	 		bis = null;
		    	 	}
		    	} catch (IOException e) {
		    		e.printStackTrace();
		    	}
		    }
		  }
}
  •  基于字节写
package javaio.buffered;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
 * 使用缓冲流读取指定文件内容复制到另一个文件
 * @author Administrator
 *
 */
public class TestBufferedOutputStream {
	public static void main(String[] args) {
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		try {
			InputStream fis = new FileInputStream("D:\\TestFileInputStream.java");
			OutputStream out = new FileOutputStream("D:\\TestFileInputStream3.java");
			bis = new BufferedInputStream(fis);
			bos = new BufferedOutputStream(out);
			if (bis != null) {
				StringBuffer buffer = new StringBuffer();
				byte b[] = new byte[1];
				while (bis.read(b) != -1) {
					buffer.append(new String(b));
					bos.write(b);
					b = new byte[1];
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (bis != null) {
					bis.close();
					bis = null;
				}
				if (bos != null) {
					bos.flush();
					bos.close();
					bos = null;
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
  •  基于字符读写
package javaio.buffered;

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;

/**
 * 从指定文件中用BufferedReader读取数据然后用BufferedWriter写入另一个文件中
 * 
 * @author Administrator
 * 
 */
public class TestBufferedReaderAndWriter {
	public static void main(String[] args) {
		BufferedReader breader = null;
		BufferedWriter bwriter = null;
		try {
			Reader reader = new FileReader("D:\\TestFileReader.java");
			Writer writer = new FileWriter("D:\\TestFileReader3.java");
			breader = new BufferedReader(reader);
			bwriter = new BufferedWriter(writer);
			if(breader!=null){
				while(breader.ready()){
					bwriter.write(breader.readLine());
					bwriter.newLine();
				}
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(bwriter!=null){
				try {
					bwriter.flush();
					bwriter.close();
					bwriter = null;
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(breader!=null){
				try {
					breader.close();
					breader = null;
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

 5.转换流

  • InputStreamReader和OutputStreamWriter用与字节数据到字符数据之间的转换。
  • InputStreamReader需要和InputStream “套接”。
  • OutpStreamWriter需要和OutputStream “套接”。
  • 转换流在构造时可以指定其编码集合,例如:
     InputStream isr = new InputStreamReader(InputStream in, CharsetDecoder dec)
  • TestOutputStreamWriter

 

package javaio.transfer;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

/**
 * 将字节流转换为字符流输出
 * 
 * @author Administrator
 * 
 */
public class TestOutputStreamWriter {
	public static void main(String[] args) {
		OutputStreamWriter osw = null;
		try {
			osw = new OutputStreamWriter(new FileOutputStream("D:\\test.txt"),"gbk");
			osw.write("测试OutputStreamWriter");
			osw.write("\r\n");
			osw.write("测试OutputStreamWriter");
			osw.flush();
			osw.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
  •  TestInputStreamReader
package javaio.transfer;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
/**
 * 在控制台写入内容保存到文件中
 * @author Administrator
 *
 */
public class TestInputStreamReader {
	public static void main(String args[]) {
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader br = new BufferedReader(isr);
		BufferedWriter writer = null;
		try {
			String str = br.readLine();
			writer = new BufferedWriter(new FileWriter("D:\\write.txt"));
			while (str != null) {
				if ("".equals(str)){
					break;
				}
				writer.write(str);
				writer.newLine();
				str = br.readLine();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(br!=null){
				try {
					br.close();
					br=null;
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(writer!=null){
				try {
					writer.flush();
					writer.close();
					writer=null;
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

6.数据流

  • DataInputStream和DataOutputStream分别继承自InputSteam和OutputStream,它属于过滤流,需要分别“套接”在InputStream 和OutputStream类型的节点流上。
  • DataInputStream和DataOutputStream提供了可以存取与机器无关的Java原始类型数据(如:int,double等)的方法。
  • DataInputStream和DataOutputStream的构造方法为:
    DataInputStream(InputStream in)
    DataOutputStream(OutputStream out)
  • TestDataStream
package javaio.datastream;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class TestDataStream {
	public static void main(String[] args) {
		DataOutputStream dos = null;
		DataInputStream dis = null;
		try {
			dos = new DataOutputStream(new FileOutputStream("d:\\data.txt"));
			dos.writeInt(5);
			dos.writeDouble(2.12);
			dos.flush();
			dos.close();
			
			dis = new DataInputStream(new FileInputStream("d:\\data.txt"));
			System.out.println(dis.readInt());
			System.out.println(dis.readDouble());
			dis.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

7.Print流

  • PrintWriter和PrintStream都属于输出流,分别针对与字符和字节。
  • PrintWriter和PrintStream提供了重载的print
  • println方法用于多种数据类型的输出。
  • PrintWriter和PrintStream有自动flush功能。
package javaio.print;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;

public class TestPrint {
	public static void main(String[] args) {
		PrintStream ps = null;
		try {
			FileOutputStream fos = new FileOutputStream("D:\\TestFileReader3.java");
			ps = new PrintStream(fos);
		} catch (IOException e) {
			e.printStackTrace();
		}

		if (ps != null) {
			System.setOut(ps);
		}
		System.out.println("我们是中国人");
		System.out.println("我们是中国人");
		if(ps!=null){
			ps.flush();
			ps.close();
		}
	}
}

 

8.Object流

  • 直接将Object写入或读出
  • transient声明的部分不会被序列化
  • Serializable接口:序列化
  • Externalizable 接口
    void writeExternal(ObjectOutput out) throws IOException
    void readExternal(ObjectInput in) throws IOException,ClassNotFoundException
package javaio.object;

import java.io.Serializable;

public class Person implements Serializable{
	private static final long serialVersionUID = 1L;
	private String name;
	private String sex;
	private transient int age = 20;
	public String getName() {
		return name;
	}
	public String getSex() {
		return sex;
	}
	public int getAge() {
		return age;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}

 

 

package javaio.object;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class TestObjectIO {
	public static void main(String args[]) throws Exception {
		
		Person person = new Person();
		person.setAge(23);
		person.setName("张三");
		person.setSex("男");
		FileOutputStream fos = new FileOutputStream("D://object.data");
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(person);
		oos.flush();
		oos.close();
		
		FileInputStream fis = new FileInputStream("D://object.data");
		ObjectInputStream ois = new ObjectInputStream(fis);
		Person tReaded = (Person)ois.readObject();
		System.out.println(tReaded.getName() + " " + tReaded.getSex() + " " + tReaded.getAge());
	}
}

 

0
0
分享到:
评论

相关推荐

    输入输出流2

    IO流用来处理设备之间的数据传输。 java对数据的操作是通过流的方式。 java用于操作流的对象都在IO包中。 续51IO流,下载此文件,可先下载之前上传的51IO流

    java源码包---java 源码 大量 实例

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包4

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包3

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包2

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java二进制IO类与文件复制操作实例 16个目标文件 内容索引:Java源码,初学实例,二进制,文件复制 Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系...

    java8源码-DownLoad--OKHttp3:使用OKHttp3进行下载和断点续传,集成RXJava、RxAndroid进行线程切换,使

    java8 源码 DownLoad--OKHttp3 使用OKHttp3进行下载和断点续传;(详细内容,请下载源码) 文件的存储和写入; // 写文件到本地 try ...response.body().byteStream()...//关闭IO流 IOUtil.closeAll(is, fileOutputStream)

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java二进制IO类与文件复制操作实例 16个目标文件 内容索引:Java源码,初学实例,二进制,文件复制 Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系...

    matlab代码续行-IOStreamCURD:IOStreamCURD

    这是一个通过IO流、序列化与反序列化技术来实现的数据存储功能,其中部分代码可以帮助您在不利用数据库的情况下实现本地存储。 其中部分代码的应用场景如下所示: 1.在不利用数据库的情况下对采样数据进行存储,方面...

Global site tag (gtag.js) - Google Analytics