读书人

(2) 文本输入与输出

发布时间: 2012-12-21 12:03:49 作者: rapoo

(二) 文本输入与输出

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

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

?

读书人网 >编程

热点推荐