IO流(字符流)_wo不理智的博客-程序员秘密

技术标签: Java基础学习  java  perl  

IO流(字符流)

字符流

一.字符流是什么

  • 字符流是可以直接读取字符的IO流
  • 字符流读取字符,就要先读去到字节数据,然后转为字符,如果要写出字符,需要把字符转为字节再写出

FileReader

  • FileReader类的read()方法可以按照字符大小读取

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Demo1_FileReader {
    

	public static void main(String[] args) throws IOException {
    
		demo1();
		FileReader fr = new FileReader("xxx.txt");
		int x;
		while((x = fr.read()) != -1) {
       //通过项目默认的码表,一次读取一个字符
			System.out.print((char)x);
		}
		fr.close();
	}

	public static void demo1() throws FileNotFoundException, IOException {
    
		FileReader fr = new FileReader("xxx.txt");//需要创建xxx.txt,如果没有就报错
		int x = fr.read();         //read方法返回jdk码值
		System.out.println(x);    
		char c = (char)x;          //要想得到字符,要将码值向下强转成对应的字符
		System.out.println(c);
		fr.close();
	}

}

FileWriter

  • FileWrirer类的write()方法可以自动把字符转为字节写出

import java.io.FileWriter;
import java.io.IOException;

public class Demo2_FileWriter {
    

	public static void main(String[] args) throws IOException {
    
		FileWriter fw = new FileWriter("yyy.txt"); //如果有文件直接写,没有文件就创建一个再写
		fw.write("zt是傻x");
		fw.write(122);
		fw.close();
	}

}

拷贝文件


import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Demo3_Copy {
    

	public static void main(String[] args) throws IOException {
    
		FileReader fr = new FileReader("xxx.txt");
		FileWriter fw = new FileWriter("yyy.txt");
		
		int x;
		while((x = fr.read()) != -1) {
    
			fw.write(x);
		}
		fr.close();
		fw.close();
		//Write类中有一个2k的小缓冲区,如果不关流,会将文件内容留到缓冲区中,关流会将缓冲区的内容刷新,再关闭
	}

}

一.什么情况下使用字符流

  • 字符流也可以拷贝文件,但不推荐使用,因为读取是会酱紫结转为自负,写出时还要将字符转为字节,很麻烦

那什么时候用呢?

  • 程序需要只读取一段文本时用字符流,因为读取的时候是按大小读取的,不会出现半个中文
  • 程序需要只写出一段文本时用字符流,因为写出的时候可以直接按字符串写出,不用转换为字符数组

二.字符流是否可以拷贝非纯文本文件

  • 不可以,因为在读的时候会将字节转换为字符,在转的过程中,可能找不到对应的字符,就用?代替,
    写出的时候会将字符转为字节写出去,如果是?,直接写出,这样写出的文件就乱了.

三.自定义字符数组的拷贝


import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Demo3_Copy {
    
	public static void main(String[] args) throws IOException {
    
		//自定义字符数组的拷贝
		FileReader fr = new FileReader("xxx.txt");
		FileWriter fw = new FileWriter("yyy.txt");
		
		char[] arr = new char[1024];
		int len;
		while((len = fr.read()) != -1) {
           //将文件的数据读取到字符数组中
			fw.write(arr,0,len);               //将字符数组中的数据写到文件中
		}
		fr.close();
		fw.close();
	}
}

带缓冲区的字符流

