【进击的Java小白】--文件读写操作

文件的读写操作详解

1.先谈谈I/O流类

在Java中将信息的输入与输出过程抽象为I/O流。(一个流就是一个流向目的地数据序列

  • 输入是指数据流入程序,即写入(writer)
  • 输出是指数据从程序流出,即读出(reader)

IO流一旦被创建就会自动打开;

调用close方法,可以显式关闭任何一个流,如果流对象不再被引用,Java的垃圾回收机制也会隐式地关闭它。但最好记得关闭,不然可能系统还没有完成所有数据的写操作,程序就已经结束了。

输入输出流可以分为3类:

1.输入流或输出流(从流的方向出发)

2.节点流或处理流(从流的分工划分。节点流:用来从数据源读入数据或往目的地写入数据;处理流:对数据执行某种处理)

3.面向字符的流或面向字节的流(从流的内容划分)。

1.1 面向字符的流–Reader和Writer类

字符流的源或目标通常是文本文件

字符流可以实现内部格式文本文件中的外部格式之间转换。

内部格式:16-bit char 数据类型

外部格式:1.UTF

​ 2.包括ASCLL码和非ASCLL码字符,比如希腊字符等

​ 3.GBK每个汉字2个字节,UTF-8每个汉字3个字节,加入在接 收一个中文字符时,只接收了中文字符的一个字节就开始输出,那么中 文字符就会失帧,所以就会乱码

1.2面向字节的流–InputStream和OutputStream类

数据源或目标中含有非字符数据,必须用字节流输入/输出,通常用来读写诸如图片、声音之类的二进制数据

1.3 三个标准输入输出流

  • System.in : InputStream类型,默认对应键盘输入;
  • System.out : PrintStream类型(OutputStram的子类),默认状态对应屏幕输出;
  • System.err : PrintStram类型,代表标准错误信息输出流,默认对应屏幕输出;

1.4I/O异常

多数I/O方法在遇到错误时会抛出异常,因此调用这些方法时必须在函数头声明抛出IOException异常,或者在try块中执行,然后捕获IOException.

1.5【举例–从键盘读入信息并在显示器上显示】

package course3;

import java.io.*;

public class Echo {
	public static void main(String[] args) throws IOException{
		BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
		String s;
        //s=in.readLine读取一行内容
		while((s=in.readLine()).length()!=0) {
			System.out.println(s);
		}
	}

}

解析:

这里使用的
System.in是在程序启动时由Java系统自动创建的流对象,由于它是原始的字节流,因而不能直接从中读取字符,需要对其做进一步的处理。本例中以
System.in作为参数,进一步创建了一个
InputstreamReader流对象,Inputstreamreader相当于字节流和字符流之间的一座桥梁,它读取字节将其转換为字符.Bufferedreader用于对inputstreamreader处理后的信息进行缓冲,以提高效率。

2.写文本文件

在磁盘上创建一个文本文件并往其中写入字符数据,需要用到FileWriter类,它是OutputStreamWriter类的子类,而OutputStreamWriter类又是Writer类的子类,即它属于字符流

1.在给出 File 对象的情况下构造一个 FileWriter 对象。

 FileWriter(File file, boolean append)

2.在给出文件名的情况下构造 FileWriter 对象,它具有指示是否追加写入数据的 boolean 值。

FileWriter(String fileName, boolean append)

3.写入单个字符c。

public void write(int c) throws IOException

4.写入字符数组中开始为offset、长度为len的某一部分。

public void write(char [] c, int offset, int len)

5.写入字符串中开始为offset长度为len的某一部分。

public void write(String s, int offset, int len)

2.1【举例–在C盘根目录创建文本文件Hello.txt,并往里写入若干行文本】

import java.io.*;   
class FileWriterTester {
  public static void main ( String[] args ) {
    String fileName = "c:\\Hello.txt" ;
    try {  //将所有IO操作放入try块中
  	   FileWriter writer = new FileWriter( fileName ,true );
 	   writer.write( "Hello!\n");  
    	   writer.write( "This is my blog,\n"  );  
    	   writer.write( "You can see how this is done. \n" );
        writer.write("先点赞,后观看,养成好习惯!\n");
     	 writer.close();
    }
    catch ( IOException iox) { 
        System.out.println("Problem writing" + fileName ); }
    }
}

详细解释:

1.运行此程序,会发现在原文件内容后面又追加了重复的内容,这就是将构造方法的第二个参数设为true的效果

2.如果将文件属性改为只读属性,再运行本程序,就会出现IO错误,程序将转入catch块中,给出出错信息

3.在给出文件名的情况下构造 FileWriter 对象,它具有指示是否追加写入数据的 boolean 值。

FileWriter(String fileName, boolean append)

4.文本很少时用FileWriter就行了,文本多时使用更高效的BufferedWriter类,两者包含的方法几乎一致,只是BufferedWriter多提供了一个行分隔符方法:

void newLine()

3.读文本文件

从一个文本文件读取字符数据需要用到FileReader类,他继承自Reader抽象类的子类InputStresmReader。

1.在给定从中读取数据的 File 的情况下创建一个FileReader。

FileReader(File file)

2.在给定从中读取数据的 FileDescriptor 的情况下创建一个新FileReader。

FileReader(FileDescriptor fd) 

3.给定从中读取数据的文件名的情况下创建一个新FileReader。

FileReader(String fileName) 

4.读取单个字符,返回一个int型变量代表读取到的字符.

public int read() throws IOException

5.读取字符到c数组,返回读取到字符的个数

public int read(char [] c, int offset, int len)

文件输入方法:

BufferedReader in  = new BufferedReader(new FileReader( fileName) ); 

在这里插入图片描述

3.1 【举例–从创建的文本文件Hello.txt中读取文本并显示在屏幕上】

import java.io.*;
class BufferedReaderTester {
    public static void main ( String[] args ) {
        String fileName = "C:/Hello.txt" , line;
        try {
             BufferedReader in = new BufferedReader(
                                              new FileReader( fileName  ) );
             line = in.readLine();   //读取一行内容
             while ( line != null ) { 
       	           System.out.println( line );
      	           line = in.readLine();
     	      }
            in.close(); 
        }
       catch ( IOException iox ) { 
            System.out.println("Problem reading " + fileName );  
        }
    }
}

详细解释:

•FileReader对象:创建后将打开文件,如果文件不存在,会抛出一个IOException

•BufferedReader类的readLine()方法:从一个面向字符的输入流中读取一行文本。如果其中不再有数据,返回null

•Reader类的read()方法:也可用来判别文件结束。该方法返回的一个表示某个字符的int型整数,如果读到文件末尾,返回 -1。据此,可修改本例中的读文件部分:

int c;

while((c=in.read())!= -1)

System.out.print((char)c);

4.巩固练习

在C盘根目录创建文本文件Hello.txt,并往里写入若干行文本。从Hello.txt中读取文本并显示在屏幕上。

import java.io.*;

public class Outtxt {
    public static void main(String[] args) throws IOException{
    	String filename="C:/Hello.txt";
    	try {  //将所有IO操作放入try块中
	    	 BufferedWriter writer = new BufferedWriter( new FileWriter(filename));
	   	     writer.write( "Hello!");  
	   	     writer.newLine();
	      	 writer.write( "This is my blog,"  );  
	      	 writer.newLine();
	      	 writer.write( "You can see how this is done." );
	      	 writer.newLine();
	         writer.write("先点赞,后观看,养成好习惯!");
	       	 writer.close();
	      }
	      catch ( IOException iox) { 
	          System.out.println("Problem writing" + filename ); 
	      }
        try{
            BufferedReader br = new BufferedReader(new FileReader(filename));//构造一个BufferedReader类来读取文件
            String s = null;
            while((s = br.readLine())!=null){//使用readLine方法,一次读一行
               System.out.println(s);
            }
            br.close();    
        }catch(IOException iox){
            System.out.println("Problem reading"+filename);
        }

    }

}

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰非一日之寒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值