流是用来读写传输数据的,输入和输出是对程序本身而言的,但程序需要读入数据用读入流,程序需要将数据输出保存起来用输出流。
流相当于各种不同的管道来传输数据。按读入和输出分为输入流和输出流。按传输的类型分为字节流和字符流。按管道与管道的关系又可分为节点流与处理流。
字节流中输出使用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 = " Hello Word!";// 归位转义字符的用法? 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("读入内容: " + 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("读入内容: " + 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() */
在屏幕上中文并不能正确显示
实际文件可以正确复制