网站首页 > java教程 正文
Java 17 I/O StringWriter 篇
本篇主要来说说 StringWriter、PrintWriter。
他们都是来自模块 java.base 中的包 java.io
都是继承自 java.io.Writer 的子类。主要是用来做输出流。
StringWriter
在字符串缓冲区中缓存其输出的字符流,然后可用于构造字符串。 因为该类的 close 是个空方法,并没有任何的实现,所以关闭 StringWriter 无效。 可以在流关闭后调用此类中的方法,而不会生成 IOException。 多数的情况下是处理字符串的, 而不是为了存取到文件中。
该类的定义:
public class StringWriter extends Writer
构造器
构造函数 | 描述 |
StringWriter() | 使用默认的初始字符串缓冲区大小创建一个新的字符串编写器。 |
StringWriter(int initialSize) | 使用指定的初始字符串缓冲区大小创建一个新的字符串编写器。 |
分别的创建方法为, 默认无参
StringWriter output = new StringWriter();
带有初始化缓存的构造函数
StringWriter output = new StringWriter(int initialSize);
StringWriter 方法
如何使用
try (StringWriter stringWriter = new StringWriter()) {
String str = "苗子";
stringWriter.write(str);
stringWriter.append(',');
CharSequence cs = "说全栈之 Java 篇。";
stringWriter.append(cs);
StringBuffer stringBuffer = stringWriter.getBuffer();
System.out.println(stringBuffer);
int i = 'A';
stringWriter.write(i);
String str2 = "Java I/O";
stringWriter.write(str2, 0, 4);
char [] c = {'A','C','V','K','O'};
stringWriter.write(c);
stringWriter.write(c, 1, 2);
System.out.println(stringWriter);
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
运行查看效果:
对于该类的使用场景,主要是用于处理字符串流的处理。
PrintWriter
将对象的格式化表示打印到文本输出流。 此类实现了 PrintStream 中的所有打印方法。 它不包含写入原始字节的方法,程序应该使用未编码的字节流。
与 PrintStream 类不同,如果启用了自动刷新,它将仅在调用 println、printf 或 format 方法之一时完成,而不是在碰巧输出换行符时完成。 这些方法使用平台自己的行分隔符概念,而不是换行符。
此类中的方法从不抛出 I/O 异常,尽管它的某些构造函数可能会。 客户端可以通过调用 checkError() 来查询是否发生了任何错误。
这个类总是用字符集的默认替换字符串替换格式错误和不可映射的字符序列。 当需要对编码过程进行更多控制时,应使用 CharsetEncoder 类。
类的定义:
public class PrintWriter extends Writer
构造器
构造器 | 描述 |
PrintWriter(File file) | 使用指定的文件创建一个新的 PrintWriter,而不自动刷新行。 |
PrintWriter(File file, String csn) | 使用指定的文件和字符集创建一个新的 PrintWriter,而不自动刷新行。 |
PrintWriter(File file, Charset charset) | 使用指定的文件和字符集对象创建一个新的 PrintWriter,而不自动刷新行。 |
PrintWriter(OutputStream out) | 从现有的 OutputStream 创建一个新的 PrintWriter,而不自动刷新行。 |
PrintWriter(OutputStream out, boolean autoFlush) | 从现有的 OutputStream 创建一个新的 PrintWriter。根据 autoFlush 刷新缓存区。 |
PrintWriter(OutputStream out, boolean autoFlush, Charset charset) | 从现有的 OutputStream 创建一个新的 PrintWriter。 |
PrintWriter(Writer out) | 创建一个新的 PrintWriter,没有自动行刷新。 |
PrintWriter(Writer out, boolean autoFlush) | 创建一个新的 PrintWriter。 |
PrintWriter(String fileName) | 使用指定的文件名创建一个新的 PrintWriter,而不自动刷新行。 |
PrintWriter(String fileName, String csn) | 使用指定的文件名和字符集创建一个新的 PrintWriter,而不自动刷新行。 |
PrintWriter(String fileName, Charset charset) | 使用指定的文件名和字符集创建一个新的 PrintWriter,而不自动刷新行。 |
其中 csn 是一个字符集的字符串。并且该类中有一个私有方法,根据 csn 字符串转换成对应的 Charset 字符集。
private static Charset toCharset(String csn) throws UnsupportedEncodingException
{
Objects.requireNonNull(csn, "charsetName");
try {
return Charset.forName(csn);
} catch (IllegalCharsetNameException|UnsupportedCharsetException unused) {
throw new UnsupportedEncodingException(csn);
}
}
方法如下:
如何使用
因为构造函数,支持 File、Writer、以及 OutputStream,并且也支持一个字符串的 file 路径。
上节说过 FileWriter 。这就使用该类进行演示。
//创建一个 FileWriter 对象
FileWriter fileWriter = new FileWriter("test1.txt");
// 创建一个 PrintWriter对象
PrintWriter printWriter = new PrintWriter(fileWriter);
PrintWriter printWriter2 = new PrintWriter(fileWriter, boolean);
当然也可以使用 OutputStream 对象
// 创建一个 FileOutputStream 对象
FileOutputStream fileOutputStream = new FileOutputStream("test2.txt");
PrintWriter printWriter1 = new PrintWriter(fileOutputStream);
PrintWriter printWriter2 = new PrintWriter(fileOutputStream, boolean);
PrintWriter printWriter3 = new PrintWriter(fileOutputStream, boolean, charset);
同样 File 对象也一样。
new PrintWriter(new File("test3.txt"));
new PrintWriter(new File("test4.txt"), "UTF-8");
new PrintWriter(new File("test5.txt"), Charset.forName("UTF-8"));
String 路径的方式也有三种方式:
new PrintWriter("test6.txt");
new PrintWriter("test7.txt", "UTF-8");
new PrintWriter("test8.txt", Charset.forName("UTF-8"));
Writer 的使用方法
对于 String 和 File 对象而言。使用方式和上面一致。不再单独演示,自己尝试一下。 才能知道遇到的问题。 实践出真知。
感谢您的阅读。关注, 点赞,收藏。
猜你喜欢
- 2024-11-27 正确理解和使用JAVA中的字符串常量池
- 2024-11-27 面试Java岗 Integer和String必问知识点,你必须精通
- 2024-11-27 JAVA基础&String&StringBuffered&StringBuilder
- 2024-11-27 高端面试必备:一个Java对象占用多大内存?
- 2024-11-27 Java基础类String学习分析
- 2024-11-27 懵了!面试官问我:String 长度有限制吗?是多少?
- 2024-11-27 扒开外衣仔细分析:String为什么不可变
- 2024-11-27 对象的内存布局,怎样确定对象的大小
- 2024-11-27 「Java技术探索」带你进入String类的易错点和底层本质分析
- 2024-11-27 面试中被问到HashMap的结构,1.7和1.8有哪些区别,彻底懵了
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)