Reader字符输入流和Writer字符输出流

一、Reader字符输入流

Reader类是一个抽象类,提供的方法与InputStream类似只是将基于byte的参数改为基于char。

1、FileReader类

FileReader是Reader的一个子类,用于读取字符文件,每次读取一个字符或一个字符数组,其类对象通常看成一个以字符为基本单位的无格式字符输入流。

构造方法有

(1)FileReader(String path) :创建一个新的 FileReader ,给一个String类型文件的名称。

(2)FileReader(File file):创建一个新的 FileReader ,以File作为对象进行读取。

返回值类型及方法名说明
int read()从输入流中读取一个字符,如果返回 -1, 则表示已经到了输入流的末尾。
int read(char[] b)从输入流中读取若干个字符,并把它们保存到参数 b 指定的字符数组中。
void close关闭对象释放所占的系统资源
public class Demo05 {
	public static void main(String[] args) throws IOException {
		//String path
		Reader r = new FileReader("E:\\javaee2307IO\\e.txt");
		
		//file作为对象
		File f = new File("E:\\javaee2307IO\\e.txt");
		Reader r1 = new FileReader(f);
		
		//read()读取一个一个的字符,返回类型是int
		int b = r1.read();
		System.out.println((char)b);
		
		// read(char[] array)
		char[] c = new char[5];
		r1.read(c);
		System.out.println(Arrays.toString(c));
		
		r.close();
		r1.close();
	}
}

2、BufferedReader类

BufferedReader 类主要用于辅助其他字符输入流,它带有缓冲区,可以先将一批数据读到内存缓冲区。

常用方法:

(1)BufferedReader(Reader r):将输入流r转换成带缓冲的字符流,缓冲区大小系统默认的;