一.带缓冲区的流中的常规方法

  • BufferedReader的read()方法读取字符时会一次读取若干字符到缓冲区,然后逐个返回给程序,降低读取文件的次数,提高效率
  • BufferedWriter的Writer()方法写出字符时会先写到缓冲区,缓冲区写满后才会写到文件,降低写文件的次数,提高效率

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Demo3_Copy {
    
	public static void main(String[] args) throws IOException {
    
		BufferedReader br = new BufferedReader(new FileReader("xxx.txt"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("yyy.txt"));
		
		int c;
		while((c = br.read()) != -1) {
    
			bw.write(c);
		}
		br.close();
		bw.close();
	}
}

二.带缓冲区的流中的特殊方法

  • BufferedReader的readLine()方法可以读取一行字符(不包括换行符号)
  • BufferedWriter的newLine()可以输出一个跨平台的换行符号
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Demo4_Buffered {
    

	public static void main(String[] args) throws IOException {
    
		//demo1();
		BufferedReader br = new BufferedReader(new FileReader("xxx.txt"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("yyy.txt"));
		
		String line;
		while((line = br.readLine()) != null) {
    
			bw.write(line);
			//bw.newLine();             //写出回车换行符
			bw.write("\r\n");
		}
		br.close();
		bw.close();
	}

	public static void demo1() throws FileNotFoundException, IOException {
    
		BufferedReader br = new BufferedReader(new FileReader("xxx.txt"));
		
		String line;//readLine返回一行字符串,用String接收
		while((line = br.readLine()) != null) {
    
			System.out.println(line);
		}
		br.close();
	}

}

newLine()与\r\n的区别

  • newLine()是跨平台的方法
  • \r\n只支持Windows系统

LineNumberReader

  • LineNumberReader是BufferedReader的子类,具有相同的功能,并且可以统计行号
  • 调用getLineNumber()方法可以获取当前行号
  • 调用setLineNumber()方法可以设置当前行号
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;

public class Demo5_LineNumberReader {
    

	public static void main(String[] args) throws IOException {
    
		LineNumberReader lnr = new LineNumberReader(new FileReader("zzz.txt"));
		
		String line;
		lnr.setLineNumber(100); //设置开始编号
		while((line = lnr.readLine()) != null) {
    
			System.out.println(lnr.getLineNumber() + ":" + line);
			//101:a 102:b 103:c 104:d 105:e
		}
		lnr.close();
 	}

}

装饰设计模式

一. 装饰设计模式的好处是

  • 耦合性不强,被装饰类的变化与装饰类的变化无关
public class Demo6_Warp {
    

	public static void main(String[] args) {
    
		HeiMaStudent hs = new HeiMaStudent(new Student());//向装饰类中传入被装饰类
		hs.code();
		//javase javaweb ssh 数据库 大数据
	}

}

interface Coder {
    
	public void code();
}

class Student implements Coder {
    //被装饰类

	@Override
	public void code() {
    
		System.out.println("javase");
		System.out.println("javaweb");
	}
	
}

class HeiMaStudent implements Coder {
    //装饰类
	//1.获取装饰类的引用
	private Student s;
	//2.在构造方法中传入被装饰的对象
	public HeiMaStudent(Student s) {
    
		this.s = s;
	}
	//3.对原有功能升级
	@Override
	public void code() {
    
		s.code();
		System.out.println("shh");
		System.out.println("数据库");
		System.out.println("大数据");
	}
	
}

使用指定的码表读写字符

  • FileReader是使用默认码表读取文件,如果需要使用指定码表读取,那么可以使用InputStreamReader(字节流对象,编码表):字节转字符
  • FileWriter是使用默认码表写出文件,如果需要使用指定码表写出,那么可以使用InputStreamWriter(字节流对象,编码表):字符转字节
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;

public class Demo7_TransIO {
    

	public static void main(String[] args) throws IOException {
    
		//demo1();
		//demo2();
		//demo3();
	}

	public static void demo3() throws UnsupportedEncodingException, FileNotFoundException, IOException {
    
		//使用BufferedReader,BufferedWriter包装类包装InputStreamReader,使其更强大
		BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("utf-8.txt"), "utf-8"));//更高效地读
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("gbk.txt"), "gbk"));//更高效的写
		
		int c;
		while((c = br.read()) != -1) {
    
			bw.write(c);
		}
		br.close();
		bw.close();
	}

	public static void demo2() throws UnsupportedEncodingException, FileNotFoundException, IOException {
    
		//使用指定的码表读写字符
		InputStreamReader isr = new InputStreamReader(new FileInputStream("utf-8.txt"), "uTf-8");  //指定码表读字符
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("gbk.txt"), "gbk");//指定码表写字符
		
		int c;
		while((c = isr.read()) != -1) {
    
			osw.write(c);
		}
		isr.close();
		osw.close();
	}

	public static void demo1() throws FileNotFoundException, IOException {
    
		//根据默认编码表读写,出现乱码
		FileReader fr = new FileReader("utf-8.txt");//使用utf-8码表读(你好你好)
		FileWriter fw = new FileWriter("gbk.txt");//使用gbk码表写(浣犲ソ浣犲ソ)
		
		int c;
		while((c = fr.read()) != -1) {
    
			fw.write(c);
		}
		fr.close();
		fw.close();
	}

}

