流与文件

InputStream,OutputStream,Reader和Writer,
四个抽象类构成了流类动物园,
流过滤器的分层,只需要在构造器中给出文件名或者文件的具体路径名即可:
    FileInputStream fin = new FileInputStream("employee.dat");
因为反斜线符在Java字符串中作为转义符使用,所以要在Windows格式的路径名中
使用\\作为路径分隔符("C:\\Windows\\win.ini")。在Windows系统中,也可以
使用单独的正斜线符号("C:/Windows/win.ini"),这是因为大多数Windows文件
处理系统将正斜线符号作为文件分隔符。为了程序的可移植性,应该使用正确的
文件分隔符。对应的文件分隔符存放在常量字符串File.separator中。
也可以使用一个File对象
    File f = new File("employee.dat");
    FileInputStream fin = new FileInputStream(f);
与抽象类的InputStream 和OutputStream类似,这些类只有在字节层次上支持读写。
这意味着,只能从fin对象中读取字节和字节数组。
    byte b = (byte)fin.read();
如果想要对当前目录下的名为employee.dat文件进行缓冲和数据输入操作,就需要
使用下面这种有着奇异顺序的构造器:
    DataInputStream din = new DataInputStream(new BufferedInputStream(new FileInputStream("employee.dat")));
如果既想预查看,又想读入数值,就需要同时使用一个pushback输入流和一个数据
输入流引用。
    DataInputStream din = new DataInputStream(
        pbin = new PushbackInputStream(
            new BufferedInputStream(
                new FileInputStream("employee.dat")
            )
        )
    )
ZipInputStream zin = new ZipInputStream(new FileInputStream("employee.zip"))
    DataInputStream din = new DataInputStream(zin);
    
Java使用的是Unicode字符,
InputStreamReader类可将那些字节采用的特殊字符编码方案的输入流转换成发布Unicode字符的reader.
同样地,OutputStreamWriter类能把Unicode字符流转换成采用特殊字符编码方案的字节流。
    在Windows中,它使用ISO 8859-1编码(也被叫做ISO Latin-1;有些程序员也称它为"ANSIA"代码),
可以在构造器中特别指定选择不同的编码。
    InputStreamReader in = new InputStreamReader(new FileInputStream("kremlin.dat"),"ISO8859_5")
    FileWriter out = new FileWriter("output.txt");
相当于
    FileWriter out = new FileWriter(new FileOutputStream("output.txt"));
每个Java版本都必须拥有的字符编码。
    字符集标准名字                遗留的名字            描述
    US-ASCII                    ASCII                美国信息交换标准码
    ISO-8859-1                    ISO08859-1            ISO 8859-1,Latin alphabet No.1
    UTF-8                        UTF8                8位Unicode转换格式
    UTF-16                        UTF-16                16位Unicode转换格式,通过可选的初始化字节顺序标志
                                                    指定字节顺序
    UTF-16BE                    UnicodeBigUnmarked    16位Unicode转换格式,高位字节顺序
    UTF-16LE                    UnicodeLittleUnmarked 16位Unicode转换格式,低位字节顺序
    扩展的字符编码
    GBK                            GBK                    GBK,Simplified Chinese
    Shift_JIS                    SJIS                Shift-JIS,Japanese

    windows-31j                    MS932                Windows Japanese


文本输出
    进行文本输出时,应该使用PrintWriter.print writer可以以文本格式打印字符串和数值。
与DataOutputStream类似,尽管提供了一些很有用的输出方法,但却没有定义目的地,一个
PrintWriter必须与一个目标writer相结合。
    PrintWriter out = new PrintWriter(new FileWriter("employee.txt"));
PrintWriter out = new PrintWriter(new FileOutputStream("employee.txt"));
PrintWriter(OutputStream)构造器自动增加一个OutputStreamWriter来将Unicode字符转换为
流内字节。
    println方法自动添加目标系统的正确行结束字符(在Windows中是"\r\n",在UNIX上是"\n",在Macs上是"\r").
调用System.getProperty("line.separator")可获得该字符串。
    如果writer被设为自动刷新模式(autoflush mode),任何时候调用println,缓冲区内的所有字符都会被
送到其目的地.(print writer总是缓冲的。)默认情况下,自动刷新不开启。可以使用PrintWriter(Writer,boolean)
构造器并使用适当的布尔值作为第二参数来开启或关闭自动刷新
    PrintWriter out = new PrintWriter(new FileWriter("employee.txt"),true)
当以二进制格式写入数据时,应当使用DataOutputStream
当以文本格式写入数据时,应当使用PrintWriter.
    在JDK 5.0以前,唯一用来处理文本输入的是BufferedReader,在这个类中有一个readLine方法,它能以
行的方式读取文本,并需要将一个缓冲的读取器同一个输入源结合起来。
    BufferedReader in = new BufferedReader(new FileReader("employee.txt"));
FileReader类已经把字节转化为Unicode字符。对于其他的输入源,需要使用InputStreamReader,与PrintWriter不同
,InputStreamReader没有包含自动弥补字节和Unicode字符之间差别的方法。
    BufferedReader in2 = new BufferedReader(new InputStreamReader(System.in));
BufferedReader in2 = new BufferedReader(new InputStreamReader(url.openStream));

   
展开阅读全文

没有更多推荐了,返回首页