分类
|
字节输入流
|
字节输出流
|
字符输入流
|
字符输出流
|
抽象基类
|
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
分享到:
相关推荐
2个Java的小练习代码,适合Java初学者使用,主要使用了Java中IO(输入输出)中的字节流和字符流知识。第一个是字节流的例子(模拟保存每日交易记录),第二个是字符流的例子(模拟记事本程序)。
1)java.io包 File类 什么是文件:相关记录或放在一起的数据的集合 访问文件属性的API:java.io.File类 File类构造方法: 方法 说明 File(String pathname) 接受文件名作为字符串 File(Strint dir,String ...
| mark操作记录输入流中的某个点,reset操作在从包含的输入流获取新字节前,再读取最后一次。 |--DataInputStream/:用于操作基本数据类型数据的对象,应用程序可以使用数据输入流写入稍后有数据输入流读取的数据...
功能简介: 星际争霸游戏项目,该项目实现了单人模式和多人合作模式,可记录游戏进度,新建游戏,载入历史记录等功能
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...
一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...
一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...
一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...
一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...
一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...
一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...
一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...
一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...
第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的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...
一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-...
平时的java项目中会存在各种对象的互相转换的情况,本项目记录一些常见对象转换的方法,例如:文件转换、日期时间转换、stream流转换、集合对象转换等 文件 Java 为文件操作设计了很多的类,有数据相关的 IO Stream ...