`
ganshisheng
  • 浏览: 41966 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java文件操作

阅读更多
1.文件操作的基本流程:
  1、 通过File类找到一个文件
  2、 通过File类去实例化字节流、字符流操作类
  3、 进行读或写的操作,在写的时候如果文件不存在则会自动创建
  4、 关闭流并释放资源

2.字节流
在字节流中分为两种:
    输出流:OutputStream
    输入流:InputStream

2.1 输出流
定义:abstract class OutputStream extends Object implements Closeable, Flushable
      |-OutputStream子类:FileOutputStream
      |-构造方法:public FileOutputStream(File file)
输出方法: void write(byte[] b) 将 b.length 个字节从指定的字节数组写入此输出流
需要将一个字符串变为一个byte数组,通过方法:public byte[] getBytes() 将String转化成byte[]。
关闭流:void close() 关闭此输出流并释放与此流有关的所有系统资源。
例1.程序如下:(代码没有优化,只为实现效果)
		// 1.通过File找到一个文件
		File file = new File("e:\\hello.txt");
	
		try {
			// 2.通过子类实例化
			OutputStream out = new FileOutputStream(file);
			String str = "Hello World!!!!";
			byte b[] = str.getBytes();
			// 3.写操作
			out.write(b);
			// 4.关闭流
			//out.close();
		} catch (Exception e) {}

2.2 输入流
使用InputStream读取内容。
InputStream也是一个抽象类,所以必须使用其子类:FileInputStream
读的方式:
int read(byte[] b) 从输入流中读取一定数量的字节并将其存储在缓冲区数组 b 中。
   |- 传入一个byte数组,将所有的内容保存在byte数组之中。
   |- 此方法返回向数组中写入数据的个数
将byte数组变为字符串:public String(byte b[])、public String(byte b[],int be,int len)
例2.
		File file = new File("e:\\hello.txt") ;
		try {
			// 通过子类实例化
			InputStream input = new FileInputStream(file);
			byte b[] = null;
			int len = 0;
			b = new byte[1024];//
			// 把所有的内容读到数组b中
			// 返回读取的个数
			len = input.read(b);
			input.close();
			System.out.println(new String(b, 0, len));
		} catch (Exception e) {}


在读取文件的时候,我们需要设置byte[]的长度,如果大了,那么空间就会浪费,至于如何根据文件大小设置
长度,将b = new byte[1024];替换成 b = new byte[(int)file.length()] ;就行了。

3.字符流
一个字符 = 两个字节。
在字符流操作中,主要使用以下两个类:
   字符输出流:Writer
   字符输入流:Reader

3.1 字符输出流
写字符串: void write(String str) 写入字符串。
例3.
		try {
			// 通过子类实例化
			Writer out = new FileWriter(new File("e:\\hello.txt"));
			String str = "Hello World!!!!!";
			out.write(str);
			out.close();
		} catch (Exception e) {}

3.2 字符输入流
读的方法:
  |-  int read(char[] cbuf) 将字符读入数组。
  |-  int read() 读取单个字符。
例4.
		try {
			// 通过子类实例化
			Reader input = new FileReader(file);
			char c[] = null;
			int len = 0;
			c = new char[(int) file.length()];
			len = input.read(c);
			System.out.println(new String(c, 0, len));
			input.close();
		} catch (Exception e) {}

4. 字节流和字符流的区别
所有的文件不管是使用Output、Writer实际上最终保存在文件上的都是字节。字符是在内存中形成的。
例如将例1中的out.close();注释掉,表示不关闭输出流。

     // 1.通过File找到一个文件
     File file = new File("e:\\hello.txt") ;
    // 2. 输出流操作类
    OutputStream out = null;
    try {
        // 2.通过子类实例化
         out = new FileOutputStream(file);
        String str = "Hello World!!!";
        byte b[] = str.getBytes();
        // 3.写操作
         out.write(b);
        // 4.关闭流
         //out.close();
    }catch (Exception e) {}
我们观察到字符串依然写到文件里,证明字节流是直接操作文件本身的。再看字符流的输出,我们将程序例3
的关闭流语句注释了,运行之后,发现文件虽然创建,但是内容并没有写进去,这是因为对于字符流在关闭操
作的时候,会强制性的将缓存清空,那么以上代码并没有关闭,所以现在的内容还在缓存里,并没有直接到文
件之中。想如何在不关闭流的情况下写文件呢?
在Writer类中提供了一个强制性清空缓存的操作: abstract void flush() 刷新此流。
将out.close();替换为   out.flush() ;
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics