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类型。