(2)String readLine():从输入流中读取一行字符,行结束标志为回车('\r')/换行('\n')或连续的回车换行符(''r''\n')。

public class Demo02 {
	public static void main(String[] args)throws IOException {
		BufferedReader br=new BufferedReader(new FileReader("D:/number.txt"));  
		int c = -1;                            
		while((c = br.read()) != -1)          
			System.out.print((char)c);  
		System.out.println();
	}

二、字符输出流

Writer类是一个抽象类,提供的方法与OutputStream类似,它把byte转换成char并输出

1、FileWriter类

FileWriter类就是向文件中写入字符流的writer。

构造方法有:

(1)FiteWriter(String path) :创建一个新的 FileWriter ,给一个String类型文件的名称。

(2)FileWriter(File file):创建一个新的 FileWriter ,以File作为对象进行写入。

(3)FileWriter(String path,boolean append):给一个String类型文件的名称,参数二表示是否附加写入数据。

(4)FileWriter(File file,boolean append):创建一个新的 FileWriter ,以File作为对象进行写入,给出一个带有布尔值的文件名,表示是否附加写入数据。

方法名及返回值类型说明
void write(int c)向输出流中写入一个字符
void write(char[] c)写入字符数组
void write(String str)向输出流中写入一个字符串
void close()关闭对象,释放资源
public class Demo01 {
	public static void main(String[] args) throws IOException {
		Writer w = new FileWriter("E:\\javaee2307IO\\e.txt");
		w.write(97);
		char[] c = {'我','爱','中','国'};
		w.write(c);
        w.write(c, 0, 2);
		w.write("我是索子哥");
		w.write("爱丽丝你撒大声地", 0, 6);
        //刷新该流的缓冲
		w.flush();
		w.close();
		System.out.println("写入成功");
	}
}
public class Demo03 {
	public static void main(String[] args) throws IOException {
		//追加方式一
		Writer w = new FileWriter("E:\\javaee2307IO\\e.txt",true);
		
		
		//追加方式二
		File f = new File("E:\\javaee2307IO\\e.txt");
		Writer w1 = new FileWriter(f,true);
	}
}

2、BufferedWriter类

BufferedWriter 类主要用于辅助其他字符输出流,它同样带有缓冲区,可以先将一批数据写入缓冲区。

常用方法:

(1)BufferedWriter(Writer out):创建一个 BufferedWriter 来修饰参数 out 指定的字符输出流。

(2)void newLine():该方法用于写入一个行分隔符。

public class Demo04 {
	public static void main(String[] args) {
		//shift+alt+z快捷生成try...catch
		//BufferedWriter 字符缓冲输出流
		try (BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\javaee2307IO\\d.txt"));) {
			bw.write("星世界纳溪");
			bw.newLine();
			bw.write("死亡如风长版送无人");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

三、properties类

properties该类主要用于读取Java的配置文件,Properties 继承自 Hastable ,来表示一个持久的属性及集,它使用键值对的结构存储数据,每个键及其对应的值都是一个字符串。

构造方法:Properties() 创建一个没有默认的空属性列表

Properties extends Hashtable<Object,Object>

存储方法:

(1)public Object setProperty(String key, String value):保存一对键值对,返回值是oldValue

(2)public String getProperty(String key):根据键获取值

(3)stringPropertyNames( ):获取properties对象的所有值

(4)load (InputStream inStream):从输入流中读取属性列表(键和元素对)

(5)store ( OutputStream out, String comments):将此 Properties 表中的属性列表(键和元素对)写入输出流。

public class Demo09 {
	public static void main(String[] args) {
		/*
		 * Properties extends Hashtable<Object,Object>
		 * 
		 * p.setProperty(key,value),存储键值对,返回值是oldValue
		 * p.getProperty(key) 获取键值对的值
		 * p.stringPropertyNames() 获取Properties对象的所有值
		 * */
		
		
		Properties p = new Properties();
		Object value = p.setProperty("亚索", "男");
		System.out.println(value);
		
		value = p.setProperty("亚索", "女");
		System.out.println(value);
		
		p.setProperty("永恩", "男");
		String str = p.getProperty("永恩");
		System.out.println(str);
		
		Set<String> sets = p.stringPropertyNames();
		System.out.println(sets);
	}
}

 创建属性文件

(1)属性文件一般放置在src根目录下,属性文件的后缀名.properties

(2)属性文件中,每一行只能写一个key=value,而且不需要任何的符合来修饰

public class Demo12 {
	public static void main(String[] args) {
        // class对象的getResourceAsStream()可以从classpath中读取指定资源;
		try {
			InputStream is = Demo12.class.getResourceAsStream("/config.properties");
			Properties p = new Properties();

            // 通过p对象加载*.properties文件
			p.load(is);

            //获取p对象中的所有键
			Set<String> keySet = p.stringPropertyNames();

            //声明一个迭代器对象进行内容的遍历
			Iterator iterator = keySet.iterator();
			while(iterator.hasNext()) {
				String strkey = (String)iterator.next();
				String value = p.getProperty(strkey, "1111");
				System.out.printf("【%s】的值是【%s】\n",strkey,value);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

四、Files工具类

1、按行读取指定文件内容

List<String> list = Files.readAllLines(Paths.get(URL url));

public class Demo13 {
	public static void main(String[] args) {
		// 字符形式读取文件内容
		// readAllLines 按行读取指定文件内容
		try {
			List<String> slist = Files.readAllLines(Paths.get("E:\\javaee2307IO\\stu.txt"));
			for(String s : slist) {
				System.out.println(s);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

2、读取文件中的所有字节

byte[] b = Files.readAllBytes(Paths.get(URL url));

public class Demo14 {
	public static void main(String[] args) {
		try {
			byte[] b = Files.readAllBytes(Paths.get("E:\\javaee2307IO\\test.txt"));
			for(int i = 0;i < b.length;i++) {
				System.out.println((char)b[i]);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

3、写入字节到指定的路径

Path write(Path path,List<String> list)

public class Demo16 {
	public static void main(String[] args) {
		//files工具类写字符操作
		//Path write(Path path,List<String> list)写入字节到指定的路径	
		try {
			List<String> list = Arrays.asList("你的剑还是你的剑,疾风亦有归途");
			Files.write(Paths.get("E:\\javaee2307IO\\index.txt"),list);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		try {
			//写字节操作
			byte[] b = "死亡如风,常伴吾身".getBytes();
			Files.write(Paths.get("E:\\javaee2307IO\\indef.txt"),b);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

五、walkFileTree遍历文件

public class Demo17 {
	public static void main(String[] args) throws IOException {
		// walkFileTree(Path start,FileVisitor<? super Path> visitor)
		//参数1:path类型的根目录路径
		//参数2:FileVisitor接口的实现类,封装对文件或者目录访问的逻辑
		
		String path = "E:\\javaee2307IO";
		Files.walkFileTree(Paths.get(path), new SimpleFileVisitor<Path>() {
		
		//读文件夹,先读目录
		@Override	
		public FileVisitResult  preVisitDirectory(Path dir,BasicFileAttributes attrs) throws IOException{
				File f = dir.toFile();
				System.out.printf("目录的姓名为【%s】\n",f.getName());
				return FileVisitResult.CONTINUE;
				
		}
		//读文件夹,后读文件夹
//		@Override
//		public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException{
//			File f = dir.toFile();
//			System.out.printf("目录的姓名为【%s】\n",f.getName());
//			return FileVisitResult.CONTINUE;
//			
//		}
		
		//读文件,并输出文件名称
		@Override
		public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException{
			File f = file.toFile();
			System.out.printf("文件名为【%s】大小为%s\n",f.getName(),f.length());
			return FileVisitResult.CONTINUE;
			
		}
			
		});
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值