「 JAVA 」IO操作

1. 什么是输入:输入是一个从外界进入到程序的方向,通常我们需要“读取”外界的数据时,使用输入。所以输入是用来读取数据的。
2. 什么是输出:输出是一个从程序发送到外界的方向,通常我们需要”写出”数据到外界时,使用输出。所以输出是用来写出数据的

TestFileInputStream

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

public class TestFileInputStream {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int b = 0;
		FileInputStreamin = null;
		try {
			in = new  FileInputStream("C:\\Users\\Administrator\\eclipse-workspace\\Study_Well\\src\\IO\\TestFileInputStream.java");
			System.out.println("找到文件!");
		} catch (FileNotFoundException e) {
			// TODO: handle exception
			System.out.println("找不到文件!");
			System.exit(-1);
		}
		
		try {
			long num = 0;
			while((b=in.read())!=-1) {
				System.out.println((char)b);
				num++;
			}
			in.close();
			System.out.println();
			System.out.println("共读了"+num+"个字节!");
		} catch (IOException e) {
			// TODO: handle exception
			System.out.println("文件读取错误");
			System.exit(-1);
		}
	}

}
输出结果:
.....(所有代码,太多了省略)
共读了920个字节!

但是在这里,你会发现使用FileInputStream可能会导致输出的中文变成"?",这是因为他把文字拆成了多个字节,可以将FileInputStream改写成FileReader,这样他是一个字符一个字符的读,就不会出现"?"了。

TestFileOutStream

public class TestFileOutStream {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int b = 0;
		FileInputStream in = null;
		FileOutputStream out = null;
		try {
			in = new FileInputStream("C:\\Users\\Administrator\\eclipse-workspace\\Study_Well\\src\\IO\\TestFileInputStream.java");
			out = new FileOutputStream("C:\\Users\\Administrator\\eclipse-workspace\\Study_Well\\src\\IO\\TestCopy.java");
			while((b=in.read())!=-1) {
				out.write(b);
			}
			in.close();
			out.close();
		} catch (FileNotFoundException e) {
			// TODO: handle exception
			System.out.println("找不到文件!");
			System.exit(-1);
		} catch (IOException e) {
			// TODO: handle exception
			System.out.println("文件复制错误!");
			System.exit(-1);
		}
		System.out.println("文件复制成功!");
	}

}
输出结果:
文件复制成功!

BufferStream

