指定编码格式输入输出文本
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();// 常用输出方式PrintWriter out = null;try { out = new PrintWriter(new OutputStreamWriter(new FileOutputStream("C:\\Users\\sgq0085\\Desktop\\tmp.txt", false), "GBK")); out.println("汉字测试"); out.println("中文测试"); out.println("English");} catch (Exception e) { logger.error("Error {} ", e);} finally { IOUtils.closeQuietly(out);}
通过读入器或写出器 FileReader和FileWriter来读写,但要注意编码格式,InputStreamReader中的方法getEncoding()是指创建时默认或指定的字符编码。 e.g.新建写出器FileWriter
FileWriter out = new FileWriter("output.txt"); //等同于 FileWriter out = new 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对象
Setaliases = cset.aliases(); for(String alias : aliases){ System.out.println(alias); }
(3)availableCharsets方法获取所有可用字符集
MapcharsetMap = 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();