Java基础-IO (6)

write(String str,int off,int len)

public void write(String str,int off,int len) throws IOException 写入字符串的某一部分。 参数: str - 字符串 off - 相对初始写入字符的偏移量 len - 要写入的字符数 抛出: IndexOutOfBoundsException - 如果 off 或 len 为负,或者 off+len 为负或大于给定字符串的长度 IOException - 如果发生 I/O 错误

flush()

public abstract void flush() throws IOException 刷新该流的缓冲。如果该流已保存缓冲区中各种 write() 方法的所有字符,则立即将它们写入预期目标。然后,如果该目标是另一个字符或字节流,则将其刷新。因此,一次 flush() 调用将刷新 Writer 和 OutputStream 链中的所有缓冲区。 如果此流的预期目标是由底层操作系统提供的一个抽象(如一个文件),则刷新该流只能保证将以前写入到流的字节传递给操作系统进行写入,但不保证能将这些字节实际写入到物理设备(如磁盘驱动器)。 抛出: IOException - 如果发生 I/O 错误 输出字符流使用流程

输出流往往和某些数据的目标媒介相关联,比如文件,网络连接,管道等,如下将字符串apache写入当前项目data目录下的output.txt文件

package com.molyeo.java.io; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.FileWriter; import java.io.IOException; /** * Created by zhangkh on 2018/8/5. */ public class CharacterBasedWriter { static Logger logger = LoggerFactory.getLogger(CharacterBasedWriter.class.getName()); public static void main(String[] args) throws IOException { File path = new File("."); File file = new File(path, "data/output.txt"); logger.info(file.getAbsolutePath()); write(file, "apache"); } public static void write(File file, String content) throws IOException { try (FileWriter output = new FileWriter(file)) { output.write(content); output.flush(); } } }

示例中以文件作为参数构造实例FileWriter,将会新写入的内容将会覆盖原文件。
以下的构造函数取文件名和一个布尔变量作为参数,布尔值表明你是想追加还是覆盖该文件。例子如下:

Writer writer = new FileWriter(file, true); //appends to file Writer writer = new FileWriter(file, false); //overwrites file

调用write方法写入具体的值,调用flush接口刷新缓冲区,将数据流传递给操作系统进行写入。
需要注意的是,上述输出的内容编码格式为UTF8,如果要输出其他编码格式,和Reader一样,要利用字节流,然后转换为字符流后以便于操作。

OutputStream outputStream = new FileOutputStream(file,charsetName); Writer writer = new OutputStreamWriter(outputStream); writer.write("apache"); writer.close(); 字节流和字符流转换

输入字节流转换
InputStreamReader是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集,即UTF-8编码。
InputStreamReader的构造函数输入字节流

public InputStreamReader(InputStream in) { super(in); try { sd = StreamDecoder.forInputStreamReader(in, this, (String)null); // ## check lock object } catch (UnsupportedEncodingException e) { // The default encoding should always be available throw new Error(e); } }

通过调用StreamDecoder类的forInputStreamReader方法,设置var2为null

public static StreamDecoder forInputStreamReader(InputStream var0, Object var1, String var2) throws UnsupportedEncodingException { String var3 = var2; if(var2 == null) { var3 = Charset.defaultCharset().name(); } try { if(Charset.isSupported(var3)) { return new StreamDecoder(var0, var1, Charset.forName(var3)); } } catch (IllegalCharsetNameException var5) { ; } throw new UnsupportedEncodingException(var3); }

进而调用类Charset的defaultCharSet方法,设置编码格式为UTF-8。

public static Charset defaultCharset() { if (defaultCharset == null) { synchronized (Charset.class) { String csn = AccessController.doPrivileged( new GetPropertyAction("file.encoding")); Charset cs = lookup(csn); if (cs != null) defaultCharset = cs; else defaultCharset = forName("UTF-8"); } } return defaultCharset; }

其他指定编码格式的构造函数如下:

public InputStreamReader(InputStream in, String charsetName) throws UnsupportedEncodingException public InputStreamReader(InputStream in, Charset cs) public InputStreamReader(InputStream in, CharsetDecoder dec)

每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。
为了达到最高效率,可要考虑在BufferedReader内包装InputStreamReader。例如:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwjswp.html