一、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;
}
});
}
}