(二) 文本输入与输出

指定编码格式输入输出文本

    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();

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值