流是用来读写传输数据的,输入和输出是对程序本身而言的,但程序需要读入数据用读入流,程序需要将数据输出保存起来用输出流。
流相当于各种不同的管道来传输数据。按读入和输出分为输入流和输出流。按传输的类型分为字节流和字符流。按管道与管道的关系又可分为节点流与处理流。
字节流中输出使用OutputStream类输入使用InputStream类。
在java中流的操作分为下面4个步骤:
- 使用File类打开一个文件
- 通过流的子类来指定位置
- 进行输入或输出操作
- 关闭输入/输出
字节流
字节输出流:OutputStream
OutputStream类是抽象类,其子类FileOutputStream
向一个文件中写入字符串:
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.FileOutputStream;
public class Test {
public static void main(String[] args) {
try {
//在io.txt中写入Hello Word!
OutputStream fos = new FileOutputStream("e:\\java\\io.txt");//FileOutputStream的FileOutputStream(String name)构造方法
//(FileOutputStream fos = new FileOutputStream(f);String str = "e:\\java\\io.txt";File f = new File(str);)
String str = "Hello Word!";
byte b[] = str.getBytes();//Byte 还是byte?@getBytes
//将一个数组直接写入文件当中
fos.write(b);
/*
//通过循环把每一个字节写入文件中
for(int i = 0;i < b.length;i++) {
fos.write(b[i]);
}
*/
fos.close();
}catch(IOException e) {
e.printStackTrace();
}
try {
//在io.txt中追加写入Hello Word!
OutputStream fos = new FileOutputStream("e:\\java\\io.txt",true);//FileOutputStream的FileOutputStream(String name, boolean append)构造方法
String str = "\r\nHello Word!";// \r归位转义字符的用法?
byte b[] = str.getBytes();
fos.write(b);//最后文件写入两行Hello Word!
fos.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
字节输入流InputStream
InputStreamStream是抽象类,其子类FileInputStream
从文件中读取类容
import java.io.File;
import java.io.IOException;
import java.io.FileInputStream;
public class Test {
public static void main(String[] args) {
try{
FileInputStream in = new FileInputStream("e:\\java\\io.txt");
int b;
while((b = in.read()) != -1) {
System.out.print((char)b);
}
in.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
以数组的形式读取类容
import java.io.File;
import java.io.IOException;
import java.io.FileInputStream;
public class Test {
public static void main(String[] args) {
try{
//读取1KB内容
FileInputStream in = new FileInputStream("e:\\java\\io.txt");
byte b[] = new byte[1024];//读入1KB;
in.read(b);
in.close();
System.out.print("读入内容:\n" + new String(b));
}catch(IOException e) {
e.printStackTrace();
}
System.out.println(" ");
try{
//读取指定文件字节个内容
FileInputStream in = new FileInputStream("e:\\java\\io.txt");
File f = new File("e:\\java\\io.txt");
int a = (int)f.length();//public long length()
byte b[] = new byte[a];
in.read(b);
in.close();
System.out.print("读入内容:\n" + new String(b));
}catch(IOException e) {
e.printStackTrace();
}
}
}
/*
1.数据存储单位大小:
1 Byte = 8 Bits
1 KB = 1024 Bytes
1 MB = 1024 KB
1 GB = 1024 MB
2.byte b[] = new byte[a]中开辟空间的大小必须使用int类型的。不能用double类型。
*/
复制文件内容
import java.io.File;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class Test {
public static void main(String[] args) {
//可以读取.java类型文件,下面是两种路径写法
String str1 = "e:" + File.separator + "java" + File.separator + "pkg1" + File.separator + "Test.java";//String str = "e:\\java\\pkg1\\Test.java";
try {
File f1 = new File(str1);
FileInputStream fis = new FileInputStream(f1);
int b;
while((b = fis.read()) != -1) {
System.out.print((char)b);
}
//是否应该关闭这个流?@应该的
fis.close();
}catch(IOException e) {
e.printStackTrace();
}
//把上个文件按字节流形式复制到另一文件
try {
String str2 = "e:\\java\\pkg1\\aaa.txt";//如果这个路径文件夹不存在 能否自己创建?@不能自己创建
//String str2 = "e:\\java\\AAAA\\aaa.txt";
File f1 = new File(str1);
File f2 = new File(str2);
FileInputStream fis = new FileInputStream(f1);
FileOutputStream fos = new FileOutputStream(f2);
int b;
while ((b = fis.read()) != -1) {
fos.write(b);
}
fis.close();fos.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
/*
1.所有的异常都需要引用import,例如上面的import java.io.IOException
2.main主方法不应该抛异常,试想main方法已经是最后一个方法了
3.流进行读写操作之后应该关闭,例如fis.close()
*/
在屏幕上中文并不能正确显示
实际文件可以正确复制