public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\eclipse-workspace\\Study_Well\\src\\IO\\HelloWorld.java");
			BufferedInputStream bis = new BufferedInputStream(fis);
			int c = 0;
			System.out.println(bis.read());
			System.out.println(bis.read());
			bis.mark(10);
			for (int i = 0; i <= 10 && (c = bis.read()) != -1; i++) {
				System.out.print((char)c+" ");
			}
			System.out.println();
			bis.reset();
			for (int i = 0; i <= 10 && (c = bis.read())!= -1; i++) {
				System.out.print((char)c+" ");
			}
			bis.close(); 
		} catch (IOException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
运行结果:
112
97
c k a g e   I O ; 
c k a g e   I O ;

BufferStream处理流,起到调整数据流的作用。mark表示在第10个位置做标记,下次输出时,就在第十个位置开始输出。reset表示将输出位置再重新调会10。

public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			BufferedWriter bw = new BufferedWriter(new FileWriter("C:\\Users\\Administrator\\eclipse-workspace\\Study_Well\\src\\IO\\datatest.txt"));
			BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\Administrator\\eclipse-workspace\\Study_Well\\src\\IO\\datatest.txt"));
			String s = null;
			for(int i=0;i<=100;i++) {
				s = String.valueOf(Math.random());
				bw.write(s);
				bw.newLine();
			}
			bw.flush();
			while((s = br.readLine())!=null) {
				System.out.println(s);
			}
			bw.close();
			br.close();
		} catch (IOException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
运行结果:
0.6289943266516365
0.6407906300137581
0.24106444633819124
0.2322800389110108
...................
...................
0.0709316083098841
0.46882376122067226
0.42146318033369856
0.7200027386594796

BufferedWriter 与 BufferedReader,扩大输入流与输出流,例如:输出不再是一个字符一个字符的输出,而是一行一行的输出。

TransForm 转换流

转换流,将字节流转换成字符流。例如:原本是一个字节一个字节的读,转换成字符流后,便是一个字符一个字符的读取。

//转换流 输出
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("C:\\Users\\Administrator\\eclipse-workspace\\Study_Well\\src\\IO\\char.txt"));
			osw.write("qwerbbbbbbbbbbbbbbbbbbbb");
			System.out.println(osw.getEncoding());
			osw.close();
			osw = new OutputStreamWriter(new FileOutputStream("C:\\Users\\Administrator\\eclipse-workspace\\Study_Well\\src\\IO\\char.txt",true),"ISO8859_1");
			osw.write("zxcvvvvvvvvvvvvvvvvvvvvv");
			System.out.println(osw.getEncoding());
			osw.close();
		} catch (IOException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
运行结果:
GBK
ISO8859_1

char.txt文件显示:
qwerbbbbbbbbbbbbbbbbbbbbzxcvvvvvvvvvvvvvvvvvvvvv

FileOutputStream有个参数true,意思是继续添加数据,如果没有设置true参数,则文件会重新置空添加。后面的ISO8859_1则为文件编码参数。

//转换流 输入
public static void main(String[] args) {
		// TODO Auto-generated method stub
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader br = new BufferedReader(isr);
		String s = null;
		try {
			s = br.readLine();
			while(s!=null) {
				if(s.equalsIgnoreCase("exit"))
					break;
				System.out.println(s.toUpperCase());
				s = br.readLine();
			}
			br.close();
		} catch (IOException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
输出结果:
hello
HELLO
exit

DataInputStream、DataoutputStream 数据流

public static void main(String[] args) {
		// TODO Auto-generated method stub
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		DataOutputStream dos = new DataOutputStream(baos);
		try {
			dos.writeDouble(Math.random());
			dos.writeBoolean(true);
			ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
			System.out.println(bais.available());
			DataInputStream dis = new DataInputStream(bais);
			System.out.println(dis.readDouble());
			System.out.println(dis.readBoolean());
			dos.close();
			dis.close();
		} catch (IOException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
运行结果:
9
0.17360738968844514
true

数据的输入和输出都是相对于机器的内存而言的,input指的是输入,output指的是输出,把内存中的内容输出到设备上(屏幕,硬盘,打印机等等)。
available方法是输出内存中的有效位,即此时的9个字节。
数据流谁先输入就先输出谁,类似队列的先进先出。

PrintStream 打印流

public static void main(String[] args) {
		// TODO Auto-generated method stub
		PrintStream ps = null;
		try {
			FileOutputStream fos = new FileOutputStream("C:\\Users\\Administrator\\eclipse-workspace\\Study_Well\\src\\IO\\log.dat");
			ps = new PrintStream(fos);
		} catch (IOException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		if(ps != null)
			System.setOut(ps);
		int In = 0;
		for(char c = 0; c <= 100 ;c++) {
			System.out.print(c+" ");
			if(In++ >= 100) {
				System.out.println();
				In = 0;
			}		
		}
	}
输出为文件中的多个字符。

setOut将黑窗口的输出设置到输出流ps上。

public static void main(String[] args) {
		String filename = args[0];
		if(filename != null)
			list(filename,System.out);
	}

	public static void list(String filename, PrintStream out) {
		try {
			BufferedReader br = new BufferedReader(new FileReader(filename));
			String s = null;
			while((s = br.readLine())!=null) {
				out.println(s);
			}
			br.close();
		} catch (IOException e) {
			// TODO: handle exception
			out.println("无法读取!");
		}
	}

ObjectIO Object流

public class TestObjectIO {
	public static void main(String[] args) throws Exception {
		T t = new T();
		t.k = 8;
		FileOutputStream fos = new FileOutputStream("C:\\Users\\Administrator\\eclipse-workspace\\Study_Well\\src\\IO\\testObjectIO.dat");
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(t);
		oos.flush();
		oos.close();
		
		FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\eclipse-workspace\\Study_Well\\src\\IO\\testObjectIO.dat");
		ObjectInputStream ois = new ObjectInputStream(fis);
		T tReaded = (T) ois.readObject();
		System.out.println(tReaded.i + " " + tReaded.j + " " + tReaded.d + " " + tReaded.k);
	}
}

class T implements Serializable{
	int i = 10;
	int j = 9;
	double d = 2.3;
	transient int k = 15;
}
运行结果:
10 9 2.3 0

首先是Serializable接口,这个是需要自己定义的序列化接口,transient修饰的成员变量,在序列化的时候不给予考虑,所以输出的结果为0。还需要注意的就是输出的时候需要把变量强转为T类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值