包装类图解
在这里插入图片描述

递归

一.概述

  • 方法自己调用自己

二.递归的利与弊

  • 递归的弊端:不能调用次数太多,容易导致栈内存溢出
  • 递归的好处:不用知道循环次数

三.构造方法不能使用递归调用
四.递归调用是否必须有返回值?

  • 不一定(可以有,可以没有)
public class Demo8_Digui {
    

	public static void main(String[] args) {
    
		System.out.println(fun(6));
	}

	public static int fun(int n) {
    
		if(n == 1)
			return 1;
		else
			return n * fun(n-1);
	}
	
}

案例演示

获取某个文件夹下的所有.java文件,递归打印

import java.io.File;
import java.util.Scanner;

public class Test5 {
    

	public static void main(String[] args) {
    
		File dir = getDir();
		printJavaFile(dir);
	}
	
	public static File getDir() {
    
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一个文件夹路径:");
		while(true) {
    
			String line = sc.nextLine();
			File dir = new File(line);       //封装成File文件
			if(!dir.exists()) {
    
				System.out.println("您输入的文件夹不存在,请重新输入:");
			} else if(dir.isFile()) {
    
				System.out.println("您输入的是文件,请重新输入:");
			} else {
    
				return dir;
			}
		}
	}
	
	public static void printJavaFile(File dir) {
    
		File[] subFiles = dir.listFiles();   //创建文件夹数组存储文件和文件夹
		for (File subFile : subFiles) {
    
			if(subFile.isFile() && subFile.getName().endsWith(".java")) {
    
				System.out.println(subFile);
			} else if(subFile.isDirectory()) {
    
				printJavaFile(subFile);//递归
			}
		}
	}
	
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_56504344/article/details/118060036

智能推荐

springcloud实战之7 断路器(Hystrix)_远观钱途的博客-程序员秘密

在微服务广泛使用的架构中,成群的服务通过服务注册与订阅来建立关联,但每个微服务都是独立的部分(跨进程,跨机器,跨机房),服务之间通过远程调用的方式相互访问,这种架构就增加了因为网络原因造成阻塞的风险,一旦发生阻塞,一个请求经过漫长的等待最终失败,高并发情况下就可能导致整个为服务群体瘫痪,就性能上,此种微服务架构还不如传统的集中式服务安全,稳定,性能高。为了解决这种问题,springcloud提供了断

Dhtml Html Css JavaScript Dom_shantoo的博客-程序员秘密

DHTML Dhtml是动态的html,是将Html Css Dom Javascript这四种技术进行融合产生的。Html:        将数据进行封装。Dom:        将标签封装成对象。Css:          标签中数据的样式。Javascript: 将三者进行融合,通过程序设计方式来完成动态效果的操作。HTML在HTML中

Cesium天体运行动画效果的实现思路_cesium 动画_Zisen_66的博客-程序员秘密

Cesium中的动画效果都是依据clock进行实现的,天体运行也相同,最基础的思路就是设置clock,设置SampledPositionProperty(),最后把SampledPositionProperty()加入entity的position中。设置时钟let start = new Cesium.JulianDate.fromDate(new Date());// 开始时间start = Cesium.JulianDate.addHours(start, 8, new Cesium.Juli

深度学习指标:准确率acc,精确率precision,召回率recall,f1-score的通俗解释_acc指标_难受啊!马飞...的博客-程序员秘密

TP: 将正类预测为正类数FN: 将正类预测为负类数FP: 将负类预测为正类数TN: 将负类预测为负类数准确率(accuracy) = 预测对的/所有 = (TP+TN)/(TP+FN+FP+TN)精确率(precision) = TP/(TP+FP)召回率(recall) = TP/(TP+FN)f-score = 精确率 * 召回率 * 2 / (精确率 + 召回率)举个例子最近正好做 男女儿童的分类,举个具体的例子解释一下:假设 儿童5w, 识别成儿童的有4w, 识别成other

PHP数组常用方法(优化版)_夏已微凉、的博客-程序员秘密

目录前言内容:一、判断/查找:1、is_array — 检测变量是否是数组1、语法2、使用3、类似的方法2、in_array — 检查数组中是否存在某个值1、语法2、使用3、array_key_exists — 检查数组里是否有指定的键名或索引1、语法2、使用4、array_search — 在数组中搜索给定的值,如果成功则返回首个相应的键名1、语法2、使用5、array_keys — 返回数组中部分的或所有的键名1、语法2、使用:6、array_values — 返回数组中所有的值1、语法2、使用:7、c

Docker-Compose快速搭建Oracle-12C系统_星河_赵梓宇的博客-程序员秘密

Docker-Compose快速搭建Oracle-12C系统前置条件请先安装Docker脚本version: '2'services: oracle12c: image: sath89/oracle-12c volumes: - ./datas:/u01/app/oracle environment: DBC...

随便推点

Android7.0使用FileProvider的时候容易出现的问题_YAMgoddess的博客-程序员秘密

Android7.0之后,应用间传递文件有两种解决方案,一种是开启严苛模式并关闭对文件的检测,第二种就是Google推荐的使用FileProvider去适配新的版本。1、FileProvider的使用,这个一般都会放两个图片完事2、使用时可能会出现的问题FileProvider的使用 <provider android:name="androidx.core.content.FileProvider" android:authorities=.

双重循环优化,提高运行效率_新晋小菜鸟的博客-程序员秘密

循环次数较少的时候for循环一般不会影响运行效率,但一旦循环次数较多,成千上万的时候,循环次数越多,效率就越慢,最近在做一程序的时候要解决优化问题,反复查看只有优化双重for循环才能提高效率。事实证明,优化后效率提升了一大半。 当然,本文也有借鉴其他博友的方法,根据以下方法提升效率:1、实例化变量放在for循环外,减少实例化的次数2、把能在循环外计算的,尽量在循环外计算,减少在内层的运算...

java jdk和openjdk_OpenJDK与JDK的区别分析_宇文护泰的博客-程序员秘密

一、以下是具体分析:使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK,那么到底什么是OpenJDK,它与Sun JDK有什么关系和区别呢?历史上的原因是,OpenJDK是JDK的开放原始码版本,以GPL协议的形式放出。在JDK7的时候,OpenJDK已经成为JDK7的主干开发,Sun JDK7是在OpenJDK7的基础上发布的...

weui datapicker出现的问题_weui datepicker 控件是歪的_Liam_Fang_的博客-程序员秘密

$('#showDatePicker_2').on('click', function () { weui.datePicker({ start: '2018-7-11',//这里出现的问题 end: '2019-5-1', onConfirm: function (result) { ...

关于博弈论中的一硬币正反问题的分析_weixin_34324081的博客-程序员秘密

  前两天在看一个纳什均衡的词语时在网上搜索发现一个问题如下你正在图书馆坐着,一位陌生美女主动过来和你搭讪,并要求和你一起玩个数学游戏。美女提议:“让我们各自亮出硬币的一面,或正或反。如果我们都是正面,那么我给你3元,如果我们都是反面,我给你1元,剩下的情况你给我2元就可以了。”那么该不该和这位姑娘玩这个游戏呢?这基本是废话,当然该。问题是,这个游戏公平吗?  我们分析的主要不是为...

i3处理器_配酷睿十代i3-10100,不足3000元的迷你电脑值得买吗_weixin_39819152的博客-程序员秘密

最近新品比较多,比如英特尔推出了一个G5900,虽然看着比G5400高,但实际上是双核双线程的。这再次提醒我们,不能只看编号,还是要看实效。说到编号,现在酷睿十代i3已经登场了,叫i3-10100,比起i3-9100,其升级为四核八线程,提升还是有的。而我们也看到,戴尔、联想等都推出了这款处理器的轻薄电脑,一起来看看。以戴尔为例,戴尔成就3681,采用了i3-10100处理器,LGA 1200插槽...

推荐文章

热门文章

相关标签