java如何处理输入/输出--文本I/O(一)

文件类

存储在变量、对象中的数据是暂时的,程序终止的时候就会消失,将数据存储到文件中,可以使得数据可以传送并被其他程序使用。在面向对象的程序设计中,万物皆对象,所以为了允许程序对文件进行处理,需要把一个文件抽象成对象,在java中,获取文件属性以及删除、重命名文件等工作由File类来完成。

File类包含许多获取文件属性、删除文件等方法,但是,File类不包含创建文件和读写文件内容的方法 ,使用File类需要引入包java.io.File

在文件系统中,每个文件都存放在一个目录下,一个File类实例表示一个目录/文件,但是需要注意,创建一个file实例并不会在机器上创建一个文件,无论文件是否存在,都可以创建任意文件名的file实例,可以调用exists()方法来判断文件是否存在。

File对象封装了文件或路径的属性,但是不包括创建文件、读写文件数据的方法,为了完成I/O操作,需要使用java I/O类创建对象来完成。可以使用Scanner和PrintWriter类读写文本文件的内容。

例如:

File file =new File("image/us.gif");

创建了一个代表image/us.gif这个文件的对象file,在后续的操作中,用到文件的地方都用file这个对象来表示。

Windows中目录分隔符是反斜杠(),如C:\book\hi.java,但在java中反斜杠是特殊字符,所以windows文件目录应该表示为C:\\book\\hi.java 。Unix中文件目录分隔符为斜杠(/),如/home/jing/hi.java 。Java的目录分隔符也是(/),语句new File("image/us.gif") 在Windows、Unix或者其他任何系统上都能工作。

通过File类我们已经把一个具体的文件抽象成了java世界中的对象,接下来需要对这个文件进行创建、写入、读取。对于文件的输入/输出,Java提供了许多类,这些类可以分为文本I/O类和二进制I/O类。本文介绍文本I/O,二进制I/O另开文章介绍

对于文本,创建和写入的工作由输出对象--PrintWriter对象来完成,读取的工作由输入对象--Scanner对象来完成。输入对象(也称输入流,input stream)从文件读取数据流,输出对象(也称输出流,outputream)将数据流写入文件。

PrintWriter写数据

java.io.PrintWriter类实例可以创建一个文件,并向文本文件写入数据。

PrintWriter中的常用方法:

方法方法描述
PrintWriter(File f)为指定的文件对象f创建一个PrintWriter对象,这个对象专门负责对文件f进行各种写入操作。如果文件不存在,则创建该文件,如果存在,则文件的当前内容被废弃。调用构造函数可能抛出异常,需要进行处理
PrintWriter(String fileName)为指定的文件名字符串创建一个PrintWriter对象
print()向文件中写入内容,根据参数不同,有各种重载方法,写入字符串、double型、int型等等
println()比print()多打印一个行分隔符,行分隔符是由系统定义的,Windows是\r\n,Unix系统是\n
close()必须使用close()方法关闭文件,否在写入的数据不能正确的保存到文件中

例如:

import java.io.File
import java.io.PrintWriter

public class WriteData{
    public static void main(String[] args){
        File f=new File("a.txt");
        try {

            PrintWriter output=new PrintWriter(f);
            output.print("hiworld");
            output.close();

        }catch (Exception e) {
            System.out.println("写文件错误");
        }
}

以上程序,为a.txt文件创建一个文件对象,为该文件对象创建写入对象,通过写入对象写入“hi java”,最后关闭该文件。

注意:
1. 调用PrintWriter的构造方法可能抛出I/O异常,注意处理
2. 必须使用close()方法关闭文件,否在写入的数据不能正确的保存到文件中

Scanner读数据

java.util.Scanner类用来读取字符串和基本类型数值,将输入分为由空白字符分隔的有用信息,为了从文件或者键盘读取数据,需要为文件或System.in创建Scanner。例如:

Scanner input=new Scanner(System.in);//从键盘读取,为System.in创建Scanner

Scanner input=new Scanner(new File(filename));//为一个文件创建Scanner

注意:
1. 调用Scanner构造方法可能抛出I/O异常,注意处理。
2. 输入文件不必须关闭,但是关闭是个好习惯。

Scanner如何工作

nextByte()等都称为令牌读取方法,读取用分隔符分隔开的令牌,默认空格,可以使用ustDelimiter(String regex)方法设置新的分隔符模式。next()nextLint()都会读取一个字符串,next()方法读取一个由分隔符分隔的字符串,nextLint()读取一个以行分隔符结束的行。

在Windows平台上,行分隔符字符串是\r\n,在Unix平台上是\n
为得到特定平台上的行分隔符,使用String lineSeparator = System.getProperty("line.separator");
如果从键盘输入,每行以回车结束,对应\n字符。

一个令牌读取方法,首先跳过分隔符,然后读取一个以分隔符结束的令牌,然后将令牌自动转换为byte,int等类型,对于next()方法是不需要转换的。如果令牌和期望的类型不匹配,抛出运行异常java.util.InputMismatchException

令牌读取方法不读取令牌后面的分隔符,如果令牌读取方法之后调用nextLine(),该方法读取从这个分隔符开始,到这行的行分隔符结束的字符,这个行分隔符也被读取,但行分隔符不是nextLine()返回分字符串部分

例如:

一个test.txt的文本文件包含一行

12 345

在执行完下面代码之后,

Scanner input=new Scanner(new File("test.txt"));
int intValue=input.nextInt();
String line=input.nextLine();

intValue的值为12,line包含的字符是’ ‘、’3’、’4’、’5’

如果输入是从键盘输入,且用回车作为分隔,即输入12 然后回车,接着输入345,然后在回车。

Scanner input=new Scanner(System.in);
int intValue=input.nextInt();
String line=input.nextLine();

执行之后,intValue的值为12,line是一个空的字符串。原因:令牌读取方法nextInt()读取12,然后在分隔符处停止,这里的分隔符是行分隔符。nextLine()会在读取行分隔符之后结束,然后返回在行分隔符之前的字符串,由于在行分隔符之前没有字符,所以line是空的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值