指定编码格式输入输出文本
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对象
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();