JAVA文件读取和写入(内附简单的代码实现)

最近在测试链表、哈希表等数据结构的性能时,涉及到了文件的读取和写入操作。毕竟十万级的数据纯靠手动输入显然是不可能的。然后由于文件读取和写入格式的复杂性,导致JAVA中有很多不同功能的类,它们各自对应着不同的读/写格式。今天我们将简单介绍一下JAVA中文件处理类的继承关系,并提供一个简单的解决方案。后期我会另外再写一篇博客来深入探究这些文件类。

一、文件类的继承关系

(图片出处:https://blog.csdn.net/zhangbinu/article/details/51362612/

二、文件读取

1.按字符读取

如果我们要取的数据基本单位是单个字符,那么用这种方法读取文件就比较适合。比如:txt文件如下,我们需要取出其中的每一个字母存入一个数组中。

利用FileReader中的read()方法。FileReader.read(char[] cbuf),参数——cbuf是目标缓冲区;返回——读取的字符串数量,如果已达到末尾则返回-1。

具体代码实现如下

		int num=0;
                char[] buf=new char[1024];
                //打开文件
                FileReader fr = new FileReader("text.txt");
                //取出字符存到buf数组中
		while((num=fr.read(buf))!=-1) {
                        //String(char[] cbuf,a,b),从cbuf的位置a开始取出连续的b个char组成字符串
			System.out.println(new String(buf,0,num));;
		}
                //检测一下是否取到相应的数据
		for(int i=0;i<10;i++) {
			System.out.print(buf[i]+" ");
		}

2.按行读取

如果我们想要读取的是一个字符串,前面所讲的第一种方法显然是不适用的,因此我们来介绍下另一种方法——按行读取数据。我们可以看下以下文件

每一行保存一个字符串,这样我们在读取文件的时候只需要按行读取即可。

利用BufferedReader中的readLine()方法。BufferedReader.readLine(),没有参数,返回——包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null。

		int position=0;
                String[] bufstring=new String[1024];
                //打开带读取的文件
		BufferedReader br = new BufferedReader(new FileReader("text.txt"));
		String line=null;
		while((line=br.readLine())!=null) {
			bufstring[position]=line;
			position++;
		}
		br.close();//关闭文件
		for(int i=0;i<position;i++) {
			System.out.println(bufstring[i]);
		}

3.读取带分隔符的字符串

前面介绍的第一种方法不能读取字符串,第二种方法虽然可以读取字符串,但是由于每一行只能储存一个字符串,难免会觉得有些浪费空间。因此我们就会想,有没有一种能利用分割符来分割读取字符串的方法。JAVA中好像是没有这种API,但是我们如果对第一种方法进行一些后续处理,也可以达到这种效果。比如我们要读取的文件如下:

很明显,分隔符就是中文字符“,”。我们首先把文件中的字符都读取到字符数组buf中,再遍历字符数组,每遇到一个分隔符就保存一次字符串。代码如下:

		//依次读取一个字符,读到最后没有了就返回-1。有分隔符号
		ArrayList<String>stringlist=new ArrayList();//储存待读取的字符串
		FileReader fr = new FileReader("text.txt");
		while((num=fr.read(buf))!=-1) {
			System.out.println(new String(buf,0,num));;
		}
		//对字符串进一步处理
		String temp="";
		for(int i=0;i<buf.length;i++) {
			if(buf[i]==',') {//注意文件中的分隔符是中文还是英文字符
				stringlist.add(temp);
				temp="";
			}else {
				temp+=buf[i];
			}
		}

这一块JAVA中之所以没有相应的API是因为每种情况下分隔符都不一样,也许我们这里的“,”分隔符到了其他情况下就是要取出的内容,个性化太强。

三、文件写入

1.自动换行写入

利用OutputStream中的Println()方法

		int number=1;
		OutputStream os = new FileOutputStream("output.txt");
		PrintWriter pw=new PrintWriter(os);
		for(int i=0;i<10;i++) {
			String s=""+number;
			pw.println(s);//每输入一个数据,自动换行,便于我们每一行每一行地进行读取
			//pw.print(s+",");//不会自动换行,必要时可以自己添加分隔符
			number++;
		}
		pw.close();
		os.close();

2.不自动换行写入

利用OutputStream中的Print()方法

		int number=1;
		OutputStream os = new FileOutputStream("output.txt");
		PrintWriter pw=new PrintWriter(os);
		for(int i=0;i<10;i++) {
			String s=""+number;
			//pw.println(s);//每输入一个数据,自动换行,便于我们每一行每一行地进行读取
			pw.print(s+",");//不会自动换行,必要时可以自己添加分隔符
			number++;
		}
		pw.close();
		os.close();

四、注意点

1.在写这一部分代码的时候,经常会遇到以下的报错:Unhandled exception type FileNotFoundException,这时Eclipse会提供如下两种解决方案:

选择第一中解决方案,即在主函数后面添加 Throws IOException语句。如果选择第二种解决方案,文件写入会有问题,出现写不进去的情况。具体原因还在探究中。

2.要读取和写入的文件最好直接放到工程里面。这样路径就不用写太长。放入方法——直接在工程文件名处右击粘贴即可。

猜你喜欢

转载自blog.csdn.net/alexwym/article/details/81078417