io学习五

FileWriter##

处理文件都会碰到的一个问题是,当前写入的数据是覆盖原文件内容还是追加到文件末尾。当你创建一个FileWriter之后,你可以通过使用不同构造函数实现你的不同目的。
以下的构造函数取文件名作为参数,将会新写入的内容将会覆盖该文件:
查看源代码打印帮助

Writer writer = new FileWriter("c:\data\output.txt");

以下的构造函数取文件名和一个布尔变量作为参数,布尔值表明你是想追加还是覆盖该文件。例子如下:

Writer writer = new FileWriter("c:\data\output.txt", true); //appends to file
Writer writer = new FileWriter("c:\data\output.txt", false); //overwrites file

同样,FileWriter不能指定编码,可以通过OutputStreamWriter配合FileOutputStream替代FileWriter。

io中的其他字节流##

本小节会简要概括Java IO中的PushbackInputStream,SequenceInputStream和PrintStream。其中,最常用的是PrintStream,System.out和System.err都是PrintStream类型的变量.

SequenceInputStream####

SequenceInputStream把一个或者多个InputStream整合起来,形成一个逻辑连贯的输入流。当读取SequenceInputStream时,会先从第一个输入流中读取,完成之后再从第二个输入流读取,以此推类。代码如下:

InputStream input1 = new FileInputStream("c:\data\file1.txt");
InputStream input2 = new FileInputStream("c:\data\file2.txt");
InputStream combined = new SequenceInputStream(input1, input2);

通过SequenceInputStream,例子中的2个InputStream使用起来就如同只有一个InputStream一样(译者注:SequenceInputStream的read()方法会在读取到当前流末尾时,关闭流,并把当前流指向逻辑链中的下一个流,最后返回新的当前流的read()值)。

组合超过两个InputStream#####

您可以InputStream通过SequenceInputStream 两种方式组合两个以上的实例。第一种方法是把所有的InputStream实例放到一个Vector,并将其传递Vector给SequenceInputStream构造函数。以下是传递Vector给SequenceInputStream构造函数的示例:

InputStream input1 = new FileInputStream(“c:\ data \ file1.txt”);
InputStream input2 = new FileInputStream(“c:\ data \ file2.txt”);
InputStream input3 = new FileInputStream(“c:\ data \ file3.txt”);

streams <inputStream> streams = new Vector <>();
streams.add(输入1);
streams.add(输入2);
streams.add(输入3);

SequenceInputStream sequenceInputStream =
    新的SequenceInputStream(streams.elements()))
    
int data = sequenceInputStream.read();
while(data!= -1){
    的System.out.println(数据);
    data = sequenceInputStream.read();
}
sequenceInputStream.close();

第二种方法是将InputStream实例二和二组合成SequenceInputStream 实例,然后再将它们与另一个组合SequenceInputStream。以下是将多个InputStream实例与多个SequenceInputStream实例结合在一起:

SequenceInputStream sequenceInputStream1 =
        新的SequenceInputStream(input1,input2);

SequenceInputStream sequenceInputStream2 =
        新的SequenceInputStream(input3,input4);

SequenceInputStream sequenceInputStream =
    新的SequenceInputStream(
            sequenceInputStream1,sequenceInputStream2)){

int data = sequenceInputStream.read();
while(data!= -1){
    的System.out.println(数据);
    data = sequenceInputStream.read();
}
sequenceInputStream.close();
关闭SequenceInputStream######

当你完成阅读数据后,SequenceInputStream你应该记得关闭它。关闭一个SequenceInputStream还将关闭正在读取的InputStream实例 SequenceInputStream。

关闭一个SequenceInputStream是通过调用它的close()方法来完成的。以下是关闭SequenceInputStream外观的方法:

sequenceInputStream.close();

您还可以使用Java 7中引入的try-with-resources结构。以下是如何使用SequenceInputStreamtry-with-resources构造来使用和关闭外观:

InputStream input1 = new FileInputStream(“c:\ data \ file1.txt”);
InputStream input2 = new FileInputStream(“c:\ data \ file2.txt”);

try(SequenceInputStream sequenceInputStream =
    新的SequenceInputStream(input1,input2)){

    int data = sequenceInputStream.read();
    while(data!= -1){
        的System.out.println(数据);
        data = sequenceInputStream.read();
    }
}

注意不再有任何明确的close()方法调用。try-with-resources构造负责处理。

还要注意,FileInputStreamtry-with-resources块中没有创建两个实例。这意味着try-with-resources块不会自动关闭这两个FileInputStream实例。但是,当SequenceInputStream关闭它也将关闭InputStream它读取的实例,所以FileInputStream 当关闭时,两个实例将SequenceInputStream被关闭。

PrintStream##

PrintStream允许你把格式化数据写入到底层OutputStream中。比如,写入格式化成文本的int,long以及其他原始数据类型到输出流中,而非它们的字节数据。代码如下:

PrintStream printStream = new PrintStream(outputStream);

printStream.print(true);
printStream.print((int)123);
printStream.print((float)123.456);

printStream.close();

这个例子首先创建一个PrintStream连接到一个OutputStream。其次,该示例打印三个primitivate值PrintStream。第三,这个例子关闭了PrintStream。

所述的实例化OutputStream该PrintStream写入是为了简洁的例子的遗漏。在PrintStream一些构造函数,使您的多种选择将其连接到一个File,一个OutputStream等。

System.out和System.err是PrintStreams####

你可能熟悉这两个著名PrintStream的Java实例:System.out和 System.err。如果您已经使用了这两个流中的任何一个,那么您已经使用了PrintStream。
Java的PrintStream类包含强大format()和printf() 方法(他们这样做完全一样的,但名字的“printf”更熟悉的C-程序员)。这些方法允许您使用格式化字符串以非常先进的方式混合文本和数据。

PrintStream output = new PrintStream(outputStream);
output.print(true);
output.print((int) 123);
output.print((float) 123.456);
output.printf(Locale.UK, "Text + data: %1$", 123);
output.close();

最后使用完成之后记得关闭流!!

Java IO: 其他字符流#

本小节会简要概括Java IO中的PushbackReader,LineNumberReader,StreamTokenizer,PrintWriter,StringReader,StringWriter。

LineNumberReader##

这个输入流可以获取当前读取的行号通过getLineNumber()方法获取当前行号(通过setLineNumber()方法设置当前行数,setLineNumber()仅仅改变LineNumberReader内的记录行号的变量值,不会改变当前流的读取位置。流的读取依然是顺序进行,意味着你不能通过setLineNumber()实现流的跳跃读取)
这个类的应用场景是 ,当解析一段可能有错误的文本时候
如果解析的文本有错误,LineNumberReader可以很方便地定位问题。当你把错误报告给用户时,如果能够同时把出错的行号提供给用户,用户就能迅速发现并且解决问题。

链接:http://ifeve.com/java-io-other/

StreamTokenizer应用场景:1用于统计文件中的字符2.acm编程中输入操作(效率高)
http://blog.csdn.net/zhouhong1026/article/details/7885114

原文地址:https://www.cnblogs.com/joeCqupt/p/6889040.html