Java——输入与输出

1. File类

Ⅰ 创建一个File对象的常用构造方法有3种:

(1)File(String pathname)     通过指定的文件路径字符串来创建一个新File实例对象。

(2)File(String path,String filename)  根据指定的父路径字符串和子路径字符串(包括文件名称)创建File类的实例对象。

(3)File(File file,String filename)   根据指定的File类的父路径和字符串类型的子路径(包括文件名称)创建File类的实例对象。

注意: 创建一个File对象时,如果它代表的文件不存在,系统不会自动创建,必须要调用createNewFile()方法创建。

Ⅱ File类常用的方法如下表所示:

import java.io.File;

public class Example1 {
	public static void main(String[] args) {
	
		// 创建文件对象
		File file = new File("F:\\flora大学\\example.txt");
		 
		// 输出文件属性
		System.out.println("文件名称:" + file.getName());
		System.out.println("文件是否存在:" + file.exists());
		System.out.println("文件的相对路径:" + file.getPath());
		System.out.println("文件的绝对路径:" + file.getAbsolutePath());
		System.out.println("文件可以读取:" + file.canRead());
		System.out.println("文件可以写入:" + file.canWrite());
		System.out.println("文件大小:" + file.length() + "B");
	}
}

 运行效果:

2.  输入输出流

输入输出流一般分为4种:

  • 字节输入流:InputStream类是字节输入流的抽象类,它是所有字节输入流的父类,其各种子类实现了不同的数据输入流。
  • 字节输出流:OutputStream类是字节输出流的抽象类,它是所有字节输出流的父类,其子类实现了不同数据的输出流。
  • 字符输入流:Reader类是字符输入流的抽象类,所有字符输入流的实现都是它的子类。
  • 字符输出流:Writer类是字符输出流的抽象类,所有字符输出流的实现都是它的子类。

(1) FileInputStream类:实现了文件的读取,是文件字节输入流。该类适用于比较简单的文件读取.

