(二) 文本输入与输出
指定编码格式输入输出文本
InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "utf-8"); int b; StringBuilder sb = new StringBuilder(); while((b=isr.read()) != -1){ sb.append((char)b); } String str = sb.toString(); isr.close(); BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file), "utf-8")); String line = null; while((line=in.readLine()) != null){ System.out.println(line); } OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(file, true), "utf-8"); osw.write("在文本后追加文字"); osw.close();?
通过读入器或写出器 FileReader和FileWriter来读写,但要注意编码格式,InputStreamReader中的方法getEncoding()是指创建时默认或指定的字符编码。
e.g.新建写出器FileWriter
FileWriter out = new FileWriter("output.txt"); //等同于 FileWriter out = FileWriter(new FileOutputStream("output.txt"));?
1.写出文本输出
对于文本的输出可能希望使用PrintWriter,PrintWriter该类拥有以文本格式打印字符串和数字的方法,也可以将PrintWriter链接到FileWriter的方法
//该构造使用默认的字符编码 PrintWriter out = new PrintWriter("output.txt"); //等同于 PrintWriter out = new PrintWriter(new FileWriter("output.txt"));?
使用与System.out相同的方法print,println和printf来打印数字、字符、boolean值、字符串和对象。
e.g.通过PrintWriter进行打印
String name = "the name string";double number = 123;out.print(name)
?
(1)println方法在行末添加对目标系统来说恰当的换行符(windows "\r\n" ,Unix "\n")
(2)设置写出器为自动清空模式,那么只要println被调用,缓冲区中所有的字符都会被发送到它们的目的地。默认情况下,自动清空机制是不使用的。通过设置PrintWriter(Writer out, Boolean autoFlush)
e.g.PrintWriter out = new PrintWriter(new FileWriter("file.txt"), true);??? \\auto flush
(3)print方法不抛出异常,可以通过调用checkError方法来查看流是否出现了某些错误。
???
2.读入文本输入
以二进制格式写出数据,使用DataOutputStream;以文本格式写出数据,使用PrintWriter
e.g.通过BufferedReader类的nextLine方法读入一行文本
BufferedReader in = new BufferedReader(new FileReader(file)); String line; while((line=in.readLine()) != null){ ... ... }
?
BufferedReader没有任何用于读入数字的方法,可以使用Scanner来读入文本。
3.文本格式储存对象
可以将对象以文本的形式存储(csv ,号)
File file = new File(System.getProperty("user.dir") + "\\conf\\stream\\saveByCsv.csv"); PrintWriter out = new PrintWriter(file); out.println("1|a|一"); out.println("2|b|二"); out.println("3|c|三"); out.println("4|d|四"); out.close(); Scanner in = new Scanner(new FileReader(file)); while(in.hasNextLine()){ // | 在正则里有特殊用法需要转义 String[] line = in.nextLine().split("\\|"); ... ... } in.close();?
4.字符集
Java SE 1.4中引入java.nio包用引入的Charset类统一对字符集的转换
字符集建立了两字节Unicode码元序列与使用本地字符编码方式的字符序列之间的映射。ISO-8859-1是最流行的字符编码之一,是一种对Unicode前256个字符进行单字节编码的方式。
Charset类使用的是IANA字符集注册中心标准化字符集名称。
(1)通过调用静态的forName方法来获得一个Charset,需要传递一个官方名称或别名,字符集名称大小写不敏感,每个字符集可以拥有许多别名。
Charset cset = Charset.forName("ISO-8859-1");
?
(2)aliases方法返回别名构成的Set对象
Set<String> aliases = cset.aliases(); for(String alias : aliases){ System.out.println(alias); }
?
(3)availableCharsets方法获取所有可用字符集
Map<String, Charset> charsetMap = Charset.availableCharsets(); for(String name : charsetMap.keySet()){ System.out.println(name); }?
(4)本地编码方式模式不能表示所有Unicode字符,如果某个字符不能表示,将转换成?
(5)编码encode
String str = "汉字~~"; ByteBuffer bbuf = cset.encode(str); byte[] bytes = bbuf.array();?
(6)解码decode
ByteBuffer bbuf = ByteBuffer.wrap(bytes, 0, bytes.length); CharBuffer cbuf = cset.decode(bbuf) String str = cbuf.toString();?
?