字符流
使用字节输入流去读包含中文的文件
public class Demo01FileInputStream {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("day15\\c.txt");
int len = 0;
while ((len = fis.read())!=-1){
System.out.print((char)len);
}
fis.close();
}
}
字符输入流
java.io.Reader:字符输入流 用于读取字符流的抽象类。 是所有字符输入流最顶层的父类,里边定义了所有字符输入流共性的成员方法,所有的字符输入流都可以使用 共性的成员方法: - public void close() :关闭此流并释放与此流相关联的任何系统资源。 - public int read(): 从输入流读取一个字符。 - public int read(char[] cbuf): 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。 java.io.FileReader:文件字符输入流 extends InputStreamReader(转换流) extends Reader 作用: 把文件以字符的方式读取到内存中 构造方法: FileReader(File file) FileReader(String fileName) 参数:传递要读取的数据源 File file:数据源是一个文件 String fileName:数据源是一个文件路径
public class Demo02Reader {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("day15\\c.txt");
char[] chars = new char[1024];
int len = 0;
while ((len =fr.read(chars))!=-1){
System.out.println(new String(chars,0,len));
}
fr.close();
}
}
字符输出流
java.io.Writer:字符输出流 写入字符流的抽象类。 是所有字符输出流最顶层的父类,里边定义字符输出流共性的成员方法,所有的字符输出流都可以使用 共性的成员方法: - public abstract void close() :关闭此输出流并释放与此流相关联的任何系统资源。 - public abstract void flush() :刷新此输出流并强制任何缓冲的输出字符被写出。 - public void write(int c) :写出一个字符。 - public void write(char[] cbuf):将cbuf.length字符从指定的字符数组写出此输出流。 - public abstract void write(char[] b, int off, int len) :从指定的字符数组写出 len字符,从偏移量 off开始输出到此输出流。 - public void write(String str) :写出一个字符串。 - void write(String str, int off, int len) 写入字符串的某一部分。 java.io.FileWriter:文件字符输出流 extends OutputStreamWriter(转换流) extends Writer 作用: 把内存中的字符,写入到文件中 构造方法: FileWriter(File file) FileWriter(String fileName) 参数:写入数据的目的地 File file:目的地是一个文件 String fileName:目的地是一个文件路径 构造方法的作用: 1.创建FileWriter对象 2.会根据构造方法中传递的文件|文件的路径,创建一个新的空白的文件 3.会把FileWriter对象,指向空白的文件
public class Demo01Writer {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("day15\\d.txt");
fw.write(100);
fw.close();
}
}
关闭和刷新的区别
public class Demo02Writer {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("day15\\e.txt");
fw.write(65);
fw.write(66);
fw.flush();
fw.write(67);
fw.close();
fw.write(68);
}
}
字符输出流写数据的其他方法
public class Demo03Writer {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("day15\\f.txt");
char[] chars = {'a','b','c','1','2','3','中','国'};
fw.write(chars);
fw.write(chars,6,2);
fw.write("我是一个中国人,我骄傲!");
fw.write("我是一个中国人,我骄傲!",0,7);
fw.close();
}
}
字符输出流的续写和换行
public class Demo04Writer {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("day15\\g.txt",true);
for (int i = 1; i <= 10; i++) {
fw.write("hello"+i+"\r\n");
}
fw.close();
}
}
IO资源的处理
jdk7前异常处理
public class Demo01JDK7Before {
public static void main(String[] args) {
FileInputStream fis= null;
try {
fis = new FileInputStream("day15\\1.txt");
int len = 0;
while ((len = fis.read())!=-1){
System.out.println((char)len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fis!=null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
JDK7后异常处理(重点)
public class Demo02JDK7After {
public static void main(String[] args) {
try(
FileInputStream fis = new FileInputStream("day15\\a.txt");
FileOutputStream fos = new FileOutputStream("day15\\copya.txt");
){
byte[] bytes = new byte[1024];
int len = 0;
while ((len = fis.read(bytes))!=-1){
fos.write(bytes,0,len);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
Properties集合(重点)
Properties集合的基本使用
public class Demo01Properties {
public static void main(String[] args) {
show01();
}
private static void show01() {
Properties prop = new Properties();
prop.setProperty("迪丽热巴","168");
prop.setProperty("古力娜扎","165");
prop.setProperty("赵丽颖","160");
prop.setProperty("唐嫣","172");
Set<String> set = prop.stringPropertyNames();
for (String key : set) {
String value = prop.getProperty(key);
System.out.println(key+"\t"+value);
}
}
}
Properties集合中的store方法
private static void show02() throws IOException {
Properties prop = new Properties();
prop.setProperty("迪丽热巴","168");
prop.setProperty("古力娜扎","165");
prop.setProperty("赵丽颖","160");
prop.setProperty("唐嫣","172");
prop.store(new FileOutputStream("day15\\prop1.txt"),"save data");
prop.store(new FileWriter("day15\\prop2.txt"),"save data");
prop.store(new FileWriter("day15\\prop.properties"),"save data");
}
Properties集合中的load方法
private static void show03() throws IOException {
Properties prop = new Properties();
prop.load(new FileReader("day15\\prop.properties"));
Set<String> set = prop.stringPropertyNames();
for (String key : set) {
String value = prop.getProperty(key);
System.out.println(key+"\t"+value);
}
}
ResourceBundle工具类(重点)
前面我们了解了Properties工具类,它能够读取资源文件,当资源文件是以.properties结尾的文件时,
我们可以使用JDK提供的另外一个工具类ResourceBundle来对文件进行读取,使得操作更加简单。
ResourceBundle类对象的创建
public class Demo01ResourceBundle {
public static void main(String[] args) {
ResourceBundle prop = ResourceBundle.getBundle("prop");
System.out.println(prop);
}
}
ResourceBundle类中的getString方法
public class Demo02ResourceBundle {
public static void main(String[] args) {
ResourceBundle bundle = ResourceBundle.getBundle("prop");
String v1 = bundle.getString("tangyan");
System.out.println("v1:"+v1);
System.out.println("----------------------------------");
ResourceBundle bundle2 = ResourceBundle.getBundle("data");
String username = bundle2.getString("username");
System.out.println(username);
String password = bundle2.getString("password");
System.out.println(password);
}
}
打印流
基本使用
public class Demo01PrintStream {
public static void main(String[] args) throws FileNotFoundException {
PrintStream ps = new PrintStream("day15\\1.txt");
ps.write(97);
ps.println(97);
ps.println('@');
ps.println(true);
ps.println(1.1);
ps.println("aaa");
ps.close();
}
}
修改输出语句的目的地为打印流的目的地
public class Demo02PrintStream {
public static void main(String[] args) throws FileNotFoundException {
System.out.println("输出语句的目的地是在控制台输出!");
PrintStream ps = new PrintStream("day15\\2.txt");
System.setOut(ps);
System.out.println("输出语句的内容写到PrintStream的目的地2.txt中");
}
}
总结
字符流和字节流的区别
1.字节流读取的和写入都是字节;字符流读取的和写入的都是字符
2.所有的数据(文本,音乐,视频,图片…),都是以字节的方式存储的,使用字节流可以读写任意的文件
3.使用字节流读取的文件中包含中文,如果一次读取一个字节(1/2GBK,1/3UTF-8个中文),使用起来不方便
4.使用字符流读取含有中文文本文件,一次读取一个字符(中文,英文,数字,符号…),使用起来很方便
什么时候使用字符流:读写文本文件(使用记事本打开能看懂)
什么时候使用字节流:读写非文本文件(图片,视频,音频…)
|