创建文件字节输入流常用的构造方法有两种:

  • FileInputStream(String filePath)
  • FileInputStream(File file)
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class Example2 {
	public static void main(String args[]) {
		File f = new File("F:\\flora大学\\example.txt");
		try {
			byte bytes[] = new byte[512];
			FileInputStream fis = new FileInputStream(f); // 创建文件字节输入流
			int rs = 0;
			System.out.println("The content of Example2 is:");
			while ((rs = fis.read(bytes, 0, 512)) > 0) {// 在循环中读取输入流的数据
				String s = new String(bytes, 0, rs);
				System.out.println(s);
			}
			fis.close(); // 关闭输入流
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

显示效果:

(2)FileOutputStream类:实现了文件的写入,能够以字节形式写入文件中

创建文件字节输出流常用的构造方法有两种:

  • FileOutputStream(String filePath)
  • FileOutputStream(File file)        注意:file:File文件类型的实例对象。在file后面,加true会对原有内容进行追加,不加true会将原有内容覆盖。
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class Example3 {
	public static void main(String args[]) {
		int b;
		File file = new File("F:\\flora大学\\example.txt");
		byte bytes[] = new byte[512];
		System.out.println("请输入你想存入文本的内容:");
		try {
			if (!file.exists()) // 判断文件是否存在
				file.createNewFile();
			b = System.in.read(bytes);// 把从键盘输入的字符存入bytes里
			FileOutputStream fos = new FileOutputStream(file,true); // 创建文件输出流
			fos.write(bytes, 0, b); // 把bytes写入到指定文件中
			fos.close(); // 关闭输出流
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

显示效果:

                

注意:如果把FileOutputStream fos = new FileOutputStream(file,true);语句中的true去掉,则新写入的内容会覆盖掉原来文件的内容。

3.字符流

  • 字符流(charactercstreams)用于处理字符数据的读取和写入,它以字符为单位。
  • Reader类和Writer类是字符流的抽象类,它们定义了字符流读取和写入的基本方法,各个子类会依其特点实现或覆盖这些方法。

ⅠReader类和Write类 

(1)Reader类:是所有字符输入流的父类,它定义了操作字符输入流的各种方法。常用方法如下表所示。

(2)Writer类是所有字符输出流的父类,它定义了操作输出流的各种方法。常用方法如下表所示

 Ⅱ InputStreamReader类与OutputStream Writer类

(1)InputStreamReader 是字节流通向字符流的桥梁。它可以根据指定的编码方式,将字节输入流转换为字符输入流。

创建字符输入流常用的构造方法有两种:

  • InputStreamReader(InputStream in)      in:字节流类的实例对象。
  • InputStreamReader(InputStream in, String cname)      cname:使用的编码方式名。

InputStreamReader类常用的方法如下表所示。 

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class Example4 {
	public static void main(String args[]) {
		try {
			int rs;
			File file = new File("F:\\\\flora大学\\\\example.txt");
			FileInputStream fis = new FileInputStream(file);
			InputStreamReader isr = new InputStreamReader(fis);
			System.out.println("The content of Example4 is:");
			while ((rs = isr.read()) != -1) { // 顺序读取文件里的内容并赋值给整型变量b,直到文件结束为止。
				System.out.print((char) rs);
			}
			isr.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

(2)OutputStreamWriter类

OutputStreamWriter 是字节流通向字符流的桥梁。写出字节,并根据指定的编码方式,将之转换为字符流。

创建字符输出流常用的构造方法有两种。

  • OutputStreamWriter(OutputStream out)
  • OutputStreamWriter(OutputStream out,String cname)

OutputStreamWriter类常用的方法如下表所示: 

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Example5 {
	public static void main(String[] args){
		File filein=new File("F:\\flora大学\\example.txt");
		File fileout=new File("F:\\\\flora大学\\\\example1.txt");		
		try {
			if (!filein.exists()   // 如果文件不存在
				filein.createNewFile();	// 创建新文件
			if (!fileout.exists())							
				fileout.createNewFile();						
			FileInputStream fis = new FileInputStream(filein);
			FileOutputStream fos=new FileOutputStream(fileout,true);
			InputStreamReader in = new InputStreamReader (fis); 
			OutputStreamWriter out = new OutputStreamWriter (fos);
			int is;
			while((is=in.read()) != -1){  //读取example文件的数据
				out.write(is);            //写入example1文件中
			}
			in.close();
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

ⅲ FileReader类与FileWriter类

(1)FileReader类:实现了从文件中读出字符数据,是文件字符输入流

FileReader类的常用构造方法有两种:

  • FileReader(String filePath)
  • FileReader(File file)
读取example1中的内容输出到控制台——核心代码
try {
     File f=new File("F:\\\\flora大学\\\\example1.txt");
     FileReader fr=new FileReader(f);		// 创建文件字符输入流
     char[] data=new char[512];
     int rs=0;
     while((rs=fr.read(data))>0){			// 在循环中读取数据,将读取的数据存在数组里
          String str=new String(data,0,rs);
          System.out.println(str);
     }
     fr.close();
} catch (Exception e) {
     e.printStackTrace();
}

(2)FileWriter类:实现了将字符数据写入文件中,是文件字符输出流。

FileWriter类的常用构造方法有两种:

  • FileWriter(String filePath)
  • FileWriter(File file)
将“Example5-1.txt”的内容复制到文件“Example6.txt”中——核心代码
try {
     File f=new File("C:\\","Example6.txt");
     if (!f.exists())				
          f.createNewFile();				
     FileReader fr=new FileReader("C:\\Example5-1.txt");	// 创建文件字符输入流
     FileWriter fWriter=new FileWriter(f);		// 创建文件字符输出流
     int is;
     while((is=fr.read()) != -1){
          fWriter.write(is);				// 将数据写入输出流
     }
     fr.close();
     fWriter.close();
} catch (Exception e) {
     e.printStackTrace();
}

 Ⅳ BufferedReader类与BufferedWriter类

(1)BufferedReader类:使用该类可以以行为单位读取数据。

①BufferedReader类的主要构造方法为:BufferedReader(Reader in)   即该构造方法使用Reader类的对象,创建一个BufferReader对象。

②BufferedReader 类中提供了一个ReaderLine()方法,Reader类中没有此方法,该方法能够读取文本行。

try {
			FileReader fr = new FileReader("F:\\flora大学\\example1.txt"); // 创建文件字符输入流
			BufferedReader br = new BufferedReader(fr);
			String aline;
			while ((aline = br.readLine()) != null) { // 按行读取文本
				String str = new String(aline);
				System.out.println(str);
			}
			fr.close();
			br.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

 (2)BufferedWriter类:以行为单位写入数据

①BufferedWriter类常用的构造方法为:BufferedWriter(Writer out)

②BufferedWriter类提供了一个newLine()方法,Writer类中没有此方法。该方法是换行标记。

	File file=new File("F:\\\\flora大学\\\\example.txt");
		try {
	             FileWriter fos = new FileWriter(file,true);
		     BufferedWriter bw=new BufferedWriter(fos);
		     bw.write("Example");
		     bw.newLine();
		     bw.write("Example");
		     bw.close();
		} catch (IOException e) {
		     e.printStackTrace();
		}

(3)综合用法: 

用BufferedReader和BufferedWriter将Example5中的内容复制到Example5-1中
try {
			FileReader fr = new FileReader("C:\\Example5.txt");	// 创建BufferedReader对象
			File file = new File("C:\\Example5-1.txt");
			FileWriter fos = new FileWriter(file);		// 创建文件输出流
			BufferedReader br=new BufferedReader(fr);
			BufferedWriter bw=new BufferedWriter(fos);	// 创建BufferedWriter对象
			String str =null;
			while ((str = br.readLine()) != null) {
				bw.write(str + "\n"); 					// 为读取的文本行添加回车
			}
			br.close();									// 关闭输入流
			bw.close();									// 关闭输出流
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

ⅴPrintStream类与PrintWriter类

(1)PrintStream:打印输出流,它可以直接输出各种类型的数据

创建打印输出流常用的构造方法为:PrintStream(OutputStream out)

PrintStream类常用的方法如下表所示:

try {
			File file=new File("F:\\flora大学\\example2.txt");
			if (!file.exists())								
				file.createNewFile();					
			PrintStream ps = new PrintStream(new FileOutputStream(file));
			Random r=new Random();
			int rs;
			for(int i=0;i<5;i++){
			rs=r.nextInt(100);  //随机生成0——100间的5个数(不包括100)——※
			ps.println(rs+"\t");
			}
			ps.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

显示效果:

(2)PrintWriter类

①PrintWriter是打印输出流,该流把Java语言的内构类型以字符表示形式送到相应的输出流中,可以以文本的形式浏览。

②创建该打印输出流常用的构造方法有两种。

③PrintWriter类常用的方法如下表所示:

  • PrintWriter(Writer out)
  • PrintWriter(OutputStream out)
使用PrintWriter实现文件的复制执行过程为:
File filein=new File("C:\\","Example6.txt");
File fileout=new File("C:\\","Example7.txt");
try {
     //创建一个BufferedReader对象
     BufferedReader br=new BufferedReader(new FileReader(filein));
     //创建一个PrintWiter对象
     PrintWriter pw=new PrintWriter(new FileWriter(fileout));     
     int b;
     //读出文件“Example6.txt”中的数据
     while((b=br.read())!=-1){
          pw.println(b);				//写入文件中
     }
     br.close();					//关闭流
     pw.close();					//关闭流
} catch (Exception e) {
     e.printStackTrace();
}

4.System.in获取用户输入

①in:是静态变量,类型是InputStream。

②Java实现键盘输入的一般过程为:

实现键盘输入,把输入的内容存到example2中
核心代码:
File file=new File("F:\\\\flora大学\\\\example2.txt");
		try {
			if (!file.exists())								
				file.createNewFile();							
			InputStreamReader isr=new InputStreamReader(System.in);
			BufferedReader br=new BufferedReader(isr);
			System.out.println("请输入:");
			String str=br.readLine();
			System.out.println("您输入的内容是:"+str);

			FileWriter fos=new FileWriter(file,true);    //创建文件输出流
			BufferedWriter bw=new BufferedWriter(fos);
			bw.write(str);
			br.close();
			bw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

5.  RandomAccessFile类

使用RandomAccessFile类可以读取任意位置数据的文件。RandomAccessFile类既不是输入流类的子类,也不是输出流类的子类。

②RandomAccessFile类常用的构造方法有两种。

  • RandomAccessFile(String name,String mode)

       name:和系统相关的文件名。mode:用来决定创建的流对文件的访问权利,它可以是r、rw、rws或rwd。r代表只读, rw代表可读写,rws代表同步写入,rwd代表将更新同步写入。

  • RandomAccessFile(File file,String mode)

③RandomAccessFile类常用的方法如下表所示:

利用RandomAccessFile类显示文件本身 
   try {
			File f = new File("F:\\flora大学\\example1.txt");
			RandomAccessFile raf = new RandomAccessFile(f, "rw"); // 创建随机访问文件为读写
			long filepoint = 0;     // 定义文件总长度变量
			long filel = raf.length();   // 获取文件的长度
			while (filepoint < filel) {
				String str = raf.readLine();   // 从文件中读取数据
				System.out.println(str);
				filepoint = raf.getFilePointer();
			}
			raf.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
创建int型数组,把int型数组写入到文件example2中,然后按倒序读出这些数据
核心代码:
                int bytes[] = { 1, 2, 3, 4, 5 };
		try {
			RandomAccessFile raf = new RandomAccessFile("F:\\flora大学\\example2.txt", "rw"); //创建RandomAccessFile类的对象
			for (int i = 0; i < bytes.length; i++) {
				raf.writeInt(bytes[i]);
			}
			for (int i = 0; i < bytes.length; i++) {
				raf.seek(i * 4); // int型数据占4个字节
				System.out.println(raf.readInt());
			}
			raf.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

6. 过 滤 器 流

①过滤器流(FilterStream)是为某种目的过滤字节或字符的数据流。基本输入流提供的读取方法,只能用来读取字节或字符。而过滤器流能够读取整数值、双精度值或字符串。但需要一个过滤器类来包装输入流。

②DataInputStream 和DataOutputStream类分别是FilterInputStream和FilterOutputStream类的子类。它们分别实现了DataInput和DataOutput接口,该接口中定义了独立于具体机器的带格式的读写操作,从而可以实现对Java中的不同基本类型数据的读写。

例如,从文件中读取数据。可以先创建一个FileInputStream类的对象,然后把该类传递给一个DataInputStream的构造方法。

FileInputStream fis = new FileInputStream("Example.txt");

DataInputStream dis=new DataInputStream(fis);

int i=dis.readInt();

dis.close();

再例如,把数据写入文件。可以先创建一个FileOutputStream类的对象,然后把该类传递给一个DataOutputStream的构造方法。

7.对象序列化

①使用对象输入输出流实现对象序列化可以直接存取对象。

②将对象存入一个流称为序列化。而从一个流将对象读出称为反序列化。

③ObjectInput接口与ObjectOutput接口中定义的对象反序列化和序列化方法如下:

ⅰ.ObjectInput与ObjectOutput

(1)readObject()

所谓反序列化就是从输入流中获取序列化的对象数据,用这些数据生成新的Java对象。该方法定义在ObjectInput接口中,由ObjectInputStream类实现。

语法:Object object=readObject()   object:Java对象。

注意:使用readObject()方法获取的序列化对象是Object类型的,必须通过强行类型转换才能使用。

(2)writeObject ()

序列化就是将对象写入到输出流,这个输出流可以是文件输出流、网络输出流以及其他数据输出流。该方法定义在ObjectOutput接口中,由ObjectOutputStream类实现。

语法:writeObject(object);    object:将要序列化的对象。

注意:被序列化的对象必须实现java.io.Serializable接口,否则不能实现序列化。

ii.ObjectInputStream与ObjectOutputStream

①Java提供了ObjectInputStreamObjectOutputStream类读取和保存对象,它们分别是对象输入流和对象输出流。②ObjectInputStream类和ObjectOutputStream类是InputStream类和OutputStream类的子类,继承了它们所有的方法。

创建ObjectInputStream 类的构造方法为:ObjectInputStream(InputStream in)

例1:使用对象输入流读取一个对象到程序中。

FileInputStream fis=new FileInputStream("Example.txt");

ObjectInputStream ois=new ObjectInputStream(fis);

ois.readObject();  //读取基本数据类型

ois.close();

例2.使用对象输出流将对象写入到文件中。

FileOutputStream fos=new FileOutputStream("Example.txt");

ObjectOutputStream obs=new ObjectOutputStream(fos);

obs.writeObject("Example");   //写入基本数据类型方法

obs.close();

实现用户密码的修改
(1)创建user类,构造方法中存在姓名、密码、年龄3个参数,并实现Serializable接口。
public class user implements Serializable {
	String name;
	String password;
	int age;

	user(String name, String password, int age) {
		this.name = name;
		this.password = password;
		this.age = age;
	}

	public void setpassword(String pass) {
		this.password = pass;
	}
}

(2)创建Example10类,将user类的对象写入文件中,修改用户密码之后再将其读出
public class Example10 {
	public static void main(String args[]){
		user use=new user("Tom","111",21); //创建user类的对象
		try {
			
			FileOutputStream fos=new FileOutputStream("F:\\\\flora大学\\\\example2.txt");
			ObjectOutputStream obs=new ObjectOutputStream(fos);//创建输出流的对象,使之可以将对象写入文件中
			obs.writeObject(use);	//将对象写入文件中
			
			System.out.println("未修改写入文件的用户信息");
            //打印文件中的信息
			System.out.println("用户名:"+use.name);			
			System.out.println("原密码:"+use.password);
			System.out.println("年龄:"+use.age);
			
			FileInputStream fis=new FileInputStream("F:\\flora大学\\example2.txt");		
			ObjectInputStream ois=new ObjectInputStream(fis);//创建输入流的对象,使之可以从文件中读取数据
			use=(user)ois.readObject();	//读取文件中的信息
			use.setpassword("1111");	//修改密码
			
			System.out.println("修改之后文件中的信息");
	  //打印修改后的文件信息
			System.out.println("用户名:"+use.name);
			System.out.println("修改后的密码:"+use.password);
			System.out.println("年龄:"+use.age);
			obs.close();
			ois.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

实现效果:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值