一. 标准的输入流和输出流
System.in:标准的输入流,从键盘输入
System.out:标准的输出流,从显示器输出
System类中的setIn(InputStream is)和setOut(PrintStream ps)方式重新指定输入和输出的流
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Test{
public static void main(String[] args){
InputStreamReader isr = new InputStreamReader(System.in); //输入的是字节流,需要使用转换流将字节流转换为字符流
BufferedReader br = new BufferedReader(isr);
while(true){
String data = br.readLine();
if(data.equalsIgnoreCase("exit")){
break;
}
System.out.println(data);
}
br.close();
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test{
public static void main(String[] args){
BufferedReader br = null;
try {
InputStreamReader isr = new InputStreamReader(System.in);
br = new BufferedReader(isr);
while(true){
String data = br.readLine();
if(data.equalsIgnoreCase("exit")){
break;
}
System.out.println(data);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(br != null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
二. 打印流
import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;
public class Test{
public static void main(String[] args){
File file = new File("test.txt");
FileOutputStream fos = new FileOutputStream(file);
PrintStream ps = new PrintStream(fos);
if(ps != null){
System.setOut(ps); //之后输出的数据会写入test.txt文件中,不会在控制台输出
}
for(int i = 0; i <=100; i++){
System.out.print(i);
}
ps.close();
}
}
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
public class Test{
public static void main(String[] args){
PrintStream ps = null;
try {
File file = new File("test.txt");
FileOutputStream fos = new FileOutputStream(file);
ps = new PrintStream(fos);
if(ps != null){
System.setOut(ps); //之后输出的数据会写入test.txt文件中,不会在控制台输出
}
for(int i = 0; i <= 100; i++){
System.out.print(i);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
ps.close();
}
}
}
三. 数据流
用于读取或写入基本数据类型的变量和字符串
import java.io.*;
public class Test{
public static void main(String[] args){
//写入
File file = new File("test.txt");
FileOutputStream fos = new FileOutputStream(file);
DataOutputStream dos = new DataOutputStream(fos);
dos.writeUTF("Tom"); //将数据写入test.txt文件中
dos.flush(); //刷新
dos.writeInt(23);
dos.flush();
dos.writeChar('男');
dos.flush();
dos.close();
//读取
FileInputStream fis = new FileInputStream(file);
DataInputStream dis = new DataInputStream(fis);
String name = dis.readUTF(); //读出的顺序需要与写入的顺序一致
int age = dis.readInt();
char sex = dis.readChar();
System.out.println("name:" + name + ",age:" + age + ",sex:" + sex);
dis.close();
}
}
import java.io.*;
public class Test{
public static void main(String[] args){
//写入
File file = null;
DataOutputStream dos = null;
try {
file = new File("test.txt");
FileOutputStream fos = new FileOutputStream(file);
dos = new DataOutputStream(fos);
dos.writeUTF("Tom"); //将数据写入test.txt文件中
dos.flush(); //刷新
dos.writeInt(23);
dos.flush();
dos.writeChar('男');
dos.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(dos != null){
try {
dos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//读取
DataInputStream dis = null;
try {
FileInputStream fis = new FileInputStream(file);
dis = new DataInputStream(fis);
String name = dis.readUTF(); //读出的顺序需要与写入的顺序一致
int age = dis.readInt();
char sex = dis.readChar();
System.out.println("name:" + name + ",age:" + age + ",sex:" + sex);
} catch (IOException e) {
e.printStackTrace();
} finally {
if(dis != null){
try {
dis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
四. 对象流
用于读取和写入基本数据类型数据或对象
序列化:将内存中的java对象保存到磁盘中,使用ObjectOutputStream
反序列化:将磁盘中的对象还原为内存中的一个java对象,使用ObjectInputStream
import java.io.*;
public class Test{
public static void main(String[] args){
//写入
File file = new File("test.txt");
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(new String("I love China"));
oos.flush();
oos.close();
//读取
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
Object obj = ois.readObject();
System.out.println(obj);
ois.close();
}
}
import java.io.*;
public class Test{
public static void main(String[] args){
//写入
File file = null;
ObjectOutputStream oos = null;
try {
file = new File("test.txt");
FileOutputStream fos = new FileOutputStream(file);
oos = new ObjectOutputStream(fos);
oos.writeObject(new String("I love China"));
oos.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(oos != null){
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//读取
ObjectInputStream ois = null;
try {
FileInputStream fis = new FileInputStream(file);
ois = new ObjectInputStream(fis);
Object obj = ois.readObject();
System.out.println(obj); //I love China
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if(ois != null){
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
自定义类实现序列化和反序列化
自定义类可以序列化的要求:①该类需要实现Serializable接口;②该类需要提供一个全局常量serialVersionUID,该值为任意数;③该类内部的属性必须都是可序列化的(默认情况下,基本数据类型都是可序列化的),static和transient修饰的变量是不可序列化的。
import java.io.*;
public class Test{
public static void main(String[] args){
//写入
File file = null;
ObjectOutputStream oos = null;
try {
file = new File("test.txt");
FileOutputStream fos = new FileOutputStream(file);
oos = new ObjectOutputStream(fos);
oos.writeObject(new Person("Tom",22));
oos.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(oos != null){
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//读取
ObjectInputStream ois = null;
try {
FileInputStream fis = new FileInputStream(file);
ois = new ObjectInputStream(fis);
Object obj = ois.readObject();
System.out.println(obj); //Person{name='Tom', age=22}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if(ois != null){
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
class Person implements Serializable{
public static final long serialVersionUID = 45612387952L;
String name;
int age;
public Person(){
}
public Person(String name, int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
五. 任意访问文件流(RandomAccessFile)
RandomAccessFile直接继承于Object类,实现了DataInput和DataOutput接口
RandomAccessFile既可以作为一个输入流,也可以作为一个输出流
创建RandomAccessFile类实例时,需要指定访问模式:① r:只读;② rw:读写
import java.io.File;
import java.io.RandomAccessFile;
public class Test{
public static void main(String[] args){
File file1 = new File("test1.jpg");
File file2 = new File("test2.jpg");
RandomAccessFile raf1 = new RandomAccessFile(file1,"r");
RandomAccessFile raf2 = new RandomAccessFile(file2,"rw");
byte[] buffer = new byte[1024];
int len = raf1.read(buffer);
while(len != -1){
raf2.write(buffer,0,len);
len = raf1.read(buffer);
}
raf1.close();
raf2.close();
}
}
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
public class Test{
public static void main(String[] args){
RandomAccessFile raf1 = null;
RandomAccessFile raf2 = null;
try {
File file1 = new File("test1.jpg");
File file2 = new File("test2.jpg");
raf1 = new RandomAccessFile(file1,"r");
raf2 = new RandomAccessFile(file2,"rw");
byte[] buffer = new byte[1024];
int len = raf1.read(buffer);
while(len != -1){
raf2.write(buffer,0,len);
len = raf1.read(buffer);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(raf1 != null){
try {
raf1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(raf2 != null){
try {
raf2.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
如果RandomAccessFile作为输出流时,如果写出到的文件不存在,则会自动创建该文件,如果写出到的文件存在,则会对文件原有内容进行覆盖(能覆盖多少是多少)
import java.io.File;
import java.io.RandomAccessFile;
public class Test{
public static void main(String[] args){
File file = new File("test.txt"); //文件原内容为HelloWorld
RandomAccessFile raf = new RandomAccessFile(file,"rw");
raf.write("ABCDE".getBytes()); //现在文件内容为:ABCDEWorld
raf.close();
}
}
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
public class Test{
public static void main(String[] args){
RandomAccessFile raf = null;
try {
File file = new File("test.txt"); //文件原内容为HelloWorld
raf = new RandomAccessFile(file,"rw");
raf.write("ABCDE".getBytes()); //现在文件内容为:ABCDEWorld
} catch (IOException e) {
e.printStackTrace();
} finally {
if(raf != null){
try {
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
raf.seek(int i):将指针调到 i 的位置
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
public class Test{
public static void main(String[] args) throws IOException {
RandomAccessFile raf = null;
try {
File file = new File("test.txt"); //文件原内容为HelloWorld
raf = new RandomAccessFile(file,"rw");
raf.seek(2); //将指针调到2的位置
raf.write("ABCDE".getBytes()); //现在文件内容为:HeABCDErld
} catch (IOException e) {
e.printStackTrace();
} finally {
if(raf != null){
raf.close();
}
}
}
}
使用RandomAccessFile实现数据的插入:
import java.io.File;
import java.io.RandomAccessFile;
public class Test{
public static void main(String[] args){
File file = new File("test.txt"); //文件原内容为HelloWorld
RandomAccessFile raf = new RandomAccessFile(file,"rw");
raf.seek(5); //将指针调到4的位置
int flieLength = (int)file.length();
StringBuilder sb = new StringBuilder(flieLength);
byte[] buffer = new byte[20];
int len = raf.read(buffer);
while(len != -1){
sb.append(new String(buffer,0,len)); //将指针5后面的数据保存到StringBuilder中
len = raf.read(buffer);
}
raf.seek(5); //调回指针,将要添加的数据数据写入文件中
raf.write("New".getBytes());
raf.write(sb.toString().getBytes()); //将StringBuilder中的的数据数据写入文件中
raf.close();
//现在文件内容为:HelloNewWorld
}
}
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
public class Test{
public static void main(String[] args){
RandomAccessFile raf = null;
try {
File file = new File("test.txt"); //文件原内容为HelloWorld
raf = new RandomAccessFile(file,"rw");
raf.seek(5); //将指针调到4的位置
int flieLength = (int)file.length();
StringBuilder sb = new StringBuilder(flieLength);
byte[] buffer = new byte[20];
int len = raf.read(buffer);
while(len != -1){
sb.append(new String(buffer,0,len)); //将指针5后面的数据保存到StringBuilder中
len = raf.read(buffer);
}
raf.seek(5); //调回指针,将要添加的数据数据写入文件中
raf.write("New".getBytes());
raf.write(sb.toString().getBytes()); //将StringBuilder中的的数据数据写入文件中
} catch (IOException e) {
e.printStackTrace();
} finally {
if(raf != null){
try {
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//现在文件内容为:HelloNewWorld
}
}
注意:可以使用第三方jar包进行数据读写(更简单)