字节流 [1]FileOutputStrean(文件字节输出流) 构造方法FileOutputStream(String型路径,boolean型是否追加=false)
package t1; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Test { public static void main(String[] args) { test1(); } //FileOutputStream private static void test1() { FileOutputStream out=null;//创建这个流对象 try { out=new FileOutputStream("C:\\Users\\Shinelon\\Desktop\\sb.txt");//为这个流对象分配空间 try { out.write(50);//写入ascii的50 } catch (IOException e) {//写入时可能会有IO异常 e.printStackTrace(); } } catch (FileNotFoundException e) {//为流对象分配空间时可能找不到这个文件 e.printStackTrace(); }finally{ if(out!=null) try { out.close();//最终要将它关闭 } catch (IOException e) {//关闭时可能会有IO异常 e.printStackTrace(); } } } }如果要写入一个String串,那么要把它用成员函数getBytes()转化成字节数组,再传给write()方法作参数。如out.write(str.getBytes(),0,5)表示对str串从0开始写5个字符给out对应的文件中。
[2]FileInputStream(文件字节输入流)
package t1; import java.io.FileInputStream; public class Test { public static void main(String[] args) { test2(); } //FileInputStream private static void test2() { FileInputStream in=null; try { in=new FileInputStream("C:\\Users\\Shinelon\\Desktop\\sb.txt"); /*int i; while((i=in.read())!=-1){//文件尾为-1,这里的read是字节形式的读取 System.out.println((char)i);//转为字符并输出 }*/ byte[] buffer=new byte[1024];//创建一个字节数组 in.read(buffer);//全都读到字节数组中去 System.out.println(new String(buffer));//转换构造函数构造成string类型 } catch (Exception e) { e.printStackTrace(); } } }运行结果: 可以看到这一行的后面补了很多空格,要把这些空格去掉,可以将22行改成
System.out.println(new String(buffer).trim());用String类的trim()方法可以去掉两端的空白字符(trim的有参的用法另查)。 当然,read也可以传入更多的参数,read(buffer,偏移量,要读长度)。
[3]例子-拷贝(先读后写的过程)
package t1; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Test { public static void main(String[] args) { copy(); } //例子-拷贝 private static void copy() { FileInputStream in=null; FileOutputStream out=null; try { in=new FileInputStream("C:\\Users\\Shinelon\\Desktop\\sb.txt"); out=new FileOutputStream("C:\\Users\\Shinelon\\Desktop\\sb2.txt"); byte[] buffer=new byte[1024]; in.read(buffer); out.write(new String(buffer).trim().getBytes()); } catch (Exception e) { e.printStackTrace(); }finally{//在finally块中关闭流 try { in.close(); out.close(); } catch (IOException e) { e.printStackTrace(); } } } }字符流 要想书写汉字时候,需要使用字符流。 [1]FileWriter(文件字符输出流)
package t1; import java.io.FileWriter; import java.io.IOException; public class Test { public static void main(String[] args) { test3(); } //文件字符输出流 private static void test3() { FileWriter out=null; try { out=new FileWriter("C:\\Users\\Shinelon\\Desktop\\sb.txt"); out.write("刘知昊");//可以写中文了 } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); }finally{ if(out!=null) try { out.close(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } } }[2]FileReader(文件字符输入流)
package t1; import java.io.FileReader; public class Test { public static void main(String[] args) { test4(); } //文件字符输出流 private static void test4() { FileReader in =null; try { in=new FileReader("C:\\Users\\Shinelon\\Desktop\\sb.txt"); char[] buffer=new char[20]; in.read(buffer); System.out.println(buffer); } catch (Exception e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } }运行结果: 后面的空格是因为buffer开的空间就是这么大,要去掉则需要对buffer再做处理。
System.out.println(new String(buffer).trim());[3]例子-拷贝(先读后写的过程)
package t1; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class Test { public static void main(String[] args) { copy(); } //例子-拷贝 private static void copy() { FileReader in=null; FileWriter out=null; try { in=new FileReader("C:\\Users\\Shinelon\\Desktop\\sb.txt"); out=new FileWriter("C:\\Users\\Shinelon\\Desktop\\sb2.txt"); char[] buffer=new char[1024]; in.read(buffer);//读进数组里 out.write(new String(buffer).trim());//再从数组(内存)写进另一个文件中 } catch (Exception e) { e.printStackTrace(); }finally{//关闭输入输出流 if(in!=null) try { in.close(); } catch (IOException e) { e.printStackTrace(); } if(out!=null) try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } }