`
天边一朵雲
  • 浏览: 34517 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java输入/输出(io)记录

    博客分类:
  • JAVA
阅读更多

分类

字节输入流

字节输出流

字符输入流

字符输出流

抽象基类

InputStream

OutputStream

Reader

Writer

访问文件

FileInputStream

FileOutputStream

FileReader

FileWriter

访问数组

ByteArrayInputStream

ByteArrayOutputStream

CharArrayReader

CharArrayWriter

访问管道

PipedInputStream

PipedOutputStream

PipedReader

PipedWriter

访问字符串

StringReader

StringWriter

缓冲流

BufferedInputStream

BufferedOutputStream

BufferedReader

BufferedWriter

转换流

 

 

InputStreamReader

OutputStreamWriter

对象流

ObjectInputStream

ObjectOutputStream

 

 

抽象基类

FilterInputStream

FilterOutputStream

FilterReader

FilterWriter

打印流

 

PrintStream

 

PrintWriter

推回输入流

PushbackInputStream

 

PushbackReader

 

特殊流

DataInputStream

DataOutputStream

 

(斜体为抽象类,蓝色粗体为节点流,红色为处理流)

I/O不熟悉知识点:

File类

文件过滤器

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import static java.lang.System.out;

/**
 * ClassName:FilefilterTest	 
 */
public class FilefilterTest {

	public static void main(String[] args) throws IOException {
		//新建一个路径
		File filePath = new File("C:/DOCUME~1/Temp");
		if(filePath.isDirectory()) {
			//调用自定义过滤器
			String[] files = filePath.list(new FileFilter());
			for(String fileName : files) {
				out.println(fileName);
			}
		}

	}
}
/**
 * ClassName:FileFilter
 */
class FileFilter implements FilenameFilter {
	@Override
	public boolean accept(File dir, String name) {
		//设定自定义过滤器的条件  过滤所有非dir路径下的java文件和文件夹
		return name.endsWith(".java") || new File(dir+File.separator+name).isDirectory();
	}
}


类似的还有File[] java.io.File.listFiles(FilenameFilter filter);

节点流>字节流>输入流

		File file = new File("F:\\testSource\\FilefilterTest.java");
		/*
		 * 输入流    节点流(InputStream(字节流) Reader(字符流)
		 * 实现类分别为FileInputStream FileReader)
		 */
		FileInputStream fis = new FileInputStream(file);
		byte[] b = new byte[(int) file.length()];
		int readLen = 0;
		if((readLen = fis.read(b))>0) {
			out.println(new String(b,0,readLen));
		}
		fis.close();


节点流>字节流>输出流

	/**
	 * fileOutput:(从输入字节流中读取数据由输入字节流接收写入到.txt文件)
	 * 文件copy的作用
	 */
	private static void fileOutput() throws IOException{
		FileInputStream fis = null;
		FileOutputStream fos = null;
		try{
			File file = new File("F:\\testSource\\Struts2Test.java");
			fis = new FileInputStream(file);
			byte[] b = new byte[(int) file.length()];
			int readLen = 0;
			if((readLen = fis.read(b))>0) {
				File newFile = new File("F:\\testSource\\newFile.txt");
				if(!newFile.exists()) {
					newFile.createNewFile();
				}
				/*
				 * 输出流    节点流(OutputStream(字节流) Writer(字符流) 
				 * 实现类分别为FileOutputStream FileWriter)
				 */
				fos = new FileOutputStream(newFile);
				//字节流b  如果是Writer可以直接write(String str);
				fos.write(b,0,readLen);
			}
		}catch(FileNotFoundException e1){
			
		}catch(IOException e2){
			
		}finally{
			if(null!=fis)
				fis.close();
			if(null!=fos)
				fos.close();
		}

	}


处理流(包装节点流)

		//创建字节流
		FileOutputStream fos = new FileOutputStream(new File("F:\\testSource\\newFile2.txt"));
		//转换流包装输出流(将字节流转换成字符流)
		OutputStreamWriter osw = new OutputStreamWriter(fos);
		//向流中写入字符
		osw.write("this ");
		osw.write("is ");
		osw.write("OutputStreamWriter");
		//将流刷入文件
		osw.flush();
		//流关闭
		fos.close();


重定向输出流

	/**
	 * 重定向输出流
	 * @throws IOException 
	 */
	public static void redirectOutputStream() throws IOException {
		PrintStream ps = null;
		try {
			//新建输出流
			FileOutputStream fos = new FileOutputStream(new File("F:\\testSource\\newFile3.txt"));
			//转换节点流,PrintStream为输出流
			ps = new PrintStream(fos);
			//System重定向输出流(默认为控制台显示器)
			System.setOut(ps);
			out.println("重定向输出流到文件newFile3");
			ps.flush();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}finally {
			if(ps!=null)
				ps.close();
		}
	}


重定向标准输入输出流的方法:System.setErr(PrintStream ps) System.setIn(PrintStream ps) System.setOut(PrintStream ps)

读取进程的输入流

	public static void readProcess() throws IOException {
		BufferedReader br = null;
		try {
			//打开计算器
			Process rt = Runtime.getRuntime().exec("calc");
			//将进程的InputStream 包装成转换流,再将转换流包装成缓冲流
			br = new BufferedReader(new InputStreamReader(rt.getInputStream()));
			String str;
			while((str = br.readLine())!=null){
				out.println(str);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			if(br != null) {
				br.close();
			}
		} 
	}


实现对象序列化

序列化对象

import java.io.Serializable;
import lombok.Data;

public @Data class Person implements Serializable{
	private static final long serialVersionUID = 1L;
	private int age;
	private String name;
}


这里用到了lombok简化了javabean的编写

对象实例化以及读取实例化对象

	/**
	 * 实现对象序列化
	 * @throws IOException 
	 */
	public static void objectSerializable() throws IOException {
		ObjectOutputStream oos = null;
		ObjectInputStream ois = null;
		try {
			Person person = new Person();
			person.setAge(24);
			person.setName("zpf");
			/*
			 * 创建ObjectOutputStream(对象流)
			 * 把序列化对象输出到File对应的文件中
			 */
			oos = new ObjectOutputStream(new FileOutputStream(new File("F:\\testSource\\newFile4.txt")));
			/*
			 * 调用ObjectOutputStream的writeObject方法把对象写入文件
			 */
			oos.writeObject(person);
			oos.close();
			/*
			 * 读取文本文件序列化后的对象
			 * 创建输入流
			 */
			ois = new ObjectInputStream(new FileInputStream(new File("F:\\testSource\\newFile4.txt")));
			/*
			 * 读取流并转换成对象
			 */
			Person readPerson = (Person)ois.readObject();
			out.println("age:"+readPerson.getAge()+"	name:"+readPerson.getName());
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}catch(ClassNotFoundException e){
			e.printStackTrace();
		}finally {
			if(null!=oos) {
				oos.close();
			}
			if(ois!=null) {
				ois.close();
			}
		}
	}


对象引用序列化:被序列化的非基本类型是可序列化的。代码略.....

 

自定义序列化总结:

1:若序列化对象中有些属性不需要序列化可用关键字transient修饰对象属性

例:

Person对象中的name属性可以这样定义:
private transient String name;


这样在序列化时就不会序列化name属性(反序列化取不到name属性)。

 

2:需要实现自定义序列化的对象类需要在其中加入三方法:

【1】writeObject(ObjectOutputStream oos)throws IOException {}

【2】readObject(ObjectInputStream ois) throws IOException,ClassNotFoundException {}

【3】readObjectNoData()throws throws ObjectStreamException{}

3:自定义序列化的对象类中重写Object writeReplace()throws ObjectStreamException{}方法(待确认)

这种方法可以把序列化对象类型按照需要转换。

 

转自:www.itlanguageexpress.info

分享到:
评论

相关推荐

    Java IO(输入输出)案例练习

    2个Java的小练习代码,适合Java初学者使用,主要使用了Java中IO(输入输出)中的字节流和字符流知识。第一个是字节流的例子(模拟保存每日交易记录),第二个是字符流的例子(模拟记事本程序)。

    java学习 输入和输出处理复习知识点

    1)java.io包 File类 什么是文件:相关记录或放在一起的数据的集合 访问文件属性的API:java.io.File类 File类构造方法: 方法 说明 File(String pathname) 接受文件名作为字符串 File(Strint dir,String ...

    IO体系.java

    | mark操作记录输入流中的某个点,reset操作在从包含的输入流获取新字节前,再读取最后一次。 |--DataInputStream/:用于操作基本数据类型数据的对象,应用程序可以使用数据输入流写入稍后有数据输入流读取的数据...

    Java项目:星际争霸游戏(java+swing+awt界面编程+IO输入输出流+socket+udp网络通信)

    功能简介: 星际争霸游戏项目,该项目实现了单人模式和多人合作模式,可记录游戏进度,新建游戏,载入历史记录等功能

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

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

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

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

    java开源包4

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包11

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包101

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包6

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包9

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包5

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包8

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包10

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    疯狂JAVA讲义

    第1章 Java概述 1 1.1 Java语言的发展简史 2 1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 ...11.8.2 使用ImageIO输入/输出位图 427 11.9 剪贴板 432 11.9.1 数据传递的类...

    java开源包3

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java开源包1

    一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...

    java7源码-java-convert-example:本项目记录一些常见对象转换的方法,例如:文件转换、日期时间转换、stream流转换、

    平时的java项目中会存在各种对象的互相转换的情况,本项目记录一些常见对象转换的方法,例如:文件转换、日期时间转换、stream流转换、集合对象转换等 文件 Java 为文件操作设计了很多的类,有数据相关的 IO Stream ...

Global site tag (gtag.js) - Google